security
7bf0025+8 -8 / 1 files日次チェック状態更新
データ定義
Changelog
エンジンの新機能・修正・改善をリアルタイムで追跡。 git差分から自動生成される、部署別の変更ログです。
最終更新: 2026-07-16 06:07:01
273
総エントリ
71
新機能
31
修正
16
影響部署
7bf0025+8 -8 / 1 filesdd55241+74 -4 / 2 files285bfe3+6 -6 / 1 files31bd613+74 -4 / 2 filese8ccea6+7 -7 / 1 files91d4ca1+108 -4 / 2 files0946dbf+7 -7 / 1 files1e30540+7 -7 / 1 files1aa540c+108 -4 / 2 files6649cc6+5 -5 / 1 files20d3191+7 -7 / 1 files09491b7+74 -4 / 2 files0560047+4 -4 / 1 filesbf1af10+74 -4 / 2 files463b381+7 -7 / 1 filesf0b3dde+74 -4 / 2 files3779050+3 -3 / 1 files2921e7b+74 -4 / 2 files9f2883a+8 -8 / 1 files5eb3d6b+74 -4 / 2 filesc60ac20+6 -6 / 1 files135559d+108 -4 / 2 filese2cafcf+9 -9 / 1 files16ccd2d+5 -5 / 1 files8ab4d59+108 -4 / 2 files28ae181+7 -7 / 1 files334cbe8+6 -6 / 1 filese2c5c45+74 -4 / 2 filesf60721c+9 -9 / 1 filesa8ddc97+74 -4 / 2 files44c4139+9 -9 / 1 files2e3f9d6+74 -4 / 2 files386c76b+8 -8 / 1 filesc7cb1c8+74 -4 / 2 filesf6e0d5b+8 -8 / 1 files1daa3b8+74 -4 / 2 files7653423+8 -8 / 1 filese4f816a+108 -4 / 2 files5f550ee+9 -9 / 1 files0319748+7 -7 / 1 files24425e6+108 -4 / 2 filesfac798d+14 -14 / 1 filesd3aa731+7 -7 / 1 filesdc1b31f+74 -4 / 2 files27d07c7+6 -6 / 1 filesc101d4e+74 -4 / 2 filesfafbc8b+11 -11 / 1 filesab91660+74 -4 / 2 filesdca6968+6 -6 / 1 filesace305f+74 -4 / 2 files1cdeae7+8 -8 / 1 filesc7e74fc+74 -4 / 2 filesd199005+8 -8 / 1 filesf5e02bd+108 -4 / 2 files7433b20+7 -7 / 1 files210e772+6 -6 / 1 filese5dc565+108 -4 / 2 files4dd9b55+6 -6 / 1 files27061a9+9 -9 / 1 filese1a1bcf+74 -4 / 2 files8684f66+7 -7 / 1 filese8e6519+74 -4 / 2 files214e7cb+9 -9 / 1 files9b4b6ff+74 -4 / 2 filesebce64c+6 -6 / 1 filesf39c564+74 -4 / 2 files23c4cae+8 -8 / 1 files3cb7c82+74 -4 / 2 files7ad4c88+6 -6 / 1 filesc3b80d3+108 -4 / 2 files6200ff4+9 -9 / 1 filesd89891b+8 -8 / 1 files96da99a+108 -4 / 2 filesb8e4bdb+9 -9 / 1 files195bffa+7 -7 / 1 files0242b4a+110 -4 / 2 files101d92e+7 -7 / 1 files331bc68+102 -14 / 4 files- scorecard._rule_lead(): スコアデータから総評リードを機械生成。 - _build_summary(total 追加): 既定でルールベース。ai_summary["summary"] - CLI --ai-summary 既定 True→False。既定診断はルールベース総評で生成も67s - テスト: _rule_lead の強み/弱み/施術トーン/弱点なし分岐、AIオプトイン上書き、
9fa9898+732 -4 / 2 files463478a+7 -7 / 1 files2ab5a41+42 -4 / 2 files- PDF (analysis_report.pdf) のカテゴリ詳細「見つかった指摘」: 各項目に難易度バッジ - HTML (report.html / report.pdf) の検出項目: 各指摘に難易度バッジ + 平易説明を追加。 - 既存の check_fix_guidance.yaml (全92項目) を流用、_difficulty_fields で表示。AAA維持。
8da0a8b+2 -2 / 1 files653c1fc+5 -5 / 1 files- 具体的で身近な例を追加 (検索=「地域名+サービス名」/ AI=「近くで〇〇してくれるところは?」/ - 各 what 164〜192字に統一 (旧 70〜110字)。専門用語なし (jargon policy 準拠)。why/improve は維持。
2c6d8dc+4 -0 / 1 files87a8564+188 -2 / 4 files- benchmark.peer_strength_summary(bench): 各軸の (御社-同業中央値) を delta とし、 - report._benchmark_strength_html / pdf._benchmark_strength_pdf: HTML/PDF 両方に - AAA コントラスト: 淡背景+濃文字 (gap amber 8.0 / strong green 9.0 / chip 7.6-9.0)。axe AAA 通過。
5cd0266+9 -1 / 1 files944338c+127 -40 / 4 files- report._priorities_block_html を PDF と同じ top_priorities ベースに統一し、各点に - render_report_pdf: Web レポート(report.html)の体裁そのままを **Playwright Chromium** - AAA コントラスト: 難易度バッジを淡背景+濃文字 (easy 9.0/medium 8.0/hard 7.6)、
34d4835+565 -2 / 6 files- gen_fix_guidance.py: 全92検査項目の修正難易度(3段階)+平易説明を claude -p で生成 - data/mekiki/check_fix_guidance.yaml: 生成データ(92/92網羅、easy35/medium47/hard10)。 - definitions.load_fix_guidance / report._difficulty_fields: difficulty→表示(3段階+誰が - top_priorities に難易度+施術説明(fix_plain)を付与。PDFの「次の一手」「気になる点」
8fe35d0+42 -3 / 4 files- benchmark_seeding.yaml defaults: enrich_enabled(既定true) / enrich_per_run(既定10、Opus安全弁)。 - run_scheduler: シードした業種ごとに enrich_industry を呼び、補完数を集計・Slack通知。 - 失敗は業種単位で握って継続 (補完失敗がシード本体を巻き込まない)。
1fec937+63 -2 / 2 files- _index_from_gbiz が established_year(date_of_establishment から年抽出)/representative_name - _parse_year ヘルパ追加。
c1aa058+27 -8 / 2 files- _EXPORT_FIELDS に established_year / representative_name (HP会社概要由来) を追加。
- 各レコードに provenance {列名: gbiz|hp|discovery} を添付 (field_provenance を外販列分だけ)。
- CSV は値列のみ (provenance はネストのため JSON 側に載る、extrasaction=ignore)。
- meta に provenance 説明を追記。c20adfd+280 -6 / 3 files- company_index スキーマ拡張 (ALTER, 冪等): established_year / representative_name - upsert に provenance / fill_only_missing を追加。fill_only_missing=True で gBiz の - company_index_enrich.py: noroshi hp_company_info (claude -p Opus・grounded=記載なしnull・
1ab80d1+50 -32 / 2 files- 再販可否を source allow-list から「法人番号で実在裏取り済み + URLあり + active + - excluded_sources は config (mekiki.resale.excluded_sources) で調整可。既定 (gallery) は - meta に value (gBiz の URL カバレッジ ~1/5 を上回る付与率が価値) を明記。
5b76b9b+277 -0 / 2 files- 再販フィルタ: status=active かつ法人番号あり(実在裏取り)かつURLあり、source∈{gbiz,manual}
- スコア非結合: score_ledger を一切 join しない。外販フィールドは gBiz/法人番号由来の事実列のみで、
- 出典(gBizINFO/法人番号公表サイト)・ライセンス(政府標準利用規約2.0)・免責を meta に必ず添付。
- JSON/CSV 出力 (CSV は出典/免責を .NOTICE.txt に併記)。CLI あり。397293c+353 -4 / 3 files- 会社事実 (company_index) と 6軸診断スコア (score_ledger) を host で結合。
- API: list_companies(industry/prefecture_code/employees_min,max/has_url/with_score/limit) /
- CLI: python -m mekiki.diagnose.company_index_api {list|get|overview}。
- 段階2 (売れるデータ/営業機密の分離) は別途。source 列を返し外販フィルタの判断材料にする。21a4703+291 -0 / 5 files- data/mekiki/benchmark_seeding.yaml: 業種→keywords/target の単一定義。 - mekiki/diagnose/seed_scheduler.py: 現母数 < target の業種のみ不足分を per_run_limit - cron 毎日 4:30 (cron_required.yaml + crontab_audit、自己監査 11/11 OK)。
989d7cf+344 -3 / 9 files- infra/followup_watch.py: open Issue を毎日走査し、本文の機械可読マーカー - 規約: 目安期日のある Issue には FOLLOWUP マーカーを必ず入れる (#209 に付与済)。 - .env が import 時に GITHUB_TOKEN (repo にアクセス不可な PAT) を注入し、 - utils/github.py を新設 (gh_env/run_gh: GITHUB_TOKEN/GH_TOKEN を除外し gh の
0b56175+406 -0 / 6 files- .claude/commands/fix-tests.md (skill): 失敗テストの根本原因を直すプレイブック。 - infra/test_autofix.py (engine): red 検知→claude -p(skillルール)→ruff+pytest検証→ - test_monitor が red 時に config gate (test_autofix.enabled 既定OFF) で起動。 - claude に VERDICT を出させ source_fix / test_wrong / uncertain に3分岐。 - test_wrong / uncertain は修正せず Issue+Slack エスカレーション (red 維持)。 - source_fix で全green のときだけ PR。さらに diff がテストに触れたら needs-spec-decision
b43ccc9+2 -2 / 1 files70ac224+7 -7 / 1 files90c0650+406 -9 / 9 files- checkers/aio.py: 3信号を検出 - legacy総合(100pt)を崩さないようdiag_extra_criteria(diag専用枠)で実装。 - aio軸のstatus:not_implemented削除→総合が/5→/6に - check_definitions/category_explanations にaioカテゴリ追加 - テスト: AIOチェッカー9件+6軸計測化。uxcentra実測 AIO 69/C/高
d567231+117 -22 / 6 files- DiagAxisResult に priority/priority_unmet を追加。_aggregate_diag_axes が - しきい値は data/mekiki/scoring_v2.yaml の diag_priority (high:3.0/mid:1.5) に config化 - scorecard は上流 priority を表示(旧データ用に score ベース fallback を保持) - 例: uxcentra SEO 83点/B でも structured_data 等未対応で優先度=高(点数と独立) - テスト追加(重要度ベース判定/点数との独立性/しきい値)
4543e3e+14 -10 / 2 files- KIKIMIMI_GRADE_COLORS/_GRADE_BANDS/_GRADE_SUMMARY の最下位ラベルを F→E - ドーナツ表示ランクを total から S-E スケールで導出し、評価列と一致
43db5de+79 -21 / 3 files- 比例バー2列 → チラシ準拠の4列構成。スコア中央寄せ+均一グレーdash、 - AIOは準備中/—を維持(誇張回避) - 文字色は全て白背景でAAAコントラスト準拠(評価/優先度の色を実測7.0+で選定) - テスト3件追加(4列/未計測表示/優先度しきい値)
80696fb+28 -27 / 1 files- レーダー 200→380px(約2倍)、ラベル内寄せ(label_r 92→86)+フォント拡大で - カード背景/余白/角丸のラッパーを撤去し全幅化、ドーナツ/評価表も拡大 - 各ブロックの余白を広げて要素を大きく
8a8b873+99 -3 / 3 files- 1段目=点数ブロック(ドーナツ|総括)、2段目=詳細ブロック(レーダー|評価表)を - 総括ブロックを新設: グレード見出し語+一文+強み(上位2軸)/改善余地(70点未満)を - 総括タグの配色を AAA コントラスト準拠に(sc-sum-warn 7.67:1) - テスト3件追加(2段構成/総括の強み弱み/弱点なし時)
38d3126+7 -16 / 2 files- 診断結果スコアカード(ドーナツ+レーダー+表)を診断時スクショの直下へ移動し - score-block-v2 の score-grade-wrap(旧 大グレード"B"+総合点)を廃止 - score-block-v2 には noroshi評価・基礎/オプション内訳・CWV を残す
f198e2a+469 -0 / 5 files- WeasyPrint対策: SVGは図形のみ、CJKテキストは全てHTML側(フォント解決安定化) - 誇張回避: 未計測軸(AIO)はレーダー頂点を打たず「準備中」表示、同業他社平均は - HTML/PDF両系統で実レンダリング確認済(ドーナツアーク/transform配置/表) - テスト7件追加(未計測軸スキップ/peer_average条件表示/グレード閾値/dict受理)
2934362+570 -4 / 2 files83952f3+9 -9 / 1 files8682e17+319 -1 / 4 files- data/mekiki/scoring_v2.yaml: diag_axes(6軸定義) + diag_axis_map - scoring_v2.py: DiagAxisResult + _aggregate_diag_axes、ScoreV2Resultに - 誇張回避: 未実装のAIOは status:not_implemented で計測準備中扱い、偽スコアを - テスト5件(test_mekiki_diag_axes.py): 軸内正規化/未実装軸除外/対応表の
bd1c641+0 -0 / 0 files7824352+387 -34 / 13 files- utils/http_auth.py (新規): BasicAuth + resolve_basic_auth - requests経路: fetcher / page_fetch / extras_probe に auth= を伝播 - Playwright経路: site_capture / dom_verify / mobile_metrics / _axe_runner の - orchestrator.run_diagnosis(auth_username/auth_password) で束ね、CLIに --auth-user/--auth-pass を追加 - 外部API(PSI/Observatory/SSL Labs)はGoogle等が対象URLを直接叩くため
a0b8124+0 -0 / 0 files670589d+29 -0 / 2 files- KAJIBA_INSTRUCTIONS.md にセクション15を新設。dom_verify.py の仕組み - tmp/ は実在企業の診断データ(PII)を含むスクラッチ領域のため .gitignore に追加
0340a20+0 -0 / 0 files9d894a8+172 -0 / 3 filesc3600d4+118 -14 / 2 files- _build_summary_intro_section の呼び出し (弱軸/弱カテゴリ羅列は要点を埋もれ - _build_page_list_section の本編前段配置 (付録に降格) - 「今すぐ直すべき改善 TOP3」 → 「気になる点」 - 「同業比較」 → 「同業のなかでの位置」 - TOP3 のリード文も「評価の低い (= 改善インパクトの大きい) 順に...」から - _build_next_action_section: 「次の一手」を本編の締めに。priorities の - _build_appendix_divider: 本編と付録の視覚的な区切り。 - next-action-section / next-action-card (左罫線アクセント)
f28fc34+183 -23 / 4 files- visual_report.pdf (新規): シンプル表紙 (URL + 日付のみ・スコアなし) + - analysis_report.pdf: 既存の機械診断詳細 (Grade/Score/4軸/CWV/findings)。 - 互換: report.py 経由の write_pdf=True は両方を出力。paths["pdf"] は - pdf_document.render_visual_pdf(result, out_path) - pdf_document.render_analysis_pdf(result, out_path) - pdf_document.render_pdf_document は render_analysis_pdf エイリアス (互換) - TestVisualCover: 視覚表紙にスコア/グレードが出ないこと、cover-visual class - TestVisualHtml: 視覚 HTML が手記+強みのみで分析セクション無し、vo 無しでも成立
23756ad+65 -8 / 4 files- signature プロンプトに「特定の画像1枚への注釈に固執しない」を明示 - 指摘は「動線・構造・回遊・情報設計の階層」で - info_density_room の例も個別画像のキャプションから動線・情報設計レベルに - signature 出力に concrete_improvements[] (1〜3個・各60字以内) を追加 - レベル: サイト構造・動線・情報設計 (HTML/CSS の細部や個別画像加工は不要) - 例: 「ハンバーガー横に『作品一覧』アイコンを追加配置」 - 「もう一段引き立てる方角」と「体験はこう深まる」の間に - tests/test_visual_observation.py: 29ケース (+2 写真固執回避/具体改善案)
fcc7662+220 -139 / 4 files- category を strength_to_amplify > info_density_room > structural_uplift > - スキーマ: what_is_broken → what_is_strong + how_to_extend + - 言葉遣いを提案的・建設的に - 「デザインそのものを批判しない」「一般UX基準で切らない」「金額語彙禁止」 - moments_of_friction → moments_to_deepen (「〇〇があると体験が深まる」形式) - moments_of_engagement → strengths_observed (既に立っている強み) - 想定訪問者を全業種で「Google 口コミから来た初見」に統一 - デザイン批判禁止を明文化
061e385+218 -28 / 3 files- 「美しさより使いやすさ。世界観より到達できること」を最上位ルールに - behavior_blocker (最優先): ナビが隠れて次の一歩が止まる等、使いやすさの毀損 - worldview_tradeoff: 表現意図と引き換えに使いやすさが犠牲になる場合 - aesthetic_only (最後): 上記が無い場合の業種固有の美意識的毀損 - 出力スキーマに category フィールド追加 - why_it_matters は「経営文脈での意味(受注機会の取りこぼし方)」を必須化 - moments_of_friction を最重要に。「〇〇しようとしたが、〇〇のため止まった」形式必須 - moments_of_engagement の優先度は下げる (無くてもよい)
02666fa+15811 -13348 / 23 files- data/personas/*.yaml (12人): 建築家本人/CMO/経営者/受付GK/設計スタッフ/ - mekiki/evaluate/persona_panel.py: load_personas/run_panel(並列)/ - tests/test_persona_panel.py: 18ケース (yaml読込/プロンプト/並列/集約) - mekiki/diagnose/visual_observation.py: - observe_as_prospect: 業種別人物像を一人称に、スコア使わず観察事実のみ - find_signature_finding: 業種語彙(軒/水平ライン/階調 etc)で具体毀損1点 - from_screenshot_payload: capture_homepage の base64 → 一時PNG ヘルパ - mekiki/diagnose/orchestrator.py: run_visual_observation=True で screenshot
3c06cbb+8 -8 / 1 files527deac+774 -4 / 2 files644a189+9 -9 / 1 files12d3bf3+549 -9 / 5 files- レビュー→blocker を git worktree 隔離で claude -p 自動修正→ruff+pytest検証(green時のみ - 非 blocker は follow-up Issue を自動起票。 - 安全クラス(変更が safe_paths のみ+差分上限内=生成サイトPR等)かつ blocker0 かつ - --pr 単体 / 無引数=未レビュー open PR を poll(cron 用)。flock で多重起動防止。 - flock 多重起動防止 (cron間隔 < poll所要 で二重投稿レースの懸念)。 - PR タイトルの山括弧エスケープ (プロンプトインジェクション対策)。 - 未使用 headRefName 削除。 ---------
22022ba+628 -30 / 14 files- data/cron_required.yaml: command_substring を新パス (infra.* / collect.collect) へ更新。 - config.yaml: 母数蓄積スプリント中、Places 月1,000無料枠を backfill に全振り - collect/collect_health_check.py: 即時再検証の subprocess を scripts/collect.py → -m collect.collect に修正。 - infra/crontab_audit.py: _resolve_target を追加。crontab 行が文字列一致しても、 - tests/test_no_stale_scripts_refs.py: 旧 scripts.* への実 import 残存をガード (_archive 除外)。 - tests/test_crontab_audit.py: 解決チェックのテスト 6 件追加。 - live crontab: 上記 staged 版へ差し替え (バックアップ: logs/crontab-backup/)。
ac039cb+15 -7 / 1 files- 現行6KWの4つ(アトリエ系/住宅設計/注文住宅 設計/デザイナーズ住宅)が404=社名部分一致に出ず0件 - employee_count フィルタが「従業員数データのある法人」だけに絞り小規模アトリエを取りこぼし (4,263→177) - keywords を「建築」アンカー8語に差し替え。実測 非閉業ユニーク 3,102件 - employee_count を撤廃 (規模/サイト有無は enrich+スコア/4象限で後段判定) - corporate_types [301,305]→[301,302,303,304,305] に緩和
5e4eca0+42 -14 / 4 files- discover(): fetch 直後・enrich 前に load_existing_ids() で既存候補を除外 (既存ヘルパー流用) - Places コール会計を appended+deduped → appended に修正 (backfill.py / routine.py) - 重複再取得時に enrich_all が呼ばれないことを検証するテストを追加
317b373+95 -12 / 3 files- hp_company_info: 一次 model で抽出 → 1項目も取れなければ escalate_model で再抽出 - config: model=sonnet / escalate_model=opus (空にすれば単一運用)。 - Anthropic 公式「安価から始め必要時のみ上位へエスカレーション」の実践
a2a6b11+295 -8 / 9 files- db.py: monthly_usage テーブル (yyyymm, channel, places_calls) を新設 (CREATE IF NOT - places_quota.py (新規): 用途別クォータ設定の共通ヘルパー (places_active / monthly_quota)。 - backfill (channel=backfill) / routine (channel=outreach): discover 前に当月残枠を見て - db.website_status_counts: found/none/未判定 件数 + サイト無し率 (none/判定済)。 - backfill/routine の stats に記録。日次レポート (Slack) にサイト無し率 + 営業枠残を表示。
a429cf9+188 -16 / 7 files- HP弱 × 口コミ十分 × 評価>=rating_low → token_a (腕確か×HP勿体無い=最優先) - HP弱 × 口コミ少/評価欠損 → token_b (Web対策不十分の仮説で候補成立) - HP弱 × 口コミ十分 × 評価<rating_low → excluded_low_rating (粗悪業者リスク) - HP強 (noroshi_class=ok) → excluded_strong_hp (既に対応済み) - scoring/opportunity.py: classify_outreach() 純粋関数 + SEG_* 定数。 - db.py: candidates に outreach_segment 列 ALTER 追加。record_score に引数追加。 - pipeline.score_and_record: スコア時に classify_outreach も実行し記録。
ea3e335+228 -16 / 4 files- _build_prompt を grounding 型に: 各項目でまず原文を逐語引用 (evidence) → その
- _parse_extracted: grounding 形式 {field: {evidence, value}} をパースし、evidence が
- noroshi/model_ab.py (新規): 同一 URL を Haiku/Sonnet/Opus で grounding 抽出し
- config / docstring: model は当面 Opus、A/B 確認後に下位へ切替と明記。cc0d470+135 -35 / 8 files- enrich_all に max_workers 追加。候補内は順序維持 (places→url_discovery→ - claude_runner はサブプロセス起動・env ローカル dict で並列安全 (確認済)。 - API 系 enricher (gbiz_info_detail/places_info) に threading.Lock を追加し - discover に enrich_concurrency 引数 + config noroshi.enrich_concurrency - backfill は夜間=ボス不在なので enrich_concurrency 既定 5 で discover を呼ぶ。
b453b39+54 -7 / 3 files- places_info の FieldMask に places.websiteUri を追加。 - websiteUri が取れて company_url 未設定なら company_url を補完 - enricher 順序を gbiz_info_detail → places_info → url_discovery → hp_company_info に
b7bdb7a+675 -34 / 12 files- 充当: サイト無しが多いぶん過剰取得 (max_fetch) し、未スコア×サイト有り×非閉業を - 時間帯ガード: JST window (既定 2-8時、ボス不在帯) 外は --force 無しでスキップ。 - 使用量ガード: アクティブ5時間枠の消費トークンが上限超なら --force 無しでスキップ。 - utils/usage.py: ccusage blocks --active --json をパースし使用量ガード判定。 - db.unscored_with_site: 未スコア×サイト有り×非閉業を FIFO で返す (バックフィル対象)。
7aae8f8+421 -6 / 8 files- skill_signal: Maps rating ベース。口コミ5件未満は実力シグナル無効(中立)で - web_gap: 3要素の重み合成 (データ欠損要素は分母から外し正規化)。 - 判定保留 (skill/gap が None) は score=None で優先度に乗せない (中立)。 - noroshi/scoring/opportunity.py: compute_opportunity 純粋関数 (閾値/重みは config 化)。 - config.yaml noroshi.opportunity セクション追加。 - db.py: candidates に opportunity_score/opportunity_tier 列を ALTER ADD (非破壊migration)。 - routine.py: スコアリング後に places評価×HP弱さから機会スコアを算出し record_score。 - .gitignore: *.sqlite.bak-* / *.broken-* を全域除外 (noroshi PII DB バックアップの漏洩防止)。
3d98187+512 -1 / 7 files- NOROSHI_PLACES_API_KEY 未設定なら no-op (キー発行待ちでも全体フローを止めない) - businessStatus=CLOSED_PERMANENTLY は places_outreach_excluded フラグを立てる - FieldMask で必要最小限フィールドのみ要求 (Pro ティア課金、月5000無料枠内) - resolver 注入式 + HTTP層を分離しテスト容易に (実API/ネット非依存の18テスト) - enrichers chain / __init__ / 業種YAML / config / 部署docに登録
d0bcbae+22 -7 / 2 files- url_discovery.enrich: URL確定→found / 未発見・低確信→none / 既存URL有→found。 - これによりバックフィルは「サイト有りが目標数に達するまで追加取得」で充当可能になる - サイト無しセグメントは削除せず温存 (ボス方針: タグ付けして温存のみ)。
febe5c0+61 -0 / 2 files- gbiz_info.py に is_closed_corporation() を追加し、fetch() で閉鎖法人を除外。 - 実APIで確認: 東京・建築設計事務所で取得23件すべて status="-"、閉鎖の混入0件。
12d6e35+271 -2 / 7 files- noroshi/enrichers/hp_company_info.py: company_url がある候補の会社概要を WebFetch し - **モデルは Opus 固定** (config noroshi.hp_company_info.model)。実データ比較で Haiku は - chain registry / __init__ に登録、architecture_atelier.yaml enrichers に追加
2c2a3b6+378 -12 / 6 files- admin_index (data/mekiki/reports/index.html): - 検索ボックス (サイト名/URL/業種、クライアントサイドJSフィルタ) - 業種タグ表示 + 業種フィルタ (report.json の industry_id を _collect_reports が取得) - 営業済みタグ + 「営業済みのみ」フィルタ (noroshi DB の outreach_log を read-only 突合) - 並び替え (新着/スコア昇降/サイト名) - 各カードに data-* (host/industry/outreached/grade/score/date/search) - build_navigation_sidebar_html (個別レポートのサイドメニュー): サイト検索ボックス追加 - noroshi/db.py: outreached_hosts(conn) — 送付済み候補の company_url を正規ホスト集合で返す
69857e5+202 -4 / 7 files- 「うちだけ低評価で仕事を取ろうとしている」感を消す (全社を同じ物差し)。 - スコアが低すぎてスパムに見える問題を、現実的な散らばり(上位アンカー)で緩和。 - 良いサイトが高得点で出ることを示し、mekiki が甘/辛採点でない根拠にする。 - utils/stats.py: top_quartile(p75) を新設 (mekiki/noroshi 共用、DRY)。 - mekiki/diagnose/benchmark.py: industry_benchmark に top_total(同業上位/優良 p75) を追加。 - mekiki/diagnose/report.py: 同業比較ブロックに「同業上位(優良)」列を追加 (旧台帳は median 代替で互換)。 - noroshi/db.py: size_tier(employee_number→大手/中堅/小規模) + - CLAUDE.md 統一インターフェース表に utils.stats を追記。
aae4140+379 -0 / 7 files- 透明な自動化(方針B): AI を人間に偽装しない。「自動診断しました」と明示し、
- 挨拶1文 → 刺さる一言 → 短く簡潔。mekiki 診断の要点を本文に表示(PDF添付だけに頼らない)。
- CTA は「具体的な改善提案・お見積もり」を返信 or 電話で。レポートは添付済(十分詳しい)。
- 件名は穏当・透明なスコア提示型。締めのご挨拶あり。
- 特定電子メール法: 送信者表示 + オプトアウト導線(「不要」返信)を全通に必須。
- ibuki ギャラリーリンクは将来用に枠だけ確保(gallery_link: disabled、充実後に
- data/noroshi/templates/architecture_atelier_{v1,followup_1,followup_2}.md
- noroshi/outreach/templates.py: load_template / render / render_template /29ce559+9 -9 / 1 files24b5ab7+74 -4 / 2 files1165c6f+8 -8 / 1 files8f6e1c0+74 -4 / 2 filesf47fa5e+7 -7 / 1 files42a0fcf+108 -4 / 2 filesae294a3+7 -7 / 1 filesd9c5634+7 -7 / 1 filescd7930e+108 -4 / 2 files7bae417+6 -6 / 1 files4e817d8+5 -5 / 1 filescea62c7+74 -4 / 2 files190ac6f+9 -9 / 1 files94dab09+74 -4 / 2 files67c3578+5 -5 / 1 files13ddb7b+294 -4 / 2 files2d8f4ab+5 -5 / 1 files5017bef+448 -0 / 3 files- scripts/utils/screenshot.py: - next_start_server: `next start` を別ポート起動して URL を yield する - take_screenshot_from_next_project: 上記を使い1コマンドで NextJS スクショ。 - scripts/create.py: - _build_nextjs_visual_review_prompt: Hero真っ黒/コントラスト/モバイル横スク/ - _take_nextjs_review_screenshots: desktop full / desktop hero / mobile full - _run_nextjs_visual_loop: HARD_LIMIT=8 反復、DONE 検知で早期終了、 - _run_create_nextjs Step 7: ビルド成功後に視覚ループを起動、
56fbd9f+0 -0 / 0 files4f0b32a+1563 -1000 / 15 files- scripts/ops/db_corruption_health_check.py (新設): - config.yaml: notify_on に db_recovery イベントを登録 - tests/test_db_corruption_health_check.py: 15件 PASS - docs/incidents/db-corruption-20260428.md: at 登録手順を追記 - KAJIBA_INSTRUCTIONS.md: db_corruption_health_check の紹介行追加 - scripts/_archive/section_engine/test_*.py: section_engine 退避時に -m scripts.ops.db_corruption_health_check \\ - ruff check 全クリア
43cb962+480 -2 / 8 files- scripts/utils/db.py: - _check_integrity_and_repair(): PRAGMA integrity_check で破損検知時に - get_connection(auto_repair=True) でプロセス内初回1回だけ integrity_check - checkpoint_wal(): PRAGMA wal_checkpoint(TRUNCATE) を実行 - 復元時 Slack db_recovery 通知 - scripts/ops/db_checkpoint.py: cron 1時間毎想定の CLI スクリプト - scripts/collect.py: - _start_global_watchdog(): 240分(既定)超過で自プロセスSIGTERM
39fe4ad+0 -0 / 0 files5695320+38 -9 / 2 files- title 解決順を slug → url に拡張、fallback で title/name も継続サポート - grade を「[grade=S]」表記でヘッダに追加 - summary / reference_strengths / reference_warnings を順に出力 - mood / rationale は古い形状向けの後方互換として残置 - tests/test_create_nextjs_inspiration.py の _sample_inspiration() を
a6d0b90+256 -4 / 2 filesd2665b1+7 -7 / 1 files2808078+431 -34 / 4 files- scripts/inspiration_engine.py : run_inspiration_pipeline に skip_code_phase - scripts/create.py : - _format_inspiration_context_for_nextjs() 新設。story / information_design / - _build_nextjs_prompt(inspiration=...) 拡張。クライアントブリーフの直後に - _run_create_nextjs() に Step 2 として inspiration_engine 呼び出しを追加。 - main() に --no-inspiration フラグ。Phase 1-2 相当の高速モード退化用。 - run_create() のシグネチャに use_inspiration=True を追加。 - tests/test_create_nextjs_inspiration.py : 10件追加(コンテキスト整形、
ca1ce6a+0 -0 / 0 files85a58da+630 -7 / 5 files- scripts/postprocess_nextjs.py : 検証パイプライン本体。 - scripts/create.py : `_run_create_nextjs()` の Step 5 として - main() の出力メッセージで build_ok を反映、リトライ後成功時の表示も明示。 - ruff check : 全クリア - pytest tests/test_postprocess_nextjs.py : 23件 PASS - E2E: scaffold → run_postprocess の一気通貫テスト - 雛形 package.json の build script を `next build --turbopack` に変更済み
853334c+0 -0 / 0 files3040389+2526 -1522 / 34 files- templates/scaffolds/nextjs/ : Next.js 15 + React 19 雛形(package.json, - scripts/utils/nextjs_scaffold.py : 雛形コピー+プレースホルダ置換 - scripts/create.py : --engine=nextjs を追加。scaffold → プロンプト構築 → - pnpm-workspace.yaml : output/generated/create/* を pnpm workspace package - scripts/_archive/section_engine/ : section_engine を退避(廃止、復活手順は - ruff check : 全クリア - pytest tests/test_nextjs_scaffold.py : 8件 PASS - create.py --engine=nextjs --dry-run : prompt 3,689 chars 生成成功
32bc66e+74 -4 / 2 files9612ab2+8 -8 / 1 files19ce5c9+108 -4 / 2 files0099bf2+7 -7 / 1 files0a8f612+9 -9 / 1 filesc90cfae+108 -4 / 2 files2ba65f4+7 -7 / 1 files2429fb6+7 -7 / 1 files5242dbe+460 -4 / 2 filesae20f06+9 -9 / 1 filesea9cc9c+12 -2 / 2 files- resolve_actual_urls 内で非HTTP href をスキップ(根本対策) - resolve_actual_urls 呼び出し後にも URL バリデーションを追加(防衛的二重チェック) - siteinspire/io3000 の site_url_selector に :not([href^='#']):not([href^='javascript']) を追加
7199dbe+0 -0 / 1 filesbe4b8db+2 -0 / 1 filesbdfc18d+1 -0 / 1 filesdcfe638+411 -0 / 2 files- _iter_log_lines_within: logrotate の .log + .log.1/.2 を一括読み、 - CLI: --days N / --dry-run - 異常検知時は 🚨、正常時は ✅ で Slack に投稿
11703a3+129 -1 / 5 files- health_report.user_systemctl_env() ヘルパー追加: XDG_RUNTIME_DIR と - _check_services / is-enabled / auto_diagnose._restart_service が - tests/test_health_report.py 追加: 4件テスト(未設定時の自動付与、 - ops/logrotate.d/kajiba: /etc/logrotate.d/kajiba 用テンプレート - daily/health-check/auto-diagnose/security 等は daily rotate 14世代 - 日付付き collect-*/reanalyze-*/analyze-* は weekly rotate archive/ 配下
f567818+95 -8 / 2 files- _terminate_with_escalation(pid) を追加: SIGTERM 送信後 10秒 grace で - _detect_runaway_processes() から呼び出して critical 検知時に使用。 - 4件テスト追加: SIGTERM即死 / SIGTERM無視→SIGKILL / SIGTERM送信失敗 /
59a3ac6+0 -0 / 1 files774bf37+80 -7 / 4 files- scripts/collect_health_check.py: status.stdout.strip() → rstrip("\n")
- scripts/collect.py: mark_source_infinite_scroll が書き込み後に
- tests/test_health_check.py: リグレッションテスト追加
- tests/test_auto_diagnose.py: _detect_runaway_processes を全テストでb81a878+0 -0 / 1 filesc0eca2d+10 -0 / 1 filesa230319+74 -4 / 2 filesa1286da+5 -5 / 1 filesd8bc6f3+372 -4 / 2 filesfa10cd6+26 -28 / 1 files1bf9085+236 -13 / 5 files- A: listing取得にwith_hard_timeout(90)をSIGALRMでかける - B: extract_urls_from_listing内でpage.is_closed()チェック、driver死亡時は即return - C: auto_diagnoseに_detect_runaway_processes追加(>2h warn/>4h SIGTERM) - D: detect_infinite_scroll + mark_source_infinite_scrollでsources.yaml自動更新 ---------
fa24459+293 -4 / 6 files- data/aesthetic_antipatterns.yaml(新規) - 禁止フォント (Inter/Roboto/Arial/Open Sans/Lato/Space Grotesk) - 禁止カラースキーム(白背景+紫グラデ等) - タイポグラフィ必守原則(極端ウェイト 100/200 vs 800/900、サイズ差3x+) - 配色必守原則(支配色70%+ / アクセント15%以下) - モーション必守原則(見せ場1つ集中 > 散在マイクロ) - 業種別フォントプール(code_technical / editorial / startup_modern 等) - format_aesthetic_antipatterns_for_prompt(industry) を prompt_data.py に追加
b0f9530+130 -2 / 2 files- CSS側は前回 rule-block 限定化済みだったが、JS側は re.S で全体横断のまま
- 同様に {...} ブロックごとの match に変更
- 既存: typeof gsap === 'undefined' のみ
- 追加: !window.gsap, !globalThis.gsap, window.gsap && ...,
- モダンな実装の正当なガード方式を誤検知しないように
- inset 単位混在検出の境界ケース
- GSAP ガード複数パターン認識
- hero_scrub pin:true 尊重8377899+58 -18 / 2 files- 既存: inset\([^)]*\d+%\s+\d+[^%] - 例: inset(0% 0% 0% 100%) が誤マッチ(\d+ が "10"+"0" にバックトラック分割、 - 修正: 両方向(%→unitless と unitless→%)を明示的に検出する regex に差し替え - モダンな実装では :hover::after、:hover .child-icon などが主流 - FLUXWORKS は 11 個の hover ルール定義があるのに「5個全て効果なし」と誤判定 - 修正: ::before / ::after / 直接の子要素(最大3つ)までスタイル差分を取る
d156a03+68 -16 / 1 files- Aider unified-diffs 実証: partial diff より block replacement が安定 - Anthropic Plan Mode + Lost in the Middle: 局所パッチは隣接箇所を - FLUXWORKS Plan Mode 版で error=2-3件のプラトーが11反復続き - _build_combined_fix_prompt(escalate=False) を追加 - _run_fix_loop でプラトー検出 → escalate を渡す - RunLog に escalations カウントを記録(観測用)
7e1efda+339 -0 / 3 files- phase_timings: 各フェーズの所要秒 - code_plan: Plan Mode 成果物サマリ (pin数/z-index層/tween数) - fix_loop: 反復ごとの errors/warnings/autofix_s/stalled - final: pass/errors/warnings/iterations/stop_reason/total_s - scripts/utils/run_log.py: RunLog クラス + CLI - create.py: RunLog 初期化と finalize を組み込み、_run_fix_loop に - tests/test_run_log.py: finalize/flush_partial/summarize のテスト3件
77a6830+251 -0 / 1 files- generate_code_plan(): pin区間表 / z-index台帳 / tween依存グラフ / - code_plan.json + code_plan.md として保存 - Phase5 プロンプトに code_plan.markdown を注入、厳守事項を明示 - 空pin禁止(変化要素3つ未満)・overwrite:"auto" 強制・z-index層管理
e658e28+62 -11 / 3 files- hero_scrub_invisible: pin: true を検出してscrubアニメを誤検知しないよう修正
- css_js_conflict_check: re.S で全CSS横断マッチしていたのを同一ルール{...}内限定に
- _FIX_INSTRUCTIONS に scroll_velocity_text / marquee_text の具体修正手順を追加
- technique_rules violations を technique 名で _FIX_INSTRUCTIONS に自動マッピングe6c87ba+214 -4 / 2 files27fac1c+13 -13 / 1 filesa814cc6+118 -0 / 2 files- .service の ExecStart と EnvironmentFile の .env を舐め、 - enabled なサービス同士で同一ポートがあれば warning - disabled は衝突候補から除外(運用上無害) - auto_diagnose が検知時に Slack 通知(毎日5:00 cron)
534dab3+85 -5 / 2 files- health_report._check_services で systemd --user サービス稼働確認 - 死亡時は overall_status=critical に昇格 - auto_diagnose._restart_service で自動再起動(cron毎日5:00) - systemdのRestart=on-failure→always+StartLimitIntervalSec=0は
4e492d7+9433 -89 / 90 files1b940cc+47 -41 / 1 filesa063ef5+436 -4 / 2 files808c47a+26 -23 / 1 files0b3776e+2 -0 / 2 files7444d7f+22 -0 / 24 files98c000f+15 -7 / 1 files- visual-review - self-check - autofix-N(修正ループ) - inspiration-code / create(メインコーディング)
5eb64ea+75 -5 / 3 files- capture_animation_frames (180s)
- check_responsive (120s)
- capture_interactions (120s)
- page.set_default_timeout(30000) + navigation_timeout
- wait_until を networkidle から load に変更
- page.on('crash') ハンドラでクラッシュ可視化fae740a+60 -5 / 3 files- tests/conftest.py で ERROR_LOG_DIR を tmp_path にリダイレクト(autouse) - 本番の汚染エントリ14件は別途削除済み
3963d09+93 -21 / 11 files127891f+133 -0 / 4 filescfb91de+285 -2 / 1 files22a497a+24 -16 / 2 filesc5227f9+7 -7 / 1 files95d99bb+53 -2 / 1 files9645442+1 -1 / 1 files1a0e47e+4 -4 / 1 files49b8091+53 -2 / 1 files355f491+0 -0 / 1 files69f1732+15 -18 / 1 files6fd3228+183 -2 / 1 files10e5151+17 -0 / 1 files6a38dd2+97 -0 / 2 files- .claude/commands/root-cause.md: 根本原因調査スキル(分析+提案のみ、修正は実行しない) - collect_health_check.py: 自動修正失敗時にauto_diagnoseを自動起動 - ヘルスチェック→分類→根本原因分析→Slack通知の完全自動パイプライン
aa064a5+349 -0 / 2 files- health_reportからcron/disk/db/git問題を自動分類 - エラーパターン繰り返し検知 - 根本原因(一時的/構造的/環境)と修正提案をSlack通知 - cron追加: 毎日5:00 JST - テスト8件追加
d229b9b+181 -0 / 2 files- scripts/ops/antipattern_watch.py: git diffで新規/変更bug_idを検出、自動修復実行 - cron追加: 毎日0:30 JST - テスト3件追加(初回実行/ID抽出/変更なし)
e63a6c9+121 -1 / 2 files- _check_and_archive_disk(): shutil.disk_usageで使用率判定→archive.pyで退避 - run_recovery_cycleに回復戦略として組み込み - テスト2件追加(閾値未満/退避先未設定)
121b243+61 -6 / 2 files- deploy.py: _run_review_gate()実装、review_siteのpass/failでデプロイ可否判定 - デフォルトreview_gate=True、不合格時はSlack通知+デプロイ中止 - テスト追加: 品質ゲートブロックケース
f89a742+440 -0 / 3 files- scripts/ops/deploy.py 新設: works/コピー→build_frontend_data→PR→subtree pushを一貫実行 - create.py: 生成完了後に自動デプロイ(--no-deployでスキップ可) - テスト7件追加(resolve_slug, copy_to_works, run_deploy成功/失敗)
edb2365+249 -1 / 4 files- health_report: _check_git_integrity()でfsck破損・欠損を検知、レポートに統合 - auto_recovery: _check_and_repair_git()でリモートからpack修復、回復サイクルに統合 - テスト: TestGitIntegrity 2件追加(healthy/corrupt検出)
4f6226b+810 -0 / 6 files- /changelog ページ新設(夜桜テーマ統一、日付別タイムライン表示) - 統計サマリー(総エントリ/新機能/修正/影響部署数) - コミットタイプ別バッジ、部署タグ、BREAKING表示 - ChangelogEntry/ChangelogData型定義をtypes.tsに追加 - ヘッダー・フッターにChangelogナビリンク追加 - build_frontend_data.pyにchangelog.json同期処理追加 - changelog_generator.pyに--syncオプション+sync_to_frontend()追加 - cron: 毎朝6:07にchangelog更新+フロントエンド同期
f31765c+562 -0 / 1 files7ee75e9+689 -1 / 6 files- changelog_generator.py: gitログ解析→構造化JSON(data/changelog.json) - コミットタイプ(feat/fix/update等)の自動パース+日本語ラベル付与 - 変更ファイルから影響部署を自動推定(DEPARTMENT_MAP) - インクリメンタル更新(前回処理済みコミット以降のみ追加) - /update-docsスキル追加、テスト29件全通過
65b74f8+512 -39 / 4 files- auto_recovery.py: 統合回復サイクル - 収集エラー検出→fix-collectスキルで自動修復 - パイプラインエラー繰り返しパターン→エラー種別に応じた対応 - rate_limit/overloaded: 傾向記録(runnerリトライ済み) - timeout: インシデント記録+設定見直し推奨 - process_crash: 構造的問題として手動調査推奨 - ロック機構(同一エラー1日1回制限) - 回復結果のJSONL記録 + Slack通知
d2adaf3+811 -0 / 8 files- error_analyzer.py: claude_runnerエラーログ分析、パターン検出、インシデント記録 - エラー種別/Phase別/モデル別の統計サマリー - 繰り返しパターンの自動検出(label×error_typeの閾値判定) - レコメンデーション自動生成(rate_limit頻発→間隔調整等) - health_report.py: 統合ヘルスレポート - cronジョブ鮮度チェック、ディスク使用状況、DBバックアップ状態 - overall_status(healthy/warning/critical)の自動判定 - スキル2種: /system-health(ヘルスチェック)、/diagnose(障害診断)
001aabc+509 -144 / 6 files- subprocess.run → Popen+スレッド監視に移行、プロセス生存中は自然完了を待つ - expected_duration(想定時間)超過はログ警告のみ、hard_timeout(安全弁15分)でのみ強制終了 - エラー原因分類: rate_limit/overloaded/process_crash/timeout/not_found/broken_pipe - エラー種別に応じたリトライ判定・待機時間(rate_limit→段階的バックオフ) - エラーログをlogs/claude_runner/にJSONLで蓄積(ナレッジ用) - elapsed_secondsを全結果に含めてデータ収集 - timeout引数は後方互換でhard_timeoutに変換 - inspiration_engine/site_visionの個別リトライを撤廃、runner委譲
71e0b81+182 -19 / 2 files- generate_information_design: 最大2回リトライ、タイムアウト段階的延長(240→300→360s) - JSON解析失敗時はプロンプトにJSON厳格化指示を追加して再試行 - revise_information_design: 最大1回リトライ、タイムアウト延長(180→240s) - フォールバック(最小3セクション)は全リトライ失敗後の最終手段に - リトライ動作のユニットテスト6件追加(計33テスト)
a3ed2b3+9 -7 / 1 files- info-designのプロンプト増加でPhase 2が180sに収まらないケースあり - revise後のJSONでimagesがstring型で返るケースのガード追加
d629610+730 -33 / 9 files- 新規: data/persuasion_models.yaml (AIDCA/PAS/BAB/4Ps) - 強化: formats.yamlに推奨説得モデル追記 - 強化: information_design.jsonにペルソナ・CTA戦略・メッセージ階層追加 - 後方互換: 全引数optional、未指定時はAI推論で従来通り動作 - テスト: 13テスト追加 (計27件、全PASS)
93d1d97+129 -21 / 2 files- mainブランチ以外では自動クリーンアップ/修正を実行しない - コミット前にgit pull --rebaseでリモート同期(push rejected防止) - scripts/カテゴリを追加(自動修正後の変更が適切に分類される) - テスト31件全通過
e7b3731+203 -7 / 6 files- /post-generate: featureブランチ→PR→自動マージ→Vercelデプロイの統合フロー - /add-to-dashboard: gallery-items.json更新 - /add-to-ibuki: works/へのコピー+フロントエンド反映 - CLAUDE.mdスキル一覧更新 - 既存ファイルのlint修正 (deploy_preview.py, test_inspiration_engine.py)
ed92da4+12 -0 / 1 files4c9128e+255 -8 / 3 files- /clean-repo スキル: 手動でリポジトリをカテゴリ別にコミット&クリーン化 - _auto_clean_repo(): 自動修正前に未コミット変更を自動整理 - gallery/data/kb をカテゴリ別にコミット - ルート直下のゴミファイル(.jpg,.tmp等)を自動削除 - これにより未コミット変更が原因で自動修正がスキップされる問題を解消
70fcb09+15129 -13253 / 4 files0f034d6+39 -21 / 3 files68fca60+18 -40 / 22 files3a51758+12 -0 / 1 files457eb03+102 -2 / 3 files- 成功率50%以下で自動検知(success_rate_drop) - Traceback 3件以上で自動検知(uncaught_traceback)
46cca14+71 -35 / 3 files5fad7ba+492 -0 / 3 files9eca352+40 -15 / 2 files- collect.pyからリアルタイム通知を削除(2時間おき×12回は過多) - daily_collect_report.py 新規: 前日分のDB登録件数を集計してSlack通知 - cron登録: 毎朝10:00 JST実行
81d6c41+13 -7 / 1 files7a039bb+20 -1 / 3 files- --disable-gpuだけではスクショ時にGPUプロセスが呼ばれてクラッシュしていた - swiftshaderでソフトウェアレンダリングを強制 - siteinspireのセレクタが #main-content を拾っていた問題の再発防止
49e9c04+244 -30 / 4 files- test_browser.py: モック単体(8件) + Playwright実起動統合(3件) - 実起動でnew_context/スクショが成功すること(GPUクラッシュの直接検証) - test_weekly_report.py: 単体(6件) + generate_report統合(3件) - patternsテーブルなしでgenerate_report()が完走すること(実際のエラー経路) - test_notify.py: メッセージ生成(5件) + config連動(3件) - notify_onにcollect_summaryがない場合の非送信も検証 - test_standards_update.py: タイムアウト値の下限チェック(4件) - 600s未満にならないことをガード
35b311a+207 -0 / 3 files- test_browser.py: launch_browser()の引数・GPU無効化・webkit・エラー (8件) - test_weekly_report.py: patternsテーブル未存在時のフォールバック (6件) - test_notify.py: collect_summary通知のメッセージ生成・アイコン分岐 (5件)
2061697+44 -4 / 5 files2da7d78+89 -19 / 12 files- scripts/utils/browser.py 新規: --disable-gpu付きの共通起動関数 - 全19箇所のlaunch()呼び出しをlaunch_browser()に統一 - 対象: collect/review/forge/redesign/screenshot/study等10ファイル
537dc49+4909 -2 / 17 files- AURORA Wellness (美容/サービス紹介) - 鐵 KUROGANE Forge (製造業/ブランドストーリー) - NEXUS Creative Agency (エージェンシー/コーポレート)
e0b1a97+1 -1 / 1 files2d9521c+4873 -395 / 57 files- LUMIÈRE Photography (portfolio, エレガント・光・繊細) - KINETIC Lab (tech, 未来的・サイバー・ダイナミック) - 和菓子処 月の雫 (food, 静謐・和モダン・伝統美)
ffc4dae+49 -424 / 15 files2c878cb+8 -1 / 1 files