[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"content-/accounting-standards-faithful-reproduction":3,"all-pages-for-dir":458,"og-image-/accounting-standards-faithful-reproduction":459},{"id":4,"title":5,"body":6,"category":439,"description":440,"extension":441,"meta":442,"navigation":132,"path":443,"project_name":444,"published":445,"publishedAt":446,"seo":447,"stem":448,"tags":449,"todo":455,"unpublished":445,"updatedAt":456,"__hash__":457},"pages/2026-04/2026-04-23/accounting-standards-faithful-reproduction.md","会計基準データベースの原文忠実化 - 42基準のソース収集からURL198件の検証まで",{"type":7,"value":8,"toc":424},"minimark",[9,13,17,22,25,29,32,38,41,44,52,210,214,217,220,224,227,255,262,266,269,272,276,279,306,309,313,316,394,397,400,405,408,411,414,417,420],[10,11,12],"h1",{"id":12},"会計基準データベースの原文忠実化",[14,15,16],"p",{},"CF計算書の基礎知識ページに会計基準の引用コンポーネント（BookkeepingStandardRef）を組み込もうとしたら、そもそもソースデータのJSONが原文と食い違っていた。修正を始めたら芋づる式にASBJのドメイン移行が見つかり、最終的にリンクページ198件のURL検証まで走ることになった1日。",[18,19,21],"h2",{"id":20},"発端-引用コンポーネントの追加","発端: 引用コンポーネントの追加",[14,23,24],{},"CF計算書の基礎知識ページに、連結CF作成基準の条文を引用表示するBookkeepingStandardRefコンポーネントを追加した。ところが、コンポーネントが参照するJSONデータに第二一項や注解注1・注2が入っていない。条文テキストを表示しようにも、表示する中身がなかった。",[18,26,28],{"id":27},"jsonを直す前に-codexからの指摘","JSONを直す前に: Codexからの指摘",[14,30,31],{},"最初はHTMLテンプレート側を修正しようとしたが、Codexレビューで方針を変えた。",[33,34,35],"blockquote",{},[14,36,37],{},"HTMLは生成物であり、JSON（ソースデータ）を編集すべき",[14,39,40],{},"HTMLに条文テキストをベタ書きすると、他のコンポーネントから同じ条文を参照できなくなる。JSONを唯一のソースにして、HTMLはそこから生成する。この指摘でJSONファーストの方針が固まった。",[18,42,43],{"id":43},"provision_numberのフォーマット修正",[14,45,46,47,51],{},"条文番号の表示で「注解注1」が「第注1項」と表示される不具合を見つけた。",[48,49,50],"code",{},"formatProvisionNumber","関数が全ての番号に「第○項」パターンを適用していたのが原因。",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// Before: 全て「第○項」で表示\nconst formatProvisionNumber = (num: string) => `第${num}項`\n\n// After: 「注」で始まる場合はそのまま表示\nconst formatProvisionNumber = (num: string) =>\n  num.startsWith('注') ? num : `第${num}項`\n","typescript","",[48,60,61,70,127,134,140,162],{"__ignoreMap":58},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sxvE3","// Before: 全て「第○項」で表示\n",[62,71,73,77,80,84,87,91,94,98,101,104,108,112,116,118,121,124],{"class":64,"line":72},2,[62,74,76],{"class":75},"stQ0i","const ",[62,78,50],{"class":79},"senZ8",[62,81,83],{"class":82},"shFtX"," =",[62,85,86],{"class":82}," (",[62,88,90],{"class":89},"s4oTP","num",[62,92,93],{"class":82},": ",[62,95,97],{"class":96},"sSkh3","string",[62,99,100],{"class":82},")",[62,102,103],{"class":82}," =>",[62,105,107],{"class":106},"sMJiu"," `",[62,109,111],{"class":110},"sdGka","第",[62,113,115],{"class":114},"sHkkW","${",[62,117,90],{"class":110},[62,119,120],{"class":114},"}",[62,122,123],{"class":110},"項",[62,125,126],{"class":106},"`\n",[62,128,130],{"class":64,"line":129},3,[62,131,133],{"emptyLinePlaceholder":132},true,"\n",[62,135,137],{"class":64,"line":136},4,[62,138,139],{"class":68},"// After: 「注」で始まる場合はそのまま表示\n",[62,141,143,145,147,149,151,153,155,157,159],{"class":64,"line":142},5,[62,144,76],{"class":75},[62,146,50],{"class":79},[62,148,83],{"class":82},[62,150,86],{"class":82},[62,152,90],{"class":89},[62,154,93],{"class":82},[62,156,97],{"class":96},[62,158,100],{"class":82},[62,160,161],{"class":82}," =>\n",[62,163,165,168,171,174,177,180,183,185,187,190,192,195,198,200,202,204,206,208],{"class":64,"line":164},6,[62,166,167],{"class":89},"  num",[62,169,170],{"class":82},".",[62,172,173],{"class":79},"startsWith",[62,175,176],{"class":82},"(",[62,178,179],{"class":106},"'",[62,181,182],{"class":110},"注",[62,184,179],{"class":106},[62,186,100],{"class":82},[62,188,189],{"class":75}," ? ",[62,191,90],{"class":89},[62,193,194],{"class":75}," : ",[62,196,197],{"class":106},"`",[62,199,111],{"class":110},[62,201,115],{"class":114},[62,203,90],{"class":110},[62,205,120],{"class":114},[62,207,123],{"class":110},[62,209,126],{"class":106},[18,211,213],{"id":212},"asbjドメイン移行の発見","ASBJドメイン移行の発見",[14,215,216],{},"条文の原文を確認しようとASBJサイト（asb.or.jp）にアクセスしたら、ページが見つからない。調べてみると、ASBJが旧サイト（asb.or.jp）から新サイト（asb-j.jp）にドメインを移行していた。",[14,218,219],{},"旧URLでアクセスするとリダイレクトされるものもあるが、404を返すものもある。standards.jsonに登録していたsource_urlの多くが旧ドメインのままだった。",[18,221,223],{"id":222},"_42基準のソース一括収集","42基準のソース一括収集",[14,225,226],{},"ドメイン移行を発見したことで、全基準のソースを一度洗い直す判断をした。",[228,229,230,238,244,249],"ul",{},[231,232,233,237],"li",{},[234,235,236],"strong",{},"ASBJ 24件",": 新サイト（asb-j.jp）からHTMLで取得",[231,239,240,243],{},[234,241,242],{},"JICPA 10件",": PDFで取得",[231,245,246,243],{},[234,247,248],{},"FSA（金融庁）",[231,250,251,254],{},[234,252,253],{},"合計42基準","のソースを手元に確保",[14,256,257,258,261],{},"agent-browserでHTMLを取得し、",[48,259,260],{},"html_to_json.py","スクリプトで条文JSON形式に変換した。31件が自動変換に成功し、残りは手動で調整した。",[18,263,265],{"id":264},"cf-jitsumu-shishinjsonの原文照合","cf-jitsumu-shishin.jsonの原文照合",[14,267,268],{},"CF実務指針のJSONについて、Turso DBに格納済みのOCRテキストと突き合わせた。",[14,270,271],{},"照合の結果、既存JSONには53条文しか入っていなかったが、原文には61条文ある。欠落していた8条文を追加し、既存条文のテキストも原文に合わせて修正した。",[18,273,275],{"id":274},"jsonの上書き事故と復元","JSONの上書き事故と復元",[14,277,278],{},"ここで事故が起きた。新しく取得した基準JSONを既存ファイルに上書きしてしまい、引用マッピング（citations.json）が壊れた。citations.jsonは各ページがどの条文を引用しているかの対応表で、条文IDが変わると全ての引用リンクが切れる。",[53,280,284],{"className":281,"code":282,"language":283,"meta":58,"style":58},"language-bash shiki shiki-themes vitesse-light vitesse-light","# gitから復元\ngit checkout -- data/citations.json\n","bash",[48,285,286,291],{"__ignoreMap":58},[62,287,288],{"class":64,"line":65},[62,289,290],{"class":68},"# gitから復元\n",[62,292,293,296,299,303],{"class":64,"line":72},[62,294,295],{"class":79},"git",[62,297,298],{"class":110}," checkout",[62,300,302],{"class":301},"snbK4"," --",[62,304,305],{"class":110}," data/citations.json\n",[14,307,308],{},"復元後、新規ファイルのみを保持する方針に切り替えた。既存のcitations.jsonが参照しているIDは一切変更せず、新しい基準は新規ファイルとして追加する。上書きではなく追加。この原則を忘れると同じ事故を繰り返す。",[18,310,312],{"id":311},"リンクページ198件のurl検証","リンクページ198件のURL検証",[14,314,315],{},"ASBJのドメイン移行がわかった以上、リンクページ（supports/link）に載せている全URLも検証が必要になった。198件のリンクを1件ずつチェックした。",[317,318,319,335],"table",{},[320,321,322],"thead",{},[323,324,325,329,332],"tr",{},[326,327,328],"th",{},"対象",[326,330,331],{},"件数",[326,333,334],{},"内容",[336,337,338,350,361,372,383],"tbody",{},[323,339,340,344,347],{},[341,342,343],"td",{},"e-Gov",[341,345,346],{},"19件",[341,348,349],{},"法令URLの更新（パス構造変更）",[323,351,352,355,358],{},[341,353,354],{},"JICPA",[341,356,357],{},"6件",[341,359,360],{},"リンク切れ修正",[323,362,363,366,369],{},[341,364,365],{},"ASBJ",[341,367,368],{},"55件",[341,370,371],{},"asb.or.jp → asb-j.jp に更新",[323,373,374,377,380],{},[341,375,376],{},"standards.json",[341,378,379],{},"25件",[341,381,382],{},"source_urlの旧→新ドメイン更新",[323,384,385,388,391],{},[341,386,387],{},"その他",[341,389,390],{},"残り",[341,392,393],{},"変更なし（正常応答を確認）",[14,395,396],{},"合計で105件のURLを書き換えた。",[18,398,399],{"id":399},"今日の学び",[401,402,404],"h3",{"id":403},"jsonファーストの原則","JSONファーストの原則",[14,406,407],{},"HTMLにデータを埋め込むと、他のコンポーネントから参照できなくなる。Codexの指摘がなければHTMLを直接編集し続けて、後から引用コンポーネントを作るときに二重管理に陥っていた。",[401,409,410],{"id":410},"上書きではなく追加",[14,412,413],{},"既存のマッピングファイルが参照しているIDを変更すると、依存先が全て壊れる。パッケージマネージャのsemverと同じ発想で、既存IDは不変にして新規追加で対応する。gitからの復元で事なきを得たが、コミット前に気づけたのは運がよかった。",[401,415,416],{"id":416},"ドメイン移行は連鎖する",[14,418,419],{},"ASBJのドメイン移行1件を見つけたら、standards.jsonのURL、リンクページのURL、引用コンポーネントの参照先と、3箇所に波及した。1つの外部依存の変更がどこまで影響するかを洗い出す作業は、地味だが後回しにすると被害が広がる。",[421,422,423],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}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);}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}",{"title":58,"searchDepth":72,"depth":72,"links":425},[426,427,428,429,430,431,432,433,434],{"id":20,"depth":72,"text":21},{"id":27,"depth":72,"text":28},{"id":43,"depth":72,"text":43},{"id":212,"depth":72,"text":213},{"id":222,"depth":72,"text":223},{"id":264,"depth":72,"text":265},{"id":274,"depth":72,"text":275},{"id":311,"depth":72,"text":312},{"id":399,"depth":72,"text":399,"children":435},[436,437,438],{"id":403,"depth":129,"text":404},{"id":410,"depth":129,"text":410},{"id":416,"depth":129,"text":416},"dev","連結CF作成基準の条文JSONを原文に合わせて拡充し、全42基準のソースを収集。ASBJ旧ドメインから新ドメインへの移行を発見し、リンクページ198件のURL検証・修正を実施した記録","md",{},"/accounting-standards-faithful-reproduction","eurekapu-nuxt4",false,"2026-04-23T00:00:00.000Z",{"title":5,"description":440},"2026-04/2026-04-23/accounting-standards-faithful-reproduction",[450,451,452,365,453,454],"会計基準","JSON","条文データ","URL検証","agent-browser","memo",null,"Cw9nt6FLxWPjQQxFx2BWq56uuT5NGbdPiH8P5vujBls",[],"https://log.eurekapu.com/og/blog/accounting-standards-faithful-reproduction.png?v=2026-04-23T00%3A00%3A00.000Z&title=%E4%BC%9A%E8%A8%88%E5%9F%BA%E6%BA%96%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%8E%9F%E6%96%87%E5%BF%A0%E5%AE%9F%E5%8C%96%20-%2042%E5%9F%BA%E6%BA%96%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E5%8F%8E%E9%9B%86%E3%81%8B%E3%82%89URL198%E4%BB%B6%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=4b6107e84ff5fc76",1780786054467]