[{"data":1,"prerenderedAt":263},["ShallowReactive",2],{"content-/taiwan-osat-monthly-automation":3,"all-pages-for-dir":242,"related-/taiwan-osat-monthly-automation":243,"og-image-/taiwan-osat-monthly-automation":262},{"id":4,"title":5,"body":6,"category":222,"concepts":223,"description":224,"extension":225,"meta":226,"navigation":227,"ogImage":223,"path":228,"project_name":229,"published":230,"publishedAt":231,"seo":232,"source":233,"stem":234,"tags":235,"todo":223,"unpublished":230,"updatedAt":223,"__hash__":241},"pages/2026-08/2026-08-12/taiwan-osat-monthly-automation.md","台湾の後工程テスト4社の月次売上まとめを、毎朝のコマンドチェーンから自動生成する",{"type":7,"value":8,"toc":211},"minimark",[9,13,17,25,32,35,40,43,59,62,65,68,71,74,77,80,84,87,90,93,96,99,102,105,109,112,115,118,121,124,127,134,137,140,147,150,153,192,195,198,204,207],[10,11,5],"h1",{"id":12},"台湾の後工程テスト4社の月次売上まとめを毎朝のコマンドチェーンから自動生成する",[14,15,16],"p",{},"外部のブログで、台湾のテスト会社の月次売上をまとめた記事を見かけた。\n会社ごとに月次売上の推移を並べ、その下に前月からの増減を置く構成だった。",[14,18,19,20,24],{},"読んでいるうちに、これは自分のところで毎月作れるのではないかと思った。\n毎朝走らせている ",[21,22,23],"code",{},"/make-diary"," のチェーンには、台湾の月次売上を取り込むステップがすでにある。\nそこで金額が更新されているなら、まとめ記事まで続けて作れるはずだった。",[14,26,27,28,31],{},"その記事を Chrome DevTools で開かせて、構成を確認させた。\nあわせて、手元のデータとも突き合わせてもらった。\n",[21,29,30],{},"aseMonthlyRevenue.ts"," は 2026年7月の 737.8億NT$ まで入っていて、外部記事の数字とそのまま一致した。\nPowertech 82.7億、KYEC 39.9億、Ardentec 17.7億も同じだった。",[14,33,34],{},"材料は揃っていた。\n決めることは、どの範囲を取るか、どう図にするか、どこに出すか、の3つだけだった。\n結果から言えば、この3つでそれぞれ一度ずつつまずいた。",[36,37,39],"h2",{"id":38},"_4社まとめて1本にする","4社まとめて1本にする",[14,41,42],{},"分割するか1本にまとめるかを聞かれたので、1本にまとめると答えた。\n対象は元の記事と同じ、後工程のテスト系4社に絞った。",[44,45,46,50,53,56],"ul",{},[47,48,49],"li",{},"ASE（日月光投控）：パッケージングとテストのフルライン世界最大手",[47,51,52],{},"Powertech（力成科技）：DRAM や NAND などメモリ後工程に特化",[47,54,55],{},"KYEC（京元電子）：テスト専業。AI / HPC 向けのバーンインが主戦場",[47,57,58],{},"Ardentec（欣銓科技）：テスト専業。大手 IDM からの受託が主力",[14,60,61],{},"図の型も元の記事を踏襲して、1社につき3段にした。\n上から月次売上、前月差、勢いの3つを縦に積む。",[36,63,64],{"id":64},"水準を並べても記事にならない",[14,66,67],{},"売上高そのものを並べるだけだと、書けることは「今月も過去最高」で終わってしまう。\n前月差を取ると、増え方のペースが見える。\nその前月差がさらに増えたかどうか（2次差分）まで取ると、加速しているのか失速し始めたのかが分かる。",[14,69,70],{},"7月の ASE は、前月差が +80.0億で勢いが +52.5 だった。\n増えているのではなく、増え方そのものが広がっている状態を指す。",[36,72,73],{"id":73},"スクリプトとテストを先に書かせた",[14,75,76],{},"チャートは毎月作り直すので、手で SVG を置く選択肢は最初から無かった。\n13ヶ月 × 3段 × 4社の座標を毎月手で置けば、どこかで必ずズレが混入する。\n生成スクリプトを書かせて、あわせてテストも書かせた。\nスクリプトが405行、テストが123行になった。",[14,78,79],{},"テストは図の見た目ではなく、数字の意味を守るところに置いた。\n2次差分は3点目から出ること、軸の上限は必ず入力以上を返すこと（バーが枠から飛び出さない）、そして最新月を過去最高と呼べるかどうかの判定。\nこのうち過去最高の判定は、書かせたその日のうちに効いた。",[36,81,83],{"id":82},"過去最高が嘘になりかけた","「過去最高」が嘘になりかけた",[14,85,86],{},"図ができた時点で、4社とも最新月が過去最高だった。\nところが手元の TS データは 2024年1月以降しか入っていない。\nつまりここで言う「過去最高」は、「2024年以降で最高」でしかなかった。",[14,88,89],{},"ASE は 2022年9月に 666.5億、Powertech は 2022年6月に 80.9億を付けている。\nこの2つをスクリプトの判定に織り込ませて、データ範囲内で最高かつ過去のピークも超えている場合だけを過去最高と呼ぶようにした。\n判定し直しても7月の ASE と Powertech は過去最高のままで、2022年のピークを4年ぶりに超えたことになった。",[14,91,92],{},"中身は変わらなかったが、直さないまま書いていたら、正しい結論を間違った根拠で出すところだった。\n図の崩れは目で気づける。\nデータの範囲は目では気づけない。",[36,94,95],{"id":95},"数えずに書くと外れる",[14,97,98],{},"記事の主張のひとつに、4社そろって前月差も勢いもプラスになった、というものがあった。\n図に出している直近13ヶ月の範囲では、今回が初めてに見えた。",[14,100,101],{},"機械的に数えさせたら、2024年以降で春節明けの反動増が出る3月を除いて、2025年8月と今回の2回あった。\n「13ヶ月ぶり」ではなく「2回目」。\n図に映っている期間と、事実を数える期間は別物だった。",[14,103,104],{},"コマンドの手順書には、「N ヶ月ぶり」「〜で最大」と書く前に必ず数える、という一文を厳守事項として入れさせた。\n数えずに書かない、と明記しておかないと来月また同じことをやる。",[36,106,108],{"id":107},"_13ヶ月より長くできない","13ヶ月より長くできない",[14,110,111],{},"最初は4社を1枚に並べた俯瞰図も作らせていた。\nこれが縦に潰れた。\n一度は目盛りと注記の位置を直させて読める状態にしたものの、期間を延ばすたびに同じ問題が戻ってくる。",[14,113,114],{},"原因は図の作り方そのものにあった。\nこのサイトの図はホバーに頼らず、数値を図の中に直接描く。\nホバーに逃がすと、スマホで見たときに読めなくなるからだ。\n720px の幅では1ヶ月あたり48px が下限で、それ以上詰めるとバーの上の数値ラベルが重なって潰れる。",[14,116,117],{},"長い期間を見たいなら、置き場所を変えるしかない。\nそう考えたところで、2024年からの推移は各社のモニタリングページにあるのではないかと思い当たった。\n確認させたら、直近31ヶ月の月次売上と前年同月比の折れ線がすでにあった。\n記事の俯瞰図と完全に重複していた。",[14,119,120],{},"俯瞰図は削除させて、記事からモニタリングページへ片方向のリンクだけ張った。\n逆向きは張らない。月次記事は毎月増えるので、モニタリング側にリンクを足していくと保守が破綻する。\n記事に残った図は、各社1枚、直近13ヶ月の3段図が4枚だけになった。",[36,122,123],{"id":123},"作ったものの居場所を見失った",[14,125,126],{},"記事ができたあと、図と記事がどこに入ったのか分からなくなった。\n記事ページを開いたら404が出たこともあって、スクリーンショットを撮り、「今どこに入ってますか」と聞いた。\n404のほうは編集中の HMR による一時的なもので、curl では 200 が返っていた。",[14,128,129,130,133],{},"記事に「未分類」のバッジが出ていたのが引っかかっていた。\n調べさせたら、トップの「記事」カードから ",[21,131,132],{},"/blog"," に入って、8月12日のセルに他の記事と並んでいた。\n移動させる必要は無かった。",[14,135,136],{},"つまり、「未分類」のバッジを、記事がどこにも入っていない印だと読み違えていた。\nバッジが付いているかどうかと、一覧に載っているかどうかは別だった。",[36,138,139],{"id":139},"月に1回だけ走らせる",[14,141,142,143,146],{},"最後に、この一連の作業を ",[21,144,145],{},"/tw-test-monthly-report"," として切り出させた。",[14,148,149],{},"台湾の上場企業は毎月10日までに前月の単月売上を開示する。\n記事を作れるのは月に1度、10日前後だけになる。\n毎朝走るチェーンに入れる以上、残りの日は何もせずに即座に終わってほしい。",[14,151,152],{},"判定は最初のステップに置いた。",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-bash shiki shiki-themes vitesse-light vitesse-light","node scripts/generate-tw-test-charts.mjs --check\n# MISMATCH=...   → 4社の最新月が不一致。まだそろっていないので SKIP\n# LATEST=2026-07 → その月の記事が既にあれば SKIP、無ければ生成に進む\n","bash","",[21,161,162,179,186],{"__ignoreMap":159},[163,164,167,171,175],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"senZ8","node",[163,172,174],{"class":173},"sdGka"," scripts/generate-tw-test-charts.mjs",[163,176,178],{"class":177},"snbK4"," --check\n",[163,180,182],{"class":165,"line":181},2,[163,183,185],{"class":184},"sxvE3","# MISMATCH=...   → 4社の最新月が不一致。まだそろっていないので SKIP\n",[163,187,189],{"class":165,"line":188},3,[163,190,191],{"class":184},"# LATEST=2026-07 → その月の記事が既にあれば SKIP、無ければ生成に進む\n",[14,193,194],{},"呼び出し位置は、台湾の月次売上を更新するステップの直後にした。\n失敗してもチェーン全体は止めない。\n月次まとめが数日遅れても困らないので、警告だけ残して先へ進ませる。",[36,196,197],{"id":197},"この日つまずいた3箇所",[14,199,200,201,203],{},"材料が揃っていたぶん、この日の作業は最初から最後まで見せ方の話だった。\nどの範囲を取るか（13ヶ月で切って、長期はモニタリングへ振る）。\nどう図にするか（水準ではなく差と勢いを主役にする）。\nどこに出すか（",[21,202,132],{}," に載せて、月に1回だけ走らせる）。",[14,205,206],{},"一番危なかったのは、そのどれでもない。\n2024年より前のデータが手元に無いことに気づかないまま、「過去最高」と書きかけたところだった。",[208,209,210],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":159,"searchDepth":181,"depth":181,"links":212},[213,214,215,216,217,218,219,220,221],{"id":38,"depth":181,"text":39},{"id":64,"depth":181,"text":64},{"id":73,"depth":181,"text":73},{"id":82,"depth":181,"text":83},{"id":95,"depth":181,"text":95},{"id":107,"depth":181,"text":108},{"id":123,"depth":181,"text":123},{"id":139,"depth":181,"text":139},{"id":197,"depth":181,"text":197},"dev",null,"外部ブログで見た台湾テスト企業の月次まとめを、自分のコマンドに作り替えた記録。ASE、Powertech、KYEC、Ardentec の月次売上を水準、前月差、勢いの3段チャートにして、月に1回だけ走るコマンドとして毎朝のチェーンに差し込むまで。","md",{},true,"/taiwan-osat-monthly-automation","mdx-playground",false,"2026-08-12T00:00:00.000Z",{"title":5,"description":224},"make-diary","2026-08/2026-08-12/taiwan-osat-monthly-automation",[236,237,238,239,240],"自動化","SVG","Claude Code","OSAT","コマンド設計","sL9A-PUOAKJTNd7gy209MVvoqlF34TgbpUWSRMAWzJQ",[],[244,248,251,255,259],{"title":245,"path":246,"publishedAt":247},"Claude Codeセッションのタイムライン可視化スクリプトを開発した -- history.jsonl解析・GAP_THRESHOLD比較検証・make-diary統合まで","/timeline-visualization-script","2026-04-13T00:00:00.000Z",{"title":249,"path":250,"publishedAt":231},"図解60型カタログのフレームを統一する。スライドの領域を命名して意味グリッドで揃えた1日","/diagram-catalog-frame-grid",{"title":252,"path":253,"publishedAt":254},"図解60型のグリッド整列を記録に残し、統合カタログを新設した","/diagram-grid-alignment-catalog","2026-08-11T00:00:00.000Z",{"title":256,"path":257,"publishedAt":258},"2026年8月10日の開発日記 - 図解カタログ27型をグリッドに載せ直した","/2026-08-10-diary","2026-08-10T00:00:00.000Z",{"title":260,"path":261,"publishedAt":258},"図解カタログ27型をグリッドで整列させ、手順をスキルへ戻すまで","/diagram-catalog-grid-alignment","https://log.eurekapu.com/og/blog/taiwan-osat-monthly-automation.png?v=2026-08-12T00%3A00%3A00.000Z&title=%E5%8F%B0%E6%B9%BE%E3%81%AE%E5%BE%8C%E5%B7%A5%E7%A8%8B%E3%83%86%E3%82%B9%E3%83%884%E7%A4%BE%E3%81%AE%E6%9C%88%E6%AC%A1%E5%A3%B2%E4%B8%8A%E3%81%BE%E3%81%A8%E3%82%81%E3%82%92%E3%80%81%E6%AF%8E%E6%9C%9D%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%8B%E3%82%89%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B&author=Kei%20Komatsu&sig=cf879c2436e6e01b",1786603439575]