日付: 2026-10-19 / 担当: Cursor / 基点: develop 657c6ff(作業ツリーは空) 前提: D-165(編集モード)/D-161(プルダウン)/D-162(固定幅・解消日時 12px)/D-171(控えめなカード)/D-180(D-Sec アラート。特に 7b)/指示書AX・AZ/ CLAUDE.md §0-3(日本語フォント)・§6・§7・§9.6(モックが画面の正・JP/EN の器を壊さない)
★行番号はすべて 2026-10-19 に develop 657c6ff で確かめたもの★。同じファイルを上から直すと後ろの行はずれるので、★2つ目以降の場所は引用した文言・クラス名で探し直すこと★。
★本書は「書いてあることを全部やる」前提で、直す場所を1つずつ挙げてある★。「ほかにも同じものがあれば直す」とは書かない — ★見つけたら §2 のルールで直し、作業報告に書く★。
★git add -A・git add . は禁止★(CLAUDE.md §7)。★ファイルパスを1つずつ書く★。★push しない★(§11)。
| # | やること | 種類 | 段階 |
|---|---|---|---|
| 1 | ★解消日時が、下書きで「未解消」「対応中」に戻した行にも出たまま★(エラー一覧・D-Sec)。アラートと同じく下書きも見る。★判定を純粋関数1本にしてテストする★ | 不具合 | 段階1 |
| 2 | アラートの「読み込み中…」と取得失敗の文言が t() を通っていない(EN で日本語のまま) |
不具合 | 段階1 |
| 3 | 対応状況の列の幅がモードの切り替えで変わる → ★3画面ともバッジ・プルダウンを 120px 固定★(アラートの形) | 見た目 | 段階2 |
| 4 | D-Sec の編集モードで、備考の入力欄が右の列に移る → ★左の本文(備考の行の位置)に出す★ | 見た目 | 段階2 |
| 5 | 変えた行の目印が3画面でばらばら → カードの2画面は D-Sec の形(背景 --sf-h+上・右・下の枠 --ac)、エラー一覧(表)は今の形のまま |
見た目 | 段階2 |
| 6 | アラートの「編集」ボタンだけ絞り込みの行の右端・塗りの見た目 → ★見出しの右・エラー一覧 / D-Sec と同じボタン★ | 見た目 | 段階2 |
| 7 | 解消日時の寄せが D-Sec だけ右 → ★3画面とも左寄せ★ | 見た目 | 段階2 |
| 8 | 編集中の絞り込みの薄くし方が3画面でばらばら(エラー一覧は「~」「指定なし(全期間)」が濃いまま) → ★絞り込み全体を 0.5・中の部品すべて禁止カーソル★ | 見た目 | 段階2 |
| 9 | 「編集中は絞り込みとページ送りを使えません」の余白と、失敗件数の置き方がアラートだけ違う → ★D-Sec の .editNotice の形(失敗件数は同じ行)★ |
見た目 | 段階2 |
| 10 | アラートの出発失敗の行のバッジだけ幅が固定されていない(「解消 (日時)」を1つのバッジに入れる作り) → ★事前チェックの行と同じ 120px のバッジ+下に解消日時★ | 見た目 | 段階2 |
| 11 | ★D-Sec の状態ボタンと数値カードの文言をアラート画面に揃える★(ユーザー決定 2026-10-19) | 文言 | 段階3 |
| 12 | ★決定 D-181 を追記★し、docs/code-map.md・docs/spec.md・docs/fixtures.md を追従させる |
資料 | 段階4 |
★変えないもの★: API・データ層・型(app/api/**・lib/db/**・lib/types/**・d-watch-api.yaml)/取得・保存・下書きの ★ロジック★(saveDrafts() 等)/ 3画面の対応状況のバッジとプルダウンの文言「未解消 / 対応中 / 解消」(3画面の STATUS_OPTIONS / RESOLUTION_STATUS_OPTIONS)/D-Sec の数値カードの枚数(3枚)と下の小さい文字(即時対応 / 進行中 / 完了)/ D-Sec の種別のセレクト・副題(D-180 7b)/エラー一覧の列幅(--col-status: 150px ほか。表の最小幅 1130px のまま)/d-watch-mock.jsx。
657c6ff で、エラー一覧の編集中のページ送りのカーソルだけを先に揃えた。657c6ff)★: ★130ファイル / 3,077件 全件通過★(2026-10-19 監督が npx vitest run で実測)。本書の段階1 で6件増える見込み(3,083件)。.test.tsx)はこのリポジトリに無い★(2026-10-19 find で確認)。★画面の文言(「未解消・対応中」「解消」)を固定しているテストも無い★(grep で確認。§7-4)。見た目は ★段階5 の画面確認★ で確かめる。| # | ルール | 本書での当てはめ |
|---|---|---|
| G1 | ★API の挙動が変わったら、d-watch-api.yaml の ★影響を受けるパス・スキーマを全部★ 直す★(指示書に挙がっているものだけでなく)。読み・書き・件数(meta.total)・404 の条件・値の例と説明を、grep で関係する語を探して確かめる |
★本書は API を変えない★(画面の見た目と文言だけ)。/ds-alerts の status の説明「open=未解消・対応中 / resolved=解消」(d-watch-api.yaml:1487)は ★値の意味の説明なので変えない★(ボタンの文言ではない)。YAML に差分が出たら止まって報告 |
| G2 | ★古い挙動を書いた docstring・コメントを残さない★。挙動を変えた関数だけでなく、★その関数・部品を説明している別の場所(ファイル冒頭の説明・CSS のコメント・docs/code-map.md)★も直す |
本書の表の「コメントも直す」を全部やる。特に lib/prechecks/edit-drafts.ts:5(「両画面」→ 3画面)・CSS の「幅は列いっぱい」「右列は固定幅 240」「背景の色だけ」・docs/code-map.md の「一覧の上の『編集』」 |
| G3 | ★テストは「守る挙動が壊れたら落ちる」ように書く★。空同士の比較や、別の理由でも同じ結果になる比較は検査にならない。★書いたら一度わざと壊して赤になるのを確かめ、戻す★(壊した変更はコミットしない) | 段階1 の showsResolvedTime() の表 H1〜H6。★2通りに壊して赤を確かめる★(1-3) |
| G4 | ★決定の記録(docs/decisions.md の「実装の記録」)に、コミット・テスト件数の前後・画面確認の結果(出所つき。CLAUDE.md §6-6)・指示書と違う判断を書く★ |
段階4 の D-181 の「実装の記録」 |
| # | 罠 | どう避けるか |
|---|---|---|
| 3-1 | ★git add -A・git add .★ |
禁止。ファイルパスを1つずつ書く。各コミットの前に git diff --cached --name-status で中身を目で確かめる |
| 3-2 | ★他のセッションの変更を巻き込む★ | ★着手前と各コミットの前に git status --short を見る★。§9 に無いファイルに変更があれば ★他のセッションのもの★。触らない・含めない。★docs/decisions.md は段階4 で末尾に追記するので、追記の前に git diff -- docs/decisions.md が空であることを確かめ、他人の差分があれば止まって報告★ |
| 3-3 | ★CSS の不透明度が二重にかかる★(0.5 × 0.5 = 0.25) | 項8 で新しい規則を足すときは、★古い規則(部品ごとの opacity: 0.5)を必ず消す★(表に「消す」と書いた行) |
| 3-4 | ★background の一括指定で ▼ が消える★ |
.statusSelect の ▼ は background-image。★状態の色は background-color のまま★(既存の注意書き。触らない) |
| 3-5 | ★font-family を宣言する★ |
★宣言しない★(CLAUDE.md §0-3)。ボタンをアラートに写すときも、D-Sec の .editButton 一式には font-family が無いのでそのまま写す |
| 3-6 | ★新しい色を作る★ | ★既存の CSS 変数(--sf-h・--ac・--bd 等)だけ★ |
| 3-7 | ★画面の文言を「その他」っぽく直す・EN を勝手に作る★ | 足す訳は §段階3 の2つだけ(モック d-watch-mock.jsx:140 の対訳) |
| 3-8 | ★ロジックまで直してしまう★ | 取得・保存・下書き・canStartEdit などの条件は変えない。★本書で変える実行行は表に挙げたものだけ★ |
| 3-9 | ★push する★ | ★監督のレビューが終わるまで push しない★ |
.claude/worktrees/ の中ではない)。git log --oneline -1 が 657c6ff(またはその後の docs だけのコミット)であること。git status --short を控える。本書が未追跡で1行あるのはよい(★本書はコミットに含めない★。監督がコミットする)。 ★2026-10-19 の本書作成時点で、他のセッションの docs/handoff/pdf/README.md(変更)・docs/handoff/pdf/*_qa13_pdf.py(未追跡2本)があった★ — ★触らない・含めない★(3-2)。それ以外の見知らぬ行があれば誰のものか確かめてから進む。npx tsc --noEmit -p . → npm run lint → npm test。★テストのファイル数と件数を控える★(期待: 130ファイル / 3,077件)。:3100 を立てたあと、/alerts・/errors・/ds-alerts で次を実行し、値を控える:
// 副題の下端 → 次の要素(数値カード、エラー一覧はカード)の上端
const sub = document.querySelector('[class*="__subtitle"]').getBoundingClientRect().bottom;
const next = document.querySelector('[class*="__statGrid"], [class*="__card"]').getBoundingClientRect().top;
next - sub;★監督の読み(未確認)★: アラートは ★16★(.header の 4px と .subtitle の 16px は、CSS のマージンの相殺で 16px になる)/エラー一覧は 16/D-Sec は 20。 ★アプリ内ブラウザが使えなければ、この測定は飛ばし、2-6c は 16px にする★(作業報告にそう書く)。lib/prechecks/edit-drafts.ts★今の挙動★: エラー一覧(components/features/errors/ErrorsScreen.tsx:611)と D-Sec(components/features/ds-alerts/DsAlertsScreen.tsx:570)は ★保存済みの値(item.resolution_status === "resolved")だけ★を見ている。 解消の行を編集モードで「未解消」「対応中」に変えても、★プルダウンの下に解消日時が出たまま★になる(保存すると解消日時はサーバーが消す — lib/prechecks/status-update.ts:71-75 の「戻すと消す」)。 アラート(components/features/alerts/AlertsScreen.tsx:649)は status === "resolved" && item.resolution_status === "resolved" で下書きも見ている(正しい)。
draftNote()(:35-38)の直後に足す:/**
* 解消日時を出すか(対応状況のバッジ・プルダウンの下)。★保存済みの値が解消で、かつ画面に出す対応状況(下書き優先)も解消のときだけ★
* (指示書BA 項1。D-181)。3画面(エラー一覧・アラート・D-Sec アラート)がこの1本を使う。
* ・★下書きで解消にしただけの行には出さない★(解消日時は保存したときにサーバーが決める)
* ・★保存済みが解消でも、下書きで未解消・対応中に変えた行には出さない★(保存すると解消日時は消える — `status-update.ts` の「戻すと消す」)
*/
export function showsResolvedTime(row: EditableRow, draft: ResolutionDraft | undefined): boolean {
return row.resolution_status === "resolved" && draftStatus(row, draft) === "resolved";
}
:5)を直す(G2)★:
対象はエラー一覧(/errors)とアラート(/alerts)の両画面 — ★両画面がこのモジュールを使う★。対象はエラー一覧(/errors)・アラート(/alerts)・D-Sec アラート(/ds-alerts)の3画面 — ★3画面がこのモジュールを使う★(D-Sec は指示書AX から)。:7 の (P1〜P8 / D1〜D5 / S1〜S3) → (P1〜P8 / D1〜D5 / S1〜S3 / H1〜H6):18 の /** 下書きの対象の行。★\ErrorReportItem` も同じ3つを持つので両画面で使える★ /→/** 下書きの対象の行。★`ErrorReportItem`・`DsAlert` も同じ3つを持つので3画面で使える★ /`lib/prechecks/__tests__/edit-drafts.test.ts(★期待値表を先に★)| # | 行 | 下書き | 期待 | 守るもの |
|---|---|---|---|---|
| H1 | T(解消) | なし | ★出す★ | 通常の解消の行 |
| H2 | T(解消) | { status: "unresolved" } |
★出さない★ | ★項1 の不具合★ |
| H3 | T(解消) | { status: "in_progress" } |
★出さない★ | ★項1 の不具合★ |
| H4 | T(解消) | { note: "x" }(備考だけ) |
★出す★ | 備考だけ変えた解消の行 |
| H5 | R(未解消) | { status: "resolved" } |
★出さない★ | 下書きで解消にしただけ(日時がまだ無い) |
| H6 | S(対応中) | なし | ★出さない★ | 解消でない行 |
(R / S / T はファイル冒頭 :23-25 の既存の行。新しい行は作らない)
:10-20)に showsResolvedTime, を足す(setDraftStatus, の次。アルファベット順の並びは崩してよい — 既存も順不同):4)の (P1〜P8 / D1〜D5 / S1〜S3) → (P1〜P8 / D1〜D5 / S1〜S3 / H1〜H6)★describe("setDraftStatus / setDraftNote / draftNote(D1〜D5)", …)(:52-95)の閉じ }); の直後(describe("saveDrafts(S1〜S3)" の前)に足す:describe("showsResolvedTime(H1〜H6。指示書BA 項1・D-181)", () => {
const cases: [string, EditableRow, ResolutionDraft | undefined, boolean][] = [
["H1 T(解消)・下書きなし → 出す", T, undefined, true],
["H2 T(解消)・下書きで未解消 → 出さない", T, { status: "unresolved" }, false],
["H3 T(解消)・下書きで対応中 → 出さない", T, { status: "in_progress" }, false],
["H4 T(解消)・備考だけ変えた → 出す", T, { note: "x" }, true],
["H5 R(未解消)・下書きで解消 → 出さない(日時はまだ無い)", R, { status: "resolved" }, false],
["H6 S(対応中)・下書きなし → 出さない", S, undefined, false],
];
it.each(cases)("%s", (_label, row, draft, expected) => {
expect(showsResolvedTime(row, draft)).toBe(expected);
});
});
showsResolvedTime() の中身を一時的に return row.resolution_status === "resolved";(=今のエラー一覧・D-Sec の判定)にする → ★H2・H3 が赤★ → 戻すreturn draftStatus(row, draft) === "resolved"; にする → ★H5 が赤★ → 戻す| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 1-4a | components/features/errors/ErrorsScreen.tsx:22-29(import) |
draftNote, draftStatus, saveDrafts, setDraftNote, setDraftStatus, type ResolutionDrafts, |
setDraftStatus, の次の行に showsResolvedTime, を足す(1行増える) |
| 1-4b | components/features/errors/ErrorsScreen.tsx:609-611 |
コメント {/* 解消のときだけ解消日時を下に出す。★保存済みの値(\item`)で判定する★ —/下書きで「解消」を選んだだけではまだ解消日時が無い */}と{item.resolution_status === "resolved" && (` |
コメント(2行)を次の2行に:{/* 解消のときだけ解消日時を下に出す(\showsResolvedTime()`。3画面で同じ)。★下書きで「解消」にしただけの行と、<br> 下書きで未解消・対応中に変えた行には出さない★(指示書BA 項1。D-181) */}<br>条件を{showsResolvedTime(item, draft) && (` に |
| 1-4c | components/features/ds-alerts/DsAlertsScreen.tsx:20-27(import) |
同上 | setDraftStatus, の次の行に showsResolvedTime, を足す |
| 1-4d | components/features/ds-alerts/DsAlertsScreen.tsx:568-570 |
1-4b と同じコメントと {item.resolution_status === "resolved" && ( |
1-4b と同じに直す。★この行は段階2 の 2-4 で動かすので、段階2 では直した後の形のまま動かす★ |
| 1-4e | components/features/alerts/AlertsScreen.tsx:20-27(import) |
同上 | setDraftStatus, の次の行に showsResolvedTime, を足す |
| 1-4f | components/features/alerts/AlertsScreen.tsx:647-649 |
コメント {/* 解消日時は解消のときだけ下に出す(未解消・対応中では何も出さない)。 / ★下書きで解消にしただけの行には出さない★(日時は保存したときにサーバーが決める) */} と {status === "resolved" && item.resolution_status === "resolved" && ( |
条件を {showsResolvedTime(item, draft) && ( に(★意味は同じ★。status は draftStatus(item, draft)(:546))。コメントの末尾に (\showsResolvedTime()`。3画面で同じ。D-181)` を足す。★この箇所は段階2 の 2-10 で書き直すので、そこで最終形にする★ |
t() に通す(項2)| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 1-5a | components/features/alerts/AlertsScreen.tsx:534 |
{loading && <div className={styles.loading}>読み込み中…</div>} |
{loading && <div className={styles.loading}>{t("読み込み中…")}</div>} |
| 1-5b | components/features/alerts/AlertsScreen.tsx:535 |
{!loading && error && <div className={styles.error}>{error}</div>} |
直前の行に {/* サーバーの文言は辞書に無ければ原文のまま */} を足し、{!loading && error && <div className={styles.error}>{t(error)}</div>} にする(エラー一覧 ErrorsScreen.tsx:530-531・D-Sec DsAlertsScreen.tsx:499-500 と同じ) |
読み込み中…(lib/i18n.ts:75)・データの取得に失敗しました(:381)は辞書にある。★足す訳は無い★npx tsc --noEmit -p .・npm run lint・npm test(期待: 130ファイル / 3,083件。件数を控える)git add -- lib/prechecks/edit-drafts.ts lib/prechecks/__tests__/edit-drafts.test.ts \ components/features/errors/ErrorsScreen.tsx components/features/ds-alerts/DsAlertsScreen.tsx \ components/features/alerts/AlertsScreen.tsx git diff --cached --name-status # この5行だけメッセージの例:
fix: 解消の行を下書きで未解消・対応中に戻したら解消日時を隠し、アラートの読み込み中・取得失敗の文言も訳す(指示書BA 項1・2・D-181)★色は既存の CSS 変数だけ・font-family を宣言しない★(3-5・3-6)。★.tsx は表に挙げた箇所だけ★変える。
★基準はアラート★(AlertsScreen.module.css:273-282 の .statusBadgeFixed と :290-309 の .statusSelect。どちらも 120px・同じ高さ)。
| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 2-3a | components/features/errors/ErrorsScreen.module.css:387-395(.statusBadge) |
display: inline-block; font-size: 12px; padding: 4px 14px; border-radius: 6px; font-weight: 600; white-space: nowrap;(幅なし) |
★display: block; box-sizing: border-box; width: 120px; padding: 4px 8px; border: 1px solid transparent; text-align: center; font-size: 12px; border-radius: 6px; font-weight: 600; white-space: nowrap;★。コメント :387 を /* ★通常モードの対応状況(表示だけ。D-165)★ — ★編集モードのプルダウン(.statusSelect)と同じ 120px・同じ高さ★(モードを切り替えても形が変わらない。アラート・D-Sec と同じ。D-181) */ に |
| 2-3b | components/features/errors/ErrorsScreen.module.css:347(.statusSelect の width: 100%;) |
width: 100%; |
width: 120px;。コメント :342 の ★幅は列いっぱいの固定幅★(「対応中」と "In progress" で幅が変わらないように。指示書AW 4-17)。 → ★幅は 120px 固定★(「対応中」と "In progress" で幅が変わらないように。バッジと同じ幅。アラート・D-Sec と同じ。D-181)。 |
| 2-3c | components/features/errors/ErrorsScreen.module.css:247-248(表のコメントの「対応状況 150」) |
対応状況 150 : 見出し EN「STATUS」≒76 / 中身は通常モードがバッジ("In progress" ≒100)、編集モードがプルダウン / (下の \.statusSelect`。列幅いっぱいの固定幅。"In progress" + ▼ ≒110)。★どちらも収まる幅★(D-165)` |
対応状況 150 : 見出し EN「STATUS」≒76 / 中身はバッジ・プルダウンとも 120px 固定(下の \.statusBadge` / `.statusSelect`。D-181)+ 左右の padding 24/("In progress" + ▼ ≒110 が収まる)。★列の幅(150)は変えない★(D-165) |
| 2-3d | components/features/ds-alerts/DsAlertsScreen.module.css:316-328(.statusBadge) |
display: inline-block;・min-width: 110px;・padding: 4px 14px; ほか(コメント :319 の「≒103px」) |
★2-3a と同じ宣言にする★(display: block; box-sizing: border-box; width: 120px; padding: 4px 8px; border: 1px solid transparent; text-align: center; font-size: 12px; border-radius: 6px; font-weight: 600; white-space: nowrap;)。コメントは /* ★通常モードの対応状況(表示だけ。押しても何も起きない)★ — ★編集モードのプルダウンと同じ 120px・同じ高さ★(\AlertsScreen.module.css` の .statusBadge + .statusBadgeFixed と同じ。D-181。旧: min-width 110px・右寄せ — 指示書AZ 4b) */。★:319` の「≒103px」の行は消す★ |
| 2-3e | components/features/ds-alerts/DsAlertsScreen.module.css:276(.statusSelect の width: 100%;) |
width: 100%; |
width: 120px;。コメント :271 の ★幅は列いっぱいの固定幅★。 → ★幅は 120px 固定★(バッジと同じ。D-181)。 |
| 2-3f | components/features/ds-alerts/DsAlertsScreen.module.css:251-267(.statusColumn と .statusColumnEditing、それぞれのコメント) |
.statusColumn { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; } と .statusColumnEditing { width: 240px; align-items: stretch; gap: 6px; } |
★2つをまとめて次の1つにする(.statusColumnEditing は消す)★:/** カード右の対応状況(通常モードはバッジ、編集モードはプルダウン。解消のときは下に解消日時)。* ★両モードで幅 120px 固定★ — 切り替えで左の本文の幅が変わり、文字の折り返しが動かないように(アラート画面と同じ。D-181)。* ★備考の入力欄はここに出さない★(左の本文の \.noteInput`。指示書BA 項4)<br> */<br>.statusColumn {<br> flex-shrink: 0;<br> width: 120px;<br>}` |
| 2-3g | components/features/ds-alerts/DsAlertsScreen.tsx:537-543 |
<div className={ editing ? \${styles.statusColumn} ${styles.statusColumnEditing}` : styles.statusColumn }>`(7行) |
<div className={styles.statusColumn}>(1行) |
| 2-3h | components/features/alerts/AlertsScreen.module.css:340-342(.statusColumn) |
flex-shrink: 0; |
flex-shrink: 0; の次に width: 120px; を足し、前にコメント /* カード右の対応状況。★両モードで幅 120px 固定★(中のバッジ・プルダウンと同じ幅。エラー一覧・D-Sec と同じ。D-181) */ |
| 2-3i | components/features/alerts/AlertsScreen.module.css:273-274(.statusBadgeFixed のコメント) |
/* ★通常モードの事前チェックの行のバッジ(D-165)★ — 編集モードのプルダウン(.statusSelect)と同じ幅・高さにして、 |
/* ★通常モードのバッジ(事前チェックの行・出発失敗の行とも。D-165 / D-181)★ — 編集モードのプルダウン(.statusSelect)と同じ幅・高さにして、 |
--col-status: 150px・表の最小幅 1130px)は変えない★。バッジ・プルダウンは列の中で左に寄り、右に 6px 余る(意図どおり)★モック(d-watch-mock.jsx:953)も備考はカードの左の本文★(検知の行の下)。アラートも入力欄は左の本文(AlertsScreen.tsx:575-592)。
components/features/ds-alerts/DsAlertsScreen.tsx:534-535 を次に置き換える: {/* 備考。★編集モードの入力欄もここ(左の本文の、備考の行の位置)に出す★ — 対応状況の列には入れない
(アラート・エラー一覧と同じく、切り替えで右の列の幅が変わらないように。指示書BA 項4・D-181)。
通常モードは ★空なら出さない★。
★入力欄は固定の大きさ★(2行ぶん・`resize: none`・幅は本文いっぱい)。
上限超過(422)を画面側で先に防ぐ。上限値の正は lib/config(YAML の maxLength と同じ) */}
{editing ? (
<textarea
className={styles.noteInput}
aria-label={t("備考")}
value={draftNote(item, draft)}
rows={2}
maxLength={PRECHECK_NOTE_MAX_LENGTH}
placeholder={t("備考を入力")}
disabled={saving}
onChange={(e) => changeDraftNote(item, e.target.value)}
/>
) : (
item.note && <div className={styles.noteLine}>{item.note}</div>
)}
{editing && ( … <textarea … /> )}(今の :575-588)は消す★(上に移したので)。components/features/ds-alerts/DsAlertsScreen.module.css:358-375(.noteInput)の width: 100%; の次に margin-top: 6px; を足し、コメント /* 通常モードの備考の行(.noteLine)と同じ位置から始める */ を付ける。:370 のコメント ★大きさは固定★ — 2行ぶんの高さ。 → ★大きさは固定★ — 2行ぶんの高さ・幅は左の本文いっぱい。段階2 の後の D-Sec の右の列は次の形になる(2-3g・1-4d・2-4 の結果。★これと違えば直す★):
<div className={styles.statusColumn}>
{editing ? (
<select …(今の :547-559 のまま)… />
) : (
<span className={`${styles.statusBadge} ${statusBadgeClass(item.resolution_status)}`}>…</span>
)}
{/* 解消のときだけ解消日時を下に出す(`showsResolvedTime()`)。… */}
{showsResolvedTime(item, draft) && (
<div className={styles.statusTime}>
{item.resolved_at ? formatDateTime(item.resolved_at) : "-"}
</div>
)}
</div>
| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 2-5a | components/features/alerts/AlertsScreen.module.css:180-184(.itemCardChanged) |
background: color-mix(in srgb, var(--pr) 8%, var(--sf));/コメント「背景をうっすら色付けする。★左の帯(border-left)は分類の色なので変えない★」 |
★D-Sec(DsAlertsScreen.module.css:187-194)と同じ★: background: var(--sf-h); border-top-color: var(--ac); border-right-color: var(--ac); border-bottom-color: var(--ac);。コメントは /* ★変えた行(下書きがある行)の目印(D-165)★ — 背景(\--sf-h`)と上・右・下の枠(`--ac`)。★左の帯(border-left)は分類の色なので変えない★(D-Sec アラートと同じ形。エラー一覧の表は背景+左端の帯。D-181) */` |
| 2-5b | components/features/alerts/AlertsScreen.tsx:552-553(カードの class のコメント) |
/* ★変えた行の目印は背景の色(\.itemCardChanged`)★ — 左の帯は分類の色なので変えない(D-165)。` |
/* ★変えた行の目印は背景と上・右・下の枠(\.itemCardChanged`。D-Sec と同じ。D-181)★ — 左の帯は分類の色なので変えない(D-165)。` |
| 2-5c | components/features/ds-alerts/DsAlertsScreen.module.css:187-188(.itemCardChanged のコメント) |
/* ★編集モードで変えたカードの目印★(\ErrorsScreen.module.css` の .rowChanged と同じ色)。` |
/* ★編集モードで変えたカードの目印★(背景は \ErrorsScreen.module.css` の .rowChanged と同じ色。アラートも同じ形。D-181)。`(中身は変えない) |
ErrorsScreen.module.css:312-320 の .rowChanged)は変えない★ — 背景は既に var(--sf-h)。表の行なので「背景+左端の帯(box-shadow)」のまま(カードの枠の形を表の行に当てはめない)★モックとの関係(2026-10-19 確認)★: モックのアラート画面(d-watch-mock.jsx:583-584)は見出しと副題だけで、★「編集」ボタン自体が無い★(D-165 で足したもの)。 D-165 の決定は「一覧の上の『編集』で編集モードに入る」で、見出しの右も絞り込みの行の右も「一覧の上」に当たる。モックでも見出しの右にボタンを置く画面がある(レポート :647-650)。★モックと食い違わない★と判断した(§10 Q1)。
components/features/alerts/AlertsScreen.tsx:360-363)を次に置き換える(D-Sec DsAlertsScreen.tsx:314-358 と同じ形): <div className={styles.header}>
<div>
<h1 className={styles.title}>{t("アラート(事前チェック)")}</h1>
<div className={styles.subtitle}>{t("スケジュール開始前のエラー検知と出発失敗")}</div>
</div>
<div className={styles.headerRight}>
{/* ★編集 / 保存({n}件)/ キャンセル(D-165)★ — 見出しの右(エラー一覧・D-Sec と同じ位置・同じ見た目。D-181)。
★ボタンは固定幅★(JP/EN や件数で位置が動かないように) */}
{editing ? (
<>
<button
type="button"
className={`${styles.editButton} ${styles.saveButton}`}
disabled={saving}
onClick={() => void saveEdits()}
>
{saving
? t("保存中…")
: drafts.size > 0
? t("保存({n}件)").replace("{n}", String(drafts.size))
: t("保存")}
</button>
<button
type="button"
className={`${styles.editButton} ${styles.cancelButton}`}
disabled={saving}
onClick={cancelEditMode}
>
{t("キャンセル")}
</button>
</>
) : (
<button
type="button"
className={`${styles.editButton} ${styles.startButton}`}
/* 編集できる行(事前チェック)が無いときは押せない(押しても何も変えられない) */
disabled={loading || editableCount === 0}
onClick={startEditMode}
>
{t("編集")}
</button>
)}
</div>
</div>
{/* ★編集 / 保存({n}件)/ キャンセル(D-165)★ — 絞り込みの行の右端。…*/} と <div className={styles.editActions}> … </div>(今の :483-520)は消す★。.toolbar の <div> と中の <fieldset className={styles.filterSet}> は残す。loading || editableCount === 0)・saveEdits / cancelEditMode / startEditMode は変えない★(3-8)components/features/alerts/AlertsScreen.module.css| # | 場所(今) | 今 | 直す |
|---|---|---|---|
| 1 | :5-7(.header) |
margin-bottom: 4px; |
display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: <段階0-4 で測ったアラートの値>px; gap: 12px; flex-wrap: wrap;。コメント /* 見出し(左: タイトルと副題・右: 編集のボタン)。★余白は直す前の見た目(段階0-4 で測った値)に合わせる★(指示書BA 項6) */。★測れなかったら 16px★ |
| 2 | :15-19(.subtitle) |
margin-bottom: 16px; を含む |
★margin-bottom: 16px; の行を消す★(余白は .header が持つ。D-Sec :28-31 と同じ) |
| 3 | :70-104(.editActions・.editButton・.editButtonPrimary・.editButton:disabled とそのコメント) |
絞り込みの行の右端・min-width 96 / 112・塗りの主ボタン |
★消して、DsAlertsScreen.module.css:33-87(/* 見出しの右: 編集モードのボタン */ の .headerRight から .saveButton:disabled, .cancelButton:disabled { cursor: progress; } まで)をそのまま写す★。写したコメントの「ErrorsScreen.module.css の .editButton 等と同じ」は残す |
.startButton(幅 88px・枠線あり・背景なし)/「保存(N件)」= .saveButton(幅 120px・背景 --pr-d・文字 --pr)/「キャンセル」= .cancelButton(幅 100px・枠線あり・背景なし)。★3画面で同じ★| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 2-7a | components/features/ds-alerts/DsAlertsScreen.module.css:330-335(.statusTime) |
font-size: 12px; color: var(--tx-m); white-space: nowrap; |
先頭に margin-top: 2px; を足す(アラート :333 と同じ。列の gap を消したため)。コメント :330 を /* 解消のときだけバッジ・プルダウンの下に出す解消日時。★左寄せ(3画面とも。D-181)★ */ に |
| 2-7b | components/features/ds-alerts/DsAlertsScreen.module.css:337-340(.statusColumnEditing .statusTime { text-align: right; } とそのコメント) |
右寄せ | ★消す★(.statusColumnEditing は 2-3f で無くなった) |
| 2-7c | components/features/errors/ErrorsScreen.module.css:397(.statusTime のコメント) |
/* 解消のときだけバッジ・プルダウンの下に出す解消日時 */ |
/* 解消のときだけバッジ・プルダウンの下に出す解消日時。★左寄せ(3画面とも。D-181)★ */(中身は変えない) |
| 2-7d | components/features/alerts/AlertsScreen.module.css:331(.statusTime のコメント) |
/* 解消のときだけプルダウンの下に出す解消日時(旧ボタンの「解消 (日時)」の日時部分) */ |
/* 解消のときだけバッジ・プルダウンの下に出す解消日時(旧ボタンの「解消 (日時)」の日時部分)。★左寄せ(3画面とも。D-181)★ */(中身は変えない) |
★基準はアラート★(AlertsScreen.module.css:49-60: 絞り込み全体を opacity: 0.5・中の部品すべて cursor: not-allowed)。★アラートは変えない★。
| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 2-8a | components/features/errors/ErrorsScreen.module.css:178-185 |
.toolbar:disabled .dateInput, .toolbar:disabled .select, .toolbar:disabled .searchInput, .toolbar:disabled .checkLabel { opacity: 0.5; cursor: not-allowed; }(「~」と「指定なし(全期間)」(.dateSep)が濃いまま) |
★消して(3-3)、次の2つにする★:/* 編集中(\.toolbar` の fieldset が disabled)は絞り込みを薄くして押せない見た目にする(D-165)。<br> ★子要素ごと(`> `)に薄くする★ — fieldset 自体に opacity をかけると、カードの区切り線(`.toolbar` の border-bottom)まで薄くなるため。<br> 「~」「指定なし(全期間)」も含めて全部薄くする(アラート・D-Sec と同じ見た目。D-181) /<br>.toolbar:disabled > {<br> opacity: 0.5;<br>}<br><br>/ 中の部品すべてを禁止カーソルにする(`.dateInput` / `.checkLabel` の `cursor: pointer` より詳細度が高い。アラート・D-Sec と同じ) /<br>.toolbar:disabled {<br> cursor: not-allowed;<br>}` |
| 2-8b | components/features/ds-alerts/DsAlertsScreen.module.css:131-135 |
.toolbar:disabled .select, .toolbar:disabled .statusButtons { opacity: 0.5; } |
★.toolbar:disabled { opacity: 0.5; } にする★(中の部品を個別に挙げない。アラートの .filterSet:disabled と同じ)。コメント :131 は /* 編集中(\.toolbar` の fieldset が disabled)は絞り込み全体を薄くする(アラートと同じ。D-181) */` |
.toolbar:disabled *(:140)とページ送りの規則(:141-144)・エラー一覧のページ送りの規則(:211-221)は ★変えない★(657c6ff で揃え済み)> * の不透明度と、ページ送り・ボタンの :disabled の不透明度は重ならない★(別の要素)★基準は D-Sec★(DsAlertsScreen.module.css:146-159: 横並び(display: flex)・失敗件数は同じ行・下に 12px)。
| # | ファイル:行(今) | 今 | 直す |
|---|---|---|---|
| 2-9a | components/features/alerts/AlertsScreen.module.css:106-117(.editNotice・.editFailed) |
margin: -8px 0 12px;・.editFailed { margin-top: 4px; … }(失敗件数は次の行) |
★消して、DsAlertsScreen.module.css:146-159(.editNotice と .editNoticeError。コメントごと)をそのまま写す★ |
| 2-9b | components/features/alerts/AlertsScreen.tsx:523-532 |
<div className={styles.editNotice}><div>{t("編集中は…")}</div>{failedCount > 0 && (<div className={styles.editFailed}>…</div>)}</div> |
★D-Sec(DsAlertsScreen.tsx:486-496)と同じ形★: 外側は <div className={styles.editNotice}> のまま、文言を <span>{t("編集中は絞り込みとページ送りを使えません")}</span>、失敗件数を {failedCount > 0 && (<span className={styles.editNoticeError}>{t("{n}件を保存できませんでした").replace("{n}", String(failedCount))}</span>)}。直前のコメント {/* 編集モードの案内と、保存に失敗した件数(D-165) */} を足す。★failedCount はそのまま使う★(rowErrors.size に変えない — 3-8) |
ErrorsScreen.module.css:187-201・ErrorsScreen.tsx:517-527)は変えない★ — 失敗件数は既に同じ行(display: flex)・文字の大きさと色も D-Sec と同じ。★絞り込みが白いカードの中にある表の画面なので、案内もカードの中(左右 20px の余白・下に区切り線)のまま★(項5 で表の行の目印を残すのと同じ考え方。§10 Q2)★今★: 出発失敗の行(severity が launch_failed。編集できない行)は .statusBadge だけ(幅なし)で、解消のときは「解消 (日時)」を1つのバッジに入れる(StatusBadgeText :85-100・:655-659)。事前チェックの行は 120px のバッジ+下に解消日時。
components/features/alerts/AlertsScreen.tsx:620-660(<div className={styles.statusColumn}> から閉じ </div> まで)を次に置き換える: <div className={styles.statusColumn}>
{/* ★編集モードの事前チェックの行だけプルダウン★(未解消 / 対応中 / 解消 から選ぶ。D-161 の見た目)。
それ以外(通常モード・出発失敗の行)は色付きのバッジ(表示だけ。D-165)。
★出発失敗の行はどちらのモードでもバッジのまま★(書き込み先が無い。D-105)。
★バッジもプルダウンも 120px 固定・解消日時は下★(行の種類によらず同じ形。エラー一覧・D-Sec と同じ。D-181) */}
{editable && editing ? (
<select
className={`${styles.statusSelect} ${statusBadgeClass(status)}`}
aria-label={t("対応状況")}
value={status}
disabled={saving}
onChange={(e) => changeDraftStatus(item, e.target.value)}
>
{RESOLUTION_STATUS_OPTIONS.map((o) => (
<option key={o.value} value={o.value}>
{t(o.label)}
</option>
))}
</select>
) : (
<span
className={`${styles.statusBadge} ${styles.statusBadgeFixed} ${statusBadgeClass(status)}`}
>
{t(resolutionStatusLabel(status))}
</span>
)}
{/* 解消日時は解消のときだけ下に出す(`showsResolvedTime()`。3画面で同じ。D-181)。
★下書きで解消にしただけの行・下書きで未解消/対応中に変えた行には出さない★ */}
{showsResolvedTime(item, draft) && (
<div className={styles.statusTime}>
{item.resolved_at ? formatDateTime(item.resolved_at) : "-"}
</div>
)}
</div>
draft が undefined(:545)なので status(:546)は item.resolution_status、showsResolvedTime(item, undefined) は「保存済みが解消か」。事前チェックの行は今と同じ式
StatusBadgeText(:85-100。コメント /** 対応状況バッジの文言(解消は「解消 (日時)」)。… */ ごと)を消す★(使われなくなる。lint の未使用で落ちる).statusBadge(AlertsScreen.module.css:265-271)は消さない★(.itemCardSubdued .statusBadge :195 が使う。全部のバッジに .statusBadge と .statusBadgeFixed の両方が付く)npx tsc --noEmit -p .・npm run lint・npm test(件数は段階1 と同じ)grep -n "statusColumnEditing\|editActions\|editButtonPrimary\|editFailed\|StatusBadgeText\|min-width: 110px" components/features/alerts components/features/errors components/features/ds-alerts -r
git add -- components/features/alerts/AlertsScreen.tsx components/features/alerts/AlertsScreen.module.css \ components/features/errors/ErrorsScreen.module.css \ components/features/ds-alerts/DsAlertsScreen.tsx components/features/ds-alerts/DsAlertsScreen.module.css git diff --cached --name-status # この5行(ErrorsScreen.tsx は段階2 では変わらない)メッセージの例:
style: 編集モードの3画面で、対応状況の幅(120px)・備考の入力欄の位置・変えた行の目印・編集ボタン・解消日時の寄せ・編集中の絞り込みの見た目・案内の形を揃える(指示書BA 項3〜10・D-181) (★2つに分けてもよい★: アラートの見出し・ボタン(2-6)とそれ以外。分けたら作業報告に書く)★ユーザー決定(2026-10-19)★: 「11はアラートの方にD-SECを揃えるようにしてください」。
| 場所 | 今 | 直す | アラートの同じ場所 |
|---|---|---|---|
状態ボタン1(components/features/ds-alerts/DsAlertsScreen.tsx:461) |
{t("未解消・対応中")} |
{t("未解消のみ")} |
AlertsScreen.tsx:459 |
状態ボタン2(:471) |
{t("全件")} |
★変えない★ | :469 |
状態ボタン3(:481) |
{t("解消")} |
{t("解消済み")} |
:479 |
数値カード3枚目のラベル(:363) |
label={t("解消")} |
label={t("解消済み")} |
:367 |
即時対応 / 進行中 / 完了)・バッジとプルダウンの「未解消 / 対応中 / 解消」(STATUS_OPTIONS :83-87。3画面で同じ)・ボタンの色(c.ng / c.txD / c.ok)・statusFilter の値(open / all / resolved)status=open = 解消でないもの。アラート lib/prechecks/query.ts:144-145・D-Sec lib/ds-alerts/query.ts:95-102)。文言は「未解消のみ」のまま:452)の直前にコメントを足す: {/* ★状態ボタンの文言はアラート画面に揃える(未解消のみ / 全件 / 解消済み。ユーザー決定 2026-10-19。D-181)★ —★「未解消のみ」は対応中も含む★(status=open。アラートも同じ。ユーザー了承)。バッジ・プルダウンは「未解消 / 対応中 / 解消」のまま */}lib/i18n.ts — ★「未解消のみ」「解消済み」は辞書に無い★(2026-10-19 grep で確認)★今のアラート画面は、EN にしてもこの2つ(ボタン・数値カード)が日本語のまま出ている★。訳は ★モックの対訳(d-watch-mock.jsx:140 の "未解消のみ": "Unresolved", "解消済み": "Resolved")★を使う。
lib/i18n.ts:449-451 を次に置き換える:
// ---- アラート・D-Sec アラート: 状態ボタンと数値カード(D-181。D-Sec はアラートの文言に揃えた)---- // ★EN はモック(d-watch-mock.jsx:140)の対訳★。★`未解消` / `対応中` / `解消` は上に既にあるため再掲しない★。 // ★足すとアラート画面のボタン・数値カードも EN になる(いままで日本語のまま出ていた)★ 未解消のみ: "Unresolved", 解消済み: "Resolved",
"未解消・対応中" のキーは消す★(使う場所が無くなる。grep -rn "未解消・対応中" components lib --include=*.tsx --include=*.ts で、コメント以外に残っていないことを確かめる — コメントの「未解消・対応中」(lib/error-reports/query.ts:24 等)は別の話なので残す)解消済みも表示(:436)とは別のキー★(重複キーにならない)npx tsc --noEmit -p .・npm run lint(★重複キーで落ちないこと★)・npm testgit add -- components/features/ds-alerts/DsAlertsScreen.tsx lib/i18n.ts git diff --cached --name-statusメッセージの例:
feat: D-Sec アラートの状態ボタンと数値カードの文言をアラート画面に揃え(未解消のみ/全件/解消済み)、その訳を辞書に足す(指示書BA 項11・D-181)★追記の前に 3-2 の確認(git diff -- docs/decisions.md docs/code-map.md docs/spec.md docs/fixtures.md が空)★。
docs/decisions.md の末尾に D-181 を追記するgrep -n "^### D-181" docs/decisions.md が0件。2026-10-19 時点は空き。末尾は D-180 :13041〜:13077)。★埋まっていたら次の空き番号を使い、本書の「D-181」をすべてその番号に読み替え、作業報告に書く★:13077(D-180 の最後の行)の後に、空行・---・空行を置いてから次を足す(D-179 と D-180 の間と同じ区切り。★実物の区切りを見て合わせる★):### D-181 `[決定]` 編集モードのある3画面(エラー一覧・アラート・D-Sec アラート)の見た目を揃え、D-Sec の状態ボタンと数値カードの文言をアラート画面に揃える **日付**: 2026-10-19 / 実装: Cursor(指示書BA) ★根拠★: 監督の見比べ(2026-10-19。指示書AZ の後)/ユーザー決定 2026-10-19「11はアラートの方にD-SECを揃えるようにしてください」(項1)。 1. ★D-Sec アラートの状態ボタンを「未解消のみ / 全件 / 解消済み」、数値カードの3枚目のラベルを「解消済み」にする★(アラート画面と同じ文言)。 ★D-180 7b のうち、状態ボタンと数値カードのラベルだけを上書きする★。★バッジと編集のプルダウンは「未解消 / 対応中 / 解消」のまま★(3画面で同じ)。 数値カードは3枚(未解消 / 対応中 / 解消済み)と下の小さい文字(即時対応 / 進行中 / 完了)のまま。 ★2画面とも「未解消のみ」は対応中も含む★(`status=open`。ユーザー了承)。 ★「未解消のみ」「解消済み」の EN はモック(`d-watch-mock.jsx:140`)の対訳(Unresolved / Resolved)★ — 辞書に無く、アラート画面でも EN で日本語のまま出ていた 2. ★解消日時は「保存済みが解消で、画面の対応状況(下書き優先)も解消」のときだけ出す★(`showsResolvedTime()` `lib/prechecks/edit-drafts.ts`。3画面で1本)。 旧: エラー一覧と D-Sec は保存済みの値だけを見ており、解消の行を下書きで未解消・対応中に戻しても解消日時が出たままだった 3. ★対応状況のバッジとプルダウンは3画面とも 120px 固定★(アラートの形)。★D-Sec の対応状況の列は両モードで 120px★(切り替えで左の本文が折り返し直さない)。 エラー一覧の列幅(150px・表の最小幅 1130px)は変えない。旧: エラー一覧はバッジ幅なし・プルダウンは列いっぱい/D-Sec はバッジ min-width 110px(指示書AZ 4b)・編集中の右列 240px 4. ★D-Sec の備考の入力欄は、左の本文(通常モードの備考の行の位置)に出す★(アラート・モックと同じ)。旧: 編集モードで右の列に移っていた 5. ★変えた行の目印★: カードの2画面(アラート・D-Sec)は ★背景 `--sf-h`+上・右・下の枠 `--ac`★(左の帯は分類・種別の色なので変えない)。 エラー一覧(表)は ★背景 `--sf-h`+左端の帯★のまま(表の行に枠の形を当てはめない)。旧: アラートは `--pr` 8% の背景だけ 6. ★「編集」「保存(N件)」「キャンセル」は3画面とも見出しの右・同じボタン★(幅 88 / 120 / 100px。「保存」だけ背景 `--pr-d`)。 旧: アラートだけ絞り込みの行の右端・塗りの主ボタン(min-width 112 / 96px)。★モックのアラート画面に「編集」は無く(D-165 で追加)、D-165 の「一覧の上」にも当たるので、モックとは食い違わない★ 7. ★解消日時は3画面とも左寄せ★(バッジ・プルダウンの左端に揃う)。旧: D-Sec だけ右寄せ(指示書AZ 4c) 8. ★編集中の絞り込みは、全体を不透明度 0.5・中の部品すべて禁止カーソル★(アラートの形)。エラー一覧は ★子要素ごと(`> *`)に薄くする★(カードの区切り線を薄くしないため)。 旧: エラー一覧は部品ごとに薄くしていて「~」「指定なし(全期間)」が濃いままだった 9. ★「編集中は絞り込みとページ送りを使えません」は D-Sec の形(横並び・失敗件数は同じ行・下に 12px)★。アラートをこれに合わせた。 エラー一覧は ★白いカードの中(絞り込みと表の間・左右 20px・下に区切り線)★のまま(絞り込みがカードの中にある表の画面のため。項5 と同じ考え方) 10. ★アラートの出発失敗の行のバッジも 120px・解消日時はバッジの下★(事前チェックの行と同じ形)。旧: 「解消 (日時)」を幅なしの1つのバッジに入れていた 11. (記録)見出しの下の余白は、エラー一覧 16px・D-Sec 20px(指示書AZ 4d)・アラートは直す前の値を保った(実装の記録に測った値を書く)。揃えるかは未決 #### 実装の記録 - ★2026-10-19 指示書BA(Cursor)★: - ★コミット★: <段階1 の hash>(項1・2)/<段階2 の hash(2つに分けたなら両方)>(項3〜10)/<段階3 の hash>(項11) - ★テスト★: BA 前 130ファイル / 3,077件(監督の実測 2026-10-19・`657c6ff`)→ BA 後 <段階5 で測った数>(全件通過。H1〜H6 の6件増)。H1〜H6 は2通りに壊して赤を確かめた(指示書BA 1-3) - ★見出しの下の余白(段階0-4)★: アラート <値>px・エラー一覧 <値>px・D-Sec <値>px(当方の fixtures 由来。測れなかったならそう書く) - ★画面確認★: <段階5 の結果と出所(誰が・どこで・いつ。当方の fixtures 由来)。監督に任せたならそう書く> - ★指示書と違う判断★: <あれば。無ければ「無し」>
<…> は実際の値に置き換える★。この記録を書くコミット自体の hash は書かない(書けない)docs/code-map.md★冒頭の改訂の履歴(:26 の「第4版改訂5」の行の次)に1項目足す★: - ★**第4版改訂6: 2026-10-19**(**D-181** / 指示書BA の実装 <段階3 のコミット> まで)★ — 編集モードのある3画面の見た目と D-Sec の文言を揃えた分だけ直しました(解消日時の判定 \showsResolvedTime()`・対応状況 120px・D-Sec の備考の入力欄の位置・変えた行の目印・アラートの「編集」の位置・D-Sec の状態ボタン「未解消のみ / 全件 / 解消済み」)。★直した箇所の行番号は <段階3 のコミット> で確かめました★。それ以外は上のとおりです`
| # | 場所(今) | 今(要旨) | 直す |
|---|---|---|---|
| 4-2a | :610(3.5 アラート「変えた行は背景の色(.itemCardChanged)で分かります」) |
背景の色だけ | 変えた行は背景の色と上・右・下の枠(\.itemCardChanged`。D-Sec と同じ。D-181)で分かります` |
| 4-2b | :609(3.5「一覧の上の「編集」(:485 以降。…)」) |
一覧の上・:485 |
見出しの右の「編集」(\:<新しい行>`。編集できる行が0件なら押せない。3画面とも同じ位置・同じボタン。D-181)` |
| 4-2c | :618(3.5「★解消日時(プルダウン・バッジの下)は 12px★」) |
— | 末尾に 。★出すのは保存済みが解消で、画面の対応状況(下書き優先)も解消のときだけ★(\showsResolvedTime()` `lib/prechecks/edit-drafts.ts`。3画面で1本。D-181)。★出発失敗の行もバッジ(120px)の下に出す★` を足す |
| 4-2d | :640(3.5b エラー一覧「通常は表示だけ → ツールバーの「編集」(…)」) |
★今でも誤り★(ボタンは件数の右) | ツールバーの「編集」 → 見出しの右(件数の右)の「編集」。同じ行の「解消のときは下に解消日時」の後に (下書きで未解消・対応中に戻すと隠れる。D-181) |
| 4-2e | :643(3.5b「対応状況 150」) |
— | 対応状況 150 の後に (中のバッジ・プルダウンは 120px 固定。D-181) を足す |
| 4-2f | :765(3.10 D-Sec「★編集モードあり★(…)」) |
— | 末尾に ★備考の入力欄はカードの左の本文(通常モードの備考の行の位置)・対応状況の列は両モードで 120px・解消日時は左寄せ(D-181)★。★状態ボタンは「未解消のみ(対応中も含む)/ 全件 / 解消済み」、数値カードは「未解消 / 対応中 / 解消済み」(アラート画面に揃えた。D-181)★ を足す |
| 4-2g | :2011(5B-10 の表の1行目「未解消 / 対応中 / 解消」) |
表示名 | 未解消 / 対応中 / 解消済み(★3枚目のラベルはアラート画面に揃えた。D-181★)。根拠の欄 D-180 → D-180 / D-181 |
★行番号の追従(G2)★ — 次の行は本書で動くファイルの行番号を引いている。★本書のコミットの後の HEAD で関数名・クラス名・文言を grep し、引き直す★(★下(行番号の大きいほう)から直す★):
| code-map の行 | 引いている場所 | 探す語 |
|---|---|---|
:592 |
AlertsScreen.tsx の行数(684行・f2b91fc) |
wc -l → 行数と <段階3 のコミット> に |
:594 |
AlertsScreen.tsx の :225(/api/prechecks)・:132(sendPrecheckPatch()) |
api/prechecks?・function sendPrecheckPatch |
:603 |
:43-49(severityColor) |
function severityColor |
:604 |
:109-121(itemCardClass())・:570(「本清掃は成功」の Pill) |
function itemCardClass・本清掃は成功 |
:605〜:617 |
:123-126(isEditable())・:191-203(編集モードのコメント)・:587(maxLength)・:299(saveEdits)・:375 / :674(fieldset)・:257-267(beforeunload)・:284(cancelEditMode)・:601(.noteText) |
各関数名・<fieldset・beforeunload・maxLength={PRECHECK_NOTE_MAX_LENGTH}・styles.noteText |
:629 |
ErrorsScreen.tsx の行数(670行・f2b91fc) |
wc -l |
:631 |
:238(/api/errors)・:105(sendErrorUpdate()) |
api/errors?・function sendErrorUpdate |
:640 |
:285(canStartEdit)・:311(saveEdit)・:288(filtersDisabled)・:176-183(beforeunload)・:296(cancelEdit) |
各名前 |
:641 |
:634(.noteText) |
styles.noteText |
:643 |
:544-551(<colgroup>)・CSS .table(:246-261。★今でもずれている — 今は :254-270★) |
<colgroup>・^.table { |
:760・:761 |
DsAlertsScreen.tsx の行数(613行・d282e07)・:200(/api/ds-alerts)・:96(sendDsAlertUpdate) |
wc -l・api/ds-alerts?・api/errors/ |
:767・:850 |
DsAlertsScreen.module.css:119(.masterSelect) |
^.masterSelect |
:845・:846 |
AlertsScreen.module.css:151(★今でもずれている — 今は :154★)・ErrorsScreen.module.css:152(.masterSelect) |
^.masterSelect |
:857 |
AlertsScreen.tsx:381 :393・ErrorsScreen.tsx:420 :434(openDatePicker) |
onClick={openDatePicker} |
:866 |
ErrorsScreen.module.css:246(.table。★今でもずれている★) |
^.table { |
:922・:927・:928・:936・:937 |
API の表の画面側の行(DsAlertsScreen.tsx:200・AlertsScreen.tsx:225 :136・ErrorsScreen.tsx:238 :109) |
apiFetch の行 |
:1857 |
AlertsScreen.tsx:109-121 / :570 |
function itemCardClass・本清掃は成功 |
:2155 |
AlertsScreen.tsx:120(入力欄の maxLength。★今でもずれている★) |
maxLength={PRECHECK_NOTE_MAX_LENGTH} |
grep -n "未解消・対応中」\|\"未解消・対応中\"\|statusColumnEditing\|editActions" docs/code-map.md が0件★(コメントの「未解消・対応中」= status=open の意味の説明は残してよい。ボタンの文言として書いた箇所が無いこと)docs/spec.md(F-07 D-Secアラート)| # | 場所(今) | 今 | 直す |
|---|---|---|---|
| 4-3a | :111 |
- サマリーカウント(未解消 / 対応中 / 解消。エラー一覧と同じ文言。D-180 項7b) |
- サマリーカウント(未解消 / 対応中 / 解消済み。★アラート画面と同じラベル。D-181★) |
| 4-3b | :111 の次 |
(状態ボタンの記述が無い) | - 状態の絞り込み: 未解消のみ(★対応中も含む★)/ 全件 / 解消済み(★アラート画面と同じ文言。D-181★) を1行足す |
| 4-3c | :113 |
- 対応状況の遷移: 未解消 → 対応中 → 解消(編集モードでまとめて保存。D-161 / D-165) |
★変えない★(バッジ・プルダウンの文言は「解消」のまま) |
docs/fixtures.md| # | 場所(今) | 今 | 直す |
|---|---|---|---|
| 4-4a | :545(FX-ERR-14 の右端) |
D-Sec は「全件」「解消」で出る |
D-Sec は「全件」「解消済み」で出る |
| 4-4b | :546(FX-ERR-15 の右端) |
同上 | 同上 |
git diff --stat で4ファイルだけ(docs/decisions.md・docs/code-map.md・docs/spec.md・docs/fixtures.md)git diff -- docs/decisions.md が D-181 の追記だけ(D-180 以前の行が変わっていたら止まって報告)docs: D-181(編集モードの3画面の見た目と D-Sec の文言を揃えた)を追記し、code-map・spec・fixtures を追従させる(指示書BA)npx tsc --noEmit -p . — 0件npm run lint — 0件(★eslint-disable を足していない★)npm test — ★全件通過★。件数を控える(期待: 130ファイル / 3,083件)USE_FIXTURES=true で npm run build★(PowerShell: $env:USE_FIXTURES='true'; npm run build)— 成功(★本体で★。ワークツリーではない)mcp__Claude_Browser__*)を使う。Edge(ヘッドレス・CDP を含む)は使わない★(ユーザー指示 2026-10-16)。★ユーザーの :3000 は止めない★。 手順は指示書AX 段階10-1 の 1〜3(:3100 で next start・テスト用のトークンはその場で生成し、★文書・コミット・報告に書かない★)。★幅 1440px★(resize_window で 1440×900。終わったら preset: "desktop" に戻す)。★JP と EN の両方★。 ★アプリ内ブラウザが使えないときは、画面の確認をせずに「監督に任せる」と作業報告に書く★(ほかの手段で代わりにしない)。| 項 | 画面 | 操作 | 期待 | |---|---|---|---| | 1 | /errors | 「解消済みも表示」を入れる → 編集 → 解消の行(FX-ERR-03)を「未解消」に | その行の [class*="__statusTime"] が ★消える★。「解消」に戻すと ★また出る★ | | 1 | /ds-alerts | 「全件」→ 編集 → 解消のカード(FX-ERR-14)を「対応中」に | 同上 | | 1 | /alerts | 「全件」→ 編集 → 解消の事前チェックの行(あれば)を「未解消」に | 同上(今までと同じ) | | 2 | /alerts | EN で再読み込み | 読み込み中に "Loading…"(一瞬なので見えなければコードの差分で確かめた、と書く) | | 3 | 3画面 | 通常モード・編集モード × JP・EN | ★[class*="__statusBadge"] と [class*="__statusSelect"] の getBoundingClientRect().width がすべて 120★ | | 3 | /ds-alerts | 同じカードで通常 → 編集 | ★[class*="__itemMain"] の幅が変わらない★([class*="__statusColumn"] は両モードで 120) | | 4 | /ds-alerts | 編集 | textarea の closest('[class*="__itemMain"]') が null でない(左の本文の中)。[class*="__statusColumn"] textarea は0件 | | 5 | /alerts・/ds-alerts | 編集 → 1枚の状態を変える | そのカードの getComputedStyle(card).backgroundColor が --sf-h の値、borderTopColor が --ac の値、borderLeftColor は分類・種別の色のまま。2画面で同じ見た目 | | 5 | /errors | 同上(1行) | 行の背景 --sf-h・左端の帯(今までと同じ) | | 6 | /alerts | 通常 → 編集 | 「編集」「保存(N件)」「キャンセル」が ★[class*="__headerRight"] の中★、幅 88 / 120 / 100(JP・EN で同じ)。★絞り込みの行にボタンが無い★。★見出しの下の余白が段階0-4 で測った値と同じ★ | | 7 | 3画面 | 解消の行・カード | [class*="__statusTime"] の getComputedStyle().textAlign が start または left、getBoundingClientRect().left がバッジ(プルダウン)の left と同じ | | 8 | 3画面 | 編集 | 絞り込みの部品(エラー一覧は [class*="__dateSep"] の「~」「指定なし(全期間)」も)が薄い(★エラー一覧は [class*="__toolbar"] > * の opacity が 0.5・D-Sec は [class*="__toolbar"] が 0.5・アラートは [class*="__filterSet"] が 0.5★)。中の部品・ボタンの cursor が not-allowed。★エラー一覧のカードの区切り線は薄くならない★ | | 9 | /alerts | 編集 | [class*="__editNotice"] の display が flex、marginTop が 0px、marginBottom が 12px(D-Sec と同じ) | | 10 | /alerts | 「全件」→ 出発失敗のカード | バッジの幅 120(事前チェックのカードと同じ。★出発失敗のカードは fixtures では未解消だけなので、解消日時の表示はコードで確かめた、と書いてよい★) | | 11 | /ds-alerts | JP / EN | ボタン「未解消のみ」「全件」「解消済み」/ "Unresolved" "All" "Resolved"。3枚目のカード「解消済み」/ "Resolved"。★バッジとプルダウンは「解消」/ "Resolved"★ | | 11 | /alerts | EN | ボタン "Unresolved" "All" "Resolved"・2枚目のカード "Resolved"(★今まで日本語だった★) |
:3100 の listen プロセスを止めるgrep -rn "未解消・対応中" components lib/i18n.ts grep -rn "statusColumnEditing\|editActions\|editButtonPrimary\|editFailed\|StatusBadgeText" components grep -n "showsResolvedTime" components/features/errors/ErrorsScreen.tsx components/features/alerts/AlertsScreen.tsx components/features/ds-alerts/DsAlertsScreen.tsx lib/prechecks/edit-drafts.ts git diff 657c6ff --stat -- d-watch-api.yaml app lib/db lib/types
components の中のコメントにも残っていないこと。★lib/error-reports/query.ts:24 等は対象外のディレクトリ★)| # | 内容 | 場所 | なぜ直さないか |
|---|---|---|---|
| 7-1 | EN の訳が無い: 「要対応」「対応完了」「合計」「全アラート」(アラートの数値カード)・「即時対応」「進行中」「完了」(D-Sec の数値カード) | lib/i18n.ts |
★EN はあとで一括(方針。指示書AZ R3)★。本書で足すのは状態ボタン・カードのラベルの2つだけ |
| 7-2 | 期間の区切りの記号が違う: エラー一覧は「~」(U+FF5E)、アラートとモックは「〜」(U+301C) | ErrorsScreen.tsx:429・AlertsScreen.tsx:388 |
本書の範囲外(文言の統一はユーザー判断) |
| 7-3 | D-Sec の状態ボタン1の色: モック(d-watch-mock.jsx:932)は c.wn、コードは c.ng(アラートと同じ) |
DsAlertsScreen.tsx:455 |
本書の範囲外。アラートに揃っているので変えない |
| 7-4 | ★画面の文言を固定しているテストは無い★(.test.tsx が無い・grep で「未解消・対応中」「解消」を固定するテスト0件。2026-10-19) |
— | 画面の部品のテストを作るのは本書の範囲外。段階5 の画面確認で代える |
| 7-5 | 見出しの下の余白が3画面で 16 / 16 / 20px(予想)。D-Sec の 20px は指示書AZ 4d の「AX 前は 4px+16px=20px」という読みによるが、CSS のマージンの相殺で AX 前も 16px だった可能性がある | DsAlertsScreen.module.css:17 |
§10 Q3。段階0-4 の実測を監督が見て決める |
lib/prechecks/edit-drafts.ts・lib/prechecks/__tests__/edit-drafts.test.ts(段階1)components/features/errors/ErrorsScreen.tsx(★段階1 の import と解消日時の1か所だけ★)・components/features/errors/ErrorsScreen.module.css(段階2)components/features/alerts/AlertsScreen.tsx・components/features/alerts/AlertsScreen.module.css(段階1・2)components/features/ds-alerts/DsAlertsScreen.tsx・components/features/ds-alerts/DsAlertsScreen.module.css(段階1・2・3)lib/i18n.ts(★段階3 の :449-451 だけ★)docs/decisions.md(★末尾への D-181 の追記だけ★)・docs/code-map.md(段階4-2)・docs/spec.md(段階4-3)・docs/fixtures.md(段階4-4 の2行)docs/handoff/設計_制御盤ログの取り出し_20261019.md・docs/handoff/指示書AY_制御盤のログをD-Secログ画面から取り出す_20261019.md・docs/handoff/TeamWorks確認事項_第13回_*・docs/handoff/回答待ち一覧_*・docs/handoff/pdf/*★(他のセッションの作業)app/api/**・lib/db/**・lib/types/**・d-watch-api.yaml★(API を変えない。G1)lib/prechecks/ の edit-drafts.ts 以外(query.ts・status-update.ts 等)・lib/ds-alerts/**・lib/error-reports/**components/ui/**(FilterButton・Pagination・StatCard・Pill)・components/layout/**・他の画面の components/features/**app/globals.css(★色の変数を足さない・フォントのスタックを変えない★)d-watch-mock.jsx・CLAUDE.md・docs/handoff.mddocs/decisions.md の D-180 とそれ以前の本文・「実装の記録」★git add -A / git add .・push★| # | 内容 | 本書の判断 | 監督が変えるなら |
|---|---|---|---|
| Q1 | 項6(アラートの「編集」を見出しの右へ)はモックと食い違わないか | ★食い違わない★: モックのアラート画面(d-watch-mock.jsx:583-584)には「編集」が無い(D-165 で追加)。D-165 は「一覧の上の『編集』」で、見出しの右も当たる。モックのレポート画面(:647-650)に見出しの右のボタンの例がある |
— |
| Q2 | 項9 でエラー一覧の案内を D-Sec と同じ「カードの外・下に 12px」にしない | ★しない★: エラー一覧は絞り込みが白いカードの中にあるので、案内もカードの中(絞り込みと表の間)が自然。文字・色・横並び・失敗件数が同じ行、は既に D-Sec と同じ | カードの外に出すなら、ErrorsScreen.tsx:517-527 をカード(:408)の前に移し、.editNotice を D-Sec の形にする。★ただしそうすると案内が絞り込みより上に来る★ |
| Q3 | 見出しの下の余白(エラー一覧 16・D-Sec 20・アラート ?)を揃えるか | ★本書では揃えない★(アラートは今の見た目を保つだけ)。段階0-4 の実測を D-181 の実装の記録に書く | 揃えるなら D-Sec の .header の margin-bottom(:17)とアラートの .header を同じ値に。指示書AZ 4d の前提(4px+16px=20px)を見直すことになる |
| Q4 | 「未解消のみ」「解消済み」の EN | ★モックの対訳(Unresolved / Resolved)★。「未解消のみ」の EN が数値カードの「未解消」と同じ "Unresolved" になる | "Unresolved only" 等にするなら lib/i18n.ts の1行(アラートと D-Sec の両方に効く) |
| Q5 | 項5 のエラー一覧の背景 | ★既に --sf-h★(ErrorsScreen.module.css:315)。変える箇所は無い |
— |
| 順 | 中身 | 段階 |
|---|---|---|
| 1 | 解消日時の判定(showsResolvedTime()+テスト)と3画面での使用・アラートの t()(5ファイル) |
1 |
| 2 | 見た目(5ファイル。2つに分けてもよい) | 2 |
| 3 | D-Sec の文言と辞書(2ファイル) | 3 |
| 4 | 資料(D-181・code-map・spec・fixtures。「実装の記録」を後で埋めるなら2つ) | 4・5 |
git add はファイルパスを明示する★。各コミットの前に git diff --cached --name-status で中身を確かめるshowsResolvedTime() の H1〜H6 が通り、壊すと赤になるdocs/code-map.md・docs/spec.md・docs/fixtures.md が食い違わないtsc 0件・lint 0件・npm test 全件通過・USE_FIXTURES=true npm run build 成功・API・データ層・型・YAML に差分なし657c6ff の上・作業ツリーが空・テスト件数を控えた(130 / 3,077)・見出しの下の余白を測った(または測れなかったと書いた)showsResolvedTime() と H1〜H6 を足し、★2通りに壊して赤を確かめて戻した★。3画面がこの関数を使う。アラートの「読み込み中…」・取得失敗を t() に通した。edit-drafts.ts の冒頭の説明を3画面に直したopacity の規則を消した(二重にしていない)★tsc 0件・lint 0件・npm test 全件通過(件数)・USE_FIXTURES=true npm run build 成功・画面の確認(アプリ内ブラウザ。または「監督に任せる」と書いた)・最後の grep