レポートと締めのロック

月次締めのたびにワークスペースに書き出されるもの、ロック済みの各月がすべて照合済みだったかどうかをどう記録するか、そして締めた期間のロックが、理由を書き残さずに報告済みの数値が変わることをどう防ぐか。

締め処理が書き出すもの

締め処理は 1 社・1 か月を単位に実行されます。ここでは、締め処理がレビュー用ワークスペースに残すものと、読み取るものを説明します。ハルノでは各社を client(クライアント)と呼びます。フォルダ名、コマンド、ダッシュボードではこの語が使われます。パス中の <client> は、workbooks/ の下にある会社のフォルダ名で、たとえば cobalt-systems です。

出力内容更新されるタイミング
財務諸表パッケージ会社自身のレイアウトによる財務諸表。その会社の締め処理のたび。
残高照合資料各明細表を元帳と照らして再計算したもの。その会社の締め処理のたび。
投資家向けレポート1 社分の数値を、その会社の投資家向けにまとめたもの。その会社の締め処理のたび。
reports/<client>/adjustments.csv修正履歴。その会社の締め処理のたび(ロックの後)。
ポートフォリオダッシュボードこのワークスペースで締め処理を行ったことがあり、会社ごとの定義ファイル(spec、YAML 形式)が現在も残っているすべての会社を表示します。少なくとも 1 社の締めが完了した締め処理の実行が終わるたび。
ledger/ledger.sqliteすべてのレポートの元になる統一元帳。ワークスペースに 1 つのファイルで、各社の帳簿は分けて保持されます。締め処理のたび。ロック済みの月の内容が変わるのは、ロック解除の後だけです。
ledger/staging/科目マッピングを適用する前に、締め処理が各元ファイルから作成する作業用コピー。開く必要はありません。締め処理のたびに作り直されます。
ledger/evidence/すべての元ファイルの読み取り専用のコピー。新しいファイルまたは修正されたファイルが取り込まれたとき。
.haruno/skills/QuickBooksCFO/specs/<client>.yaml定義ファイル。科目マッピングと、お客様が記録した判断を保持します。締め処理によって変わることはありません。お客様が回答するか、変更を承認したときだけ変わります。

会社から受け取ったファイルは、届いた場所(workbooks/<client>/)にそのまま残ります。締め処理はそれらを読み取るだけで、編集することはありません。

レポートとダッシュボードは macOS アプリで閲覧し、どれも PDF として書き出して他の人に送れます。

締め処理そのものはお客様のコンピュータ上で実行され、対象会社のデータを送信することはありません。アシスタントを使っているかどうかにかかわらず同じです。会話では、お客様が送った内容が送信されます。ハルノに何かを依頼すると、お客様が入力した内容とツールが出力した内容(勘定科目名、表示科目、数値、検出事項)が、Inferara のホスティングサービスを経由して、回答するモデル提供事業者に送られます。詳しくは「データの行き先」をご覧ください。

送るレポート
会社の投資家に送るのは投資家向けレポートです。ダッシュボードにはワークスペース内のすべての会社が含まれているため、投資家には送らないでください。

財務諸表パッケージ

財務諸表パッケージは、会社自身のレイアウトによる月次の報告資料です。表示科目、小計、表示単位は、会社から送られてきた財務報告パッケージと同じです。そのブックの構成そのものから作成されるためです。数値はすべて元帳から取られ、手入力された箇所はありません。

上から順に:

  1. 表紙。会社名、「Financial Reporting Package」、「Unaudited Monthly Results Through」に続く締め月、報告通貨(1 回だけ記載)。
  2. 「Restated periods」(修正再表示された期間)。ロック済みの月のロックが解除され、その後に数値が変わった場合にのみ載ります。
  3. 「Issued with unresolved findings」(未解決の検出事項を残したままの発行)。重大度「高」または「中」の検出事項が未解決だった場合にのみ載ります。各検出事項を重大度、チェック、対象とともに挙げ、該当する月が「fully reconciled」(すべて照合済み)ではなく「reported with exception」(例外事項ありで報告済み)であることを明記します。
  4. 貸借対照表。元帳にある月ごとに 1 列です。会社自身の CHECK 行(通常は資産合計から負債及び純資産合計を差し引いたもの)は、1 セント以内で一致しない月にフラグが付きます。
  5. 損益計算書。同じ列に加えて、最新月の属する暦年について暦年累計の列を 1 つ設けます。設立来の累計は示しません。
  6. 支払能力と継続企業の前提。常に含まれるのは、運転資本、流動比率、現預金、純資産合計、ランウェイとその算定根拠です。勘定科目表に関連当事者との残高がある場合は、第三者に対する債務とは分けて表示します。ASC 205-40 の継続企業の前提に関する兆候のうち該当したものを挙げ、該当がなければその旨を記載します。報告するのは兆候であり、継続企業の前提について結論を示すことはありません。
  7. 売上に対する回収。財務諸表から入金されたと推定される額を、計上された売上と比較します。銀行口座の合計ではなく、導出した推定値であることが明記されます。
  8. 売上総利益率(粗利率)。月ごとに、売上高から売上原価を差し引いて算定します。定義ファイルで収益源ごとに売上の行と原価の行が対応付けられている場合は、収益源ごとにも示します。

財務諸表は会社の表示単位に従い、会社が千単位で報告していれば千単位で表示します。最後の 3 つのセクションと修正再表示の行は、千単位に丸めず実額で表示し、その旨を記載します。通貨は 1 社につき 1 つで、換算は行いません。キャッシュ・フロー計算書が取り込まれていない場合、ランウェイは現預金の増減(資金調達を含む)に基づいて算定され、その旨が表示されます。詳しくは「支払能力の兆候」をご覧ください。

残高照合資料

残高照合資料は、締め月について、会社の明細表を総勘定元帳(GL)と照合したものです。締め月とは、元帳に照合データがある最新の月です。ヘッダーにはその月と通貨が記載されます。

「Status summary」(ステータスの要約)。会社の残高照合資料が照合している貸借対照表の勘定科目ごとに 1 行で、列は「Account」「Schedule」「Per GL」「Per schedule」「Difference」「Status」(勘定科目、明細表、GL 残高、明細表残高、差額、ステータス)です。「Schedule」列には、そのシートが何として読み取られたかが表示されます。たとえば rollforward(期首残高、増減、期末残高)、prepaid_amort(前払費用の償却)、fixed_assets(減価償却台帳)、accrual_reverse_new(未払費用の戻入れと再計上)です。

ステータス意味
「reconciled」(照合済み)明細表と総勘定元帳の差が 1 セント以内です。
「exception」(例外)差が 1 セントを超えています。重要性によって扱いが緩和されることはなく、200 ドルの差額も例外です。
「open」(未確定)差額を算出できませんでした。

「Coverage alerts」(照合漏れの警告)。重要な残高のうち照合がまったく行われていないものを、科目名と残高とともに挙げます。重要かどうかは、定義ファイルに記録された会社の重要性の金額基準で判定します。お客様が適用除外にした勘定科目は含まれません。

勘定科目ごとのセクション。各明細表の行を、写すのではなく再計算して示します。ロールフォワードと未払費用の行には「Recomputed」(再計算値)列があり、記載された期末残高と一致しない行にはフラグが付きます。前払費用明細表では締め月までに費用化された額と残額を、固定資産台帳では月次の減価償却費、減価償却累計額、帳簿価額を示します。

再計算することに意味があります。残高照合資料は、シートに入力された差額とは無関係に、明細表自身の行を合計します。そのため、古いままの差額や手入力された差額によって、明細表が裏付けていない一致が示されることはありません。シートに総勘定元帳の数値が記載されていない場合は、財務諸表から取り込んだ残高と突合します。

例外と明細表の欠落は、recon_exceptionsrecon_coverage として検出事項にも反映されます。詳しくは「照合ステータス」をご覧ください。

投資家向けレポート

投資家向けレポートは、ダッシュボードのうち 1 社分のページを、帳簿をつける人ではなく会社に出資する人に向けて編集したものです。締め処理のたびに書き直されるため、常に最新のエクスポートを反映しています。創業者から投資家向けアップデートを求められたときに送るのが、このレポートです。

掲載される内容

  • 現預金、バーンレート、ランウェイ。ランウェイのタイルは、直近の現預金の増減(資金調達を含む)に基づく数値で、その旨が表示されます。
  • 財務諸表パッケージと同じ表示の財務諸表。ただし、突合の差額を示す CHECK 行は含みません。
  • 直前期間との比較。
  • 売上に対する回収。
  • 売上総利益率(粗利率)。
  • カテゴリ別の営業費用。会社が部門別に分けている場合は部門別の営業費用も。
  • 従業員数と従業員 1 人あたりの数値(会社が従業員数を提供している場合)。
  • リカーリング収益(MRR、ARR、解約率)と、CAC(顧客獲得コスト)および CAC ペイバック期間(会社にこれらのデータがある場合)。
  • 支払能力パネルとその兆候。これがなければ、レポートは正確でありながら同時に誤解を招くものになります。
  • 帳簿から言えることと言えないことについての注記。たとえば、2 か月分のデータが必要な数値に対して 1 か月分しかない場合などです。

掲載されない内容

  • 整合性の検出事項。
  • 科目マッピングの表。
  • 照合ステータス。
  • 差異ウォッチリスト。
  • 締めステータスとロックの記録。
  • 管理状況を示すタイル(財務諸表の突合、照合の例外、予算との乖離が最大の科目)。
  • 予実比較。ただし、会社の定義ファイルで掲載が認められている場合を除きます。
  • 顧客単位の明細(顧客別売上の表や、数値の根拠となる請求書や明細表の行)。数値そのものは残ります。
  • 定義ファイルの管理者に向けた注記。

掲載されないとは、非表示ではなく、そもそも含まれないという意味です。これらのセクションはレポートに一切入らないため、その PDF にも含まれません。ダッシュボードにある、質問をチャットに入力するボタンも表示されません。

ヘッダーには、このファイルが何であるかが記載されます。会社の投資家向けに作成されたこと、元帳に残高がある最新の月までを対象とすること、数値の元になったエクスポートの日付(ある場合)、そして報告通貨です。対象は必ず 1 社だけです。

創業者の計画と帳簿との比較を投資家に見せるかどうかは、創業者が決めることです。そのため予実比較は、会社の定義ファイルで次の設定によって含めない限り、掲載されません。値は true か false でなければなりません。引用符で囲んだ "no" を含め、それ以外の値は推測で解釈されることなく拒否されます。

yaml
investor:
  budget: true

締めステータス

ロック済みの月にはそれぞれ、ロックした時点で把握されていた内容の記録が付いています。ダッシュボードでは、各社のページ上部に、ロック済みの月数と並んでチップとして表示されます。

締めステータスチップ意味
「fully reconciled」(すべて照合済み)ロック済みのすべての月が、未解決事項のない状態で締められました。
「reported with exception」(例外事項ありで報告済み)ロック済みの月のうち少なくとも 1 か月が、重大度「高」または「中」の検出事項が未解決のまま締められました。
「open」(未ロック)黄色まだロックされた月がありません。
「not recorded」(記録なし)灰色ロック済みの月の締め処理で、検出事項が記録されていません。以前のバージョンによる締め処理は記録していなかったためです。

最も弱い状態が優先されます。1 つのチップがロック済みのすべての月を代表するため、チップが示すのは、すべての月について成り立つことだけです。いずれかの月の例外は、何も記録していない月より優先され、何も記録していない月は照合済みの月より優先されます。チップ横の注記には、ロック済みの月数と、まだロックされていない月があればその数が表示されます。そのうち何か月に例外があるかは表示されません。どの月に例外があるかを確認するには ingest.py periods を実行してください。各月の行に締めステータスが表示されます(「数値の追跡」を参照)。

未解決として数えるのは、重大度「高」と「中」の検出事項だけです。重大度「低」の検出事項、支払能力の兆候、質問事項は数えません。資金が不足している会社であっても、その記帳が照合されていないことにはなりません。詳しくは「重大度」をご覧ください。

架空のデモデータによる出力例:Ironwood Materials, Inc. のダッシュボードのヘッダー。緑色の「fully reconciled」チップとロック済み 41 か月の表示があり、その下に「ties」(一致)と照合の例外 0 件を示すタイルが並んでいます。
すべて照合済み。会社と数値は架空のデモデータです。
架空のデモデータによる出力例:Cobalt Systems, Inc. のダッシュボードのヘッダー。赤色の「reported with exception」チップ、ロック済み 41 か月、未解決のチェック 3 件の表示があり、その下に ($6,600) を示す財務諸表の突合のタイルと、照合の例外 1 件が並んでいます。
例外事項ありで報告済み:それでもロックされ、未解決のチェックが明記されています。会社と数値は架空のデモデータです。

同じステータスが同じ文言で、ダッシュボードのヘッダー、期間一覧の各月の行(ingest.py periods。「数値の追跡」を参照)、財務諸表パッケージの「Issued with unresolved findings」の注記、そして締め処理が終了時に出力する要約に表示されます。架空のデモの Cobalt Systems の場合、要約は次のとおりです:

text
locked 2023-02-28 … 2026-06-30 (41 periods) — reported with exception: 3 unresolved finding(s) (presentation_tieout, recon_exceptions, unmapped_active_account); re-opening one needs a reason (`ingest.py reopen`)
未解決の一覧はロック時点の記録です
未解決として挙げられるチェック(ダッシュボードのヘッダーでは「unresolved:」の後、締め処理の要約では括弧内)は、月をロックした時点で未解決だったものです。1 回の締め処理は、ロックするすべての月に同じ一覧を書き込みます。その後に解消された問題や、最後の月だけで見つかった問題も、すべての月に対して表示されたままになります。チップにポインタを合わせると一覧が表示されます。

ロック

締め処理が数値を報告したすべての月は、一致したかどうかにかかわらず、締め処理の終了時にロックされます。検出事項はロックの可否に関与しません。将来の予算に出てくる月のように、資料に記載されているというだけで存在する月はロックされません。

ロックは、帳簿に対する判定ではありません。
報告したすべての月は、いずれにしてもロックされます。ロックは、その月がすべて照合済みだったか、例外事項ありで報告されたかを記録します。また、ロックされた月では、報告した数値が記録を残さずに変わることはありません。

ロックが拒否するもの

月がロックされると、その月の表示内容を変えるものはすべて、その会社の締め処理を止めます。元帳には何も書き込まれず、その会社のレポートは更新されず、何もロックされません。同じ実行で締める他の会社の処理はそのまま続きます。対象となるのは、数値を変更、削除、追加する修正済みのブックだけではありません。勘定科目の表示先や表示科目の計算方法を変える定義ファイルの変更も同様です。こちらは、保存された数値には触れずに表示科目の金額を変えます。拒否のメッセージは、影響を受けるロック済みの月をすべて挙げ、変わることになる数値を具体的に示します。最初の 12 件は個別に示し、残りは件数だけを示します。架空のデモで、Cobalt の勘定科目 1450 の科目マッピングを承認した後の例です:

text
  2023-02-28  presentation  BS line 'CHECK': -6,600.00 -> 0.00
  2023-02-28  presentation  BS line 'Other assets': 19,500.00 -> 26,100.00
  2023-02-28  presentation  BS line 'TOTAL ASSETS': 5,394,868.29 -> 5,401,468.29

次のものはロックに抵触しません。同じ数値で月を締め直すこと、勘定科目番号はそのままで会社が勘定科目名を変更すること、エクスポートに含まれなくなったゼロの行(数値がないことと 0.00 は同じ報告数値であるため)、新しい期間についての年初来のキャッシュ・フロー計算書、そして取引明細レポートや請求・CRM のエクスポートのように、どの表示科目にも載らない明細です。

月のロック解除

ロック済みの月も修正できますが、黙って修正することはできません。ロック解除には理由の記録が必要です。報告済みの月を変更すると決めた人自身の言葉で書いた 1 文です。理由はその期間とともに恒久的に保存され、数値が変わった場合は財務諸表パッケージに記載されます。空欄の理由、tbd のようなプレースホルダー、山括弧で囲まれたものは拒否されます。

会話の中でハルノがこの拒否に行き当たると、その内容を伝えて止まります。ハルノが自分の判断で月のロックを解除することも、お客様に代わって理由を書くこともありません。お客様自身の言葉で理由を伝えると、ハルノは拒否のメッセージが挙げた月だけのロックを解除し、各月にお客様の文を記録し、変更を適用して、もう一度締めます。ターミナルからは、同じことを 1 つのコマンドで行えます:

bash
python3 .haruno/skills/QuickBooksCFO/scripts/close.py --workspace . --client cobalt-systems --reopen-reason "1450 was unmapped; approved as Other assets"

個別の月を手作業でロック解除するには ingest.py reopen を使います。ここでの --client は、フォルダ名ではなく、定義ファイルに記録されレポートに表示される会社名(例:「Cobalt Systems, Inc.」)です。--period は月末日で、複数回指定できます。プレースホルダーはお客様自身の言葉に置き換えてください。

bash
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py reopen --ledger ledger/ledger.sqlite --client "<client name>" --period YYYY-MM-DD --reason "<their words>"

会社の現状を確認するには ingest.py periods を実行します(完全なコマンドは「数値の追跡」にあります)。すべての月を、締め済みか未締めかと締めステータスとともに一覧表示し、ロックが解除された月については、状態の変化ごとに実行した人と理由を表示します。

修正再表示

ハルノには、編集するセルも、計上する修正仕訳もありません。修正は会社自身の会計システムで記帳されるため、次のエクスポートに反映されます。その修正済みのブックを再び取り込むことが修正再表示です。影響する月のロックを理由とともに解除すると、締め処理がそれらの月を締め直します。

数値が実際に変わった場合、それ以降のすべての財務諸表パッケージに「Restated periods」の表が載ります。対象の月、ロック解除の日時、実行した人、理由、変わった数値です。ロックを解除しただけで何も変えなかった月は、すでに送付した内容をそのまま表示するため、ingest.py periods には表示されますが、パッケージには載りません。すべての締め処理とロック解除は、各時点で各月が表示していた数値とともに順番どおりに保存され、その履歴が書き換えられることはありません。

締め処理が拒否された場合にレビューの流れの中でどう進むかは、「締め処理が拒否されるとき」をご覧ください。

修正履歴

reports/<client>/adjustments.csv(修正履歴)は、会計事務所などが手作業で管理している修正の一覧表を、代わりに元帳から導出したものです。締め処理のたびに、ロックの後で会社の全履歴をもとに書き直されます。修正再表示 1 回につき、数値 1 つごとに 1 行です。

内容
period月末日。キャッシュ・フローの行の場合は期間。
kind元帳の数値の場合は「balance」(残高)または「activity」(増減)。保存された数値の変更を伴わずに金額が変わった表示科目(科目マッピングの変更後など)は「presentation」(表示)。取り込んだキャッシュ・フロー計算書の行は「cash flow」(キャッシュ・フロー)。数値を保存していなかった以前のバージョンが記録したロック解除は「not itemized」(明細なし)。
subject勘定科目または表示科目。
was, now, delta以前に報告した数値、現在の数値、その差。
reopened_at, reason, actor月のロックが解除された日時、理由、それを実行したユーザー。actor は記録であり、承認を意味するものではありません。
closed_at月が再び締められた日時。

ヘッダー行は常に書き出されるため、中身が空のログは修正再表示がなかったことを示します。「not itemized」の行は、その月の数値が変わったものの、どの数値が変わったかは特定できないことを示します。それが答えのすべてであり、推測で埋めるべき空白ではありません。

架空のデモでは、Cobalt の勘定科目 1450 の科目マッピングを承認すると、41 か月それぞれについて CHECK、Other assets、TOTAL ASSETS の「presentation」の行が記録され、合計 123 行になります。科目マッピングが動かすのは読み手に見える表示であり、保存された数値ではないためです。銀行残高を修正した場合は、その勘定科目を示す「balance」の行が 1 行記録されます。財務諸表パッケージの「Restated periods」の表にも同じ行が載りますが、千単位ではなく実額で表示されます。

何が変わったかを尋ねる
ハルノに「3 月は何が変わりましたか?」と尋ねると、2 つのエクスポートから答えを導き直すのではなく、このログまたはパッケージの「Restated periods」の表をもとに答えます。

元のブックの保管

すべての元ファイルは、その数値が取り込まれる時点で ledger/evidence/ にコピーされます。そのため、会社が手元のファイルを何度上書き保存した後でも、報告した数値の根拠となったファイルを後から提示できます。

  • 会社ごとに、読み取り専用で、ファイルの内容に基づく名前で保管されます。そのため、変更のない月を締め直しても何もコピーされません。保管場所には、会社が送ってきた異なるバージョンがそれぞれ保存されます。
  • 修正の後も、置き換えられた古いコピーは残ります。それが以前に報告した内容の証拠になります。
  • 読み取られてから保管されるまでの間に変更されたファイルは保管されず、締め処理はその日のうちにそのことを知らせます。ファイルをまだ取り戻せる可能性があるのはその日だけだからです。コピーの保管が締め処理を止めることはありません。

数値の元になったファイルを探すには:

bash
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py evidence --ledger ledger/ledger.sqlite --client "<client name>"

各元ファイルについて、ファイル名、そこから読み取った内容、数値が含まれる日付を表示し、保管されたコピーが今もそのファイルのままかどうかを、「ok」(問題なし)、「missing」(欠落)、「altered」(改変あり)、「unreadable」(読み取り不可)のいずれかで示します。この確認は、実行するたびに改めて行われます。

締め処理のたびにコピーも再確認され、失われたコピー、書き込みが行われたコピー、読み取れないコピーがあれば evidence_integrity の検出事項(重大度「中」)が発生します。財務諸表には影響しません。失われるのは、財務諸表の根拠となるファイルを提示する手段です。失われたコピーは、同じファイルが再び取り込まれると元に戻ります。再取り込みによって改変されたコピーが上書きされることはないため、正しいことが分かっている原本から人が手作業でコピーを置き換えるまで、この検出事項は残ります。

数値の追跡

ダッシュボード上のすべての数値は、締め処理が書き出したレポート、元ファイル、または元帳そのものまでたどることができます。

レポート、修正履歴、定義ファイルは「締め処理が書き出すもの」に一覧があります。会社から受け取ったままのファイルは workbooks/<client>/ にあります。レポートよりさらに下までたどるには、元帳そのものを読みます。

元帳そのものを読むには、ワークスペースのフォルダで query.py を使います。元帳を読み取り専用で開き、書き込むオプションはありません。数値が変わるのは、定義ファイルとブックに基づく締め処理を通じてだけです。これらのコマンドに必要なのは標準的な Python 3 だけです。最初のコマンドは、ある会社の月末の現預金を、ダッシュボードと同じ方法で合計して返します。架空のデモでは Meridian Robotics の $1,442,000 で、同社の「Cash」(現預金)タイルの数値です。クエリ内の '10%' は、番号が 10 で始まるすべての勘定科目を意味し、これが現預金の既定のプレフィックスです。会社の現預金の勘定科目の番号体系が異なる場合は、代わりにその会社のプレフィックスを使ってください。

bash
# 月末の現預金(ダッシュボードと同じ方法で合計)
python3 .haruno/skills/QuickBooksCFO/scripts/query.py ledger/ledger.sqlite "SELECT p.end_date, SUM(b.balance) AS cash FROM account_balance b JOIN gl_account a ON a.account_id = b.account_id JOIN period p ON p.period_id = b.period_id JOIN client c ON c.client_id = a.client_id WHERE c.name = 'Meridian Robotics, Inc.' AND a.acct_num LIKE '10%' AND p.end_date = '2026-06-30' GROUP BY 1"

# 直前期間との比較の全行(差が最大の行だけでなく)
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py compare --ledger ledger/ledger.sqlite --client "Meridian Robotics, Inc." --grain quarter

# ロック済みの月
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py periods --ledger ledger/ledger.sqlite --client "Meridian Robotics, Inc."

# 元帳のテーブルと列
python3 .haruno/skills/QuickBooksCFO/scripts/query.py ledger/ledger.sqlite --schema

お客様自身が実行するコマンドは、ワークスペースを読むだけで何も送信しません。ハルノに数値の追跡を依頼した場合は、お客様が入力した内容とツールが出力した内容が、Inferara のホスティングサービスを経由して、回答するモデル提供事業者に送信されます。詳しくは「データの行き先」と「自分で実行する」をご覧ください。

次のステップ

各チェックの意味、ダッシュボードでの締め処理の表示、ハルノに質問したときのデータの行き先をご覧ください。