報告與結帳鎖定

每次月度結帳會寫入工作區的內容、每個已鎖定月份如何記錄其是否全部調節相符,以及結帳鎖定如何使已報告的數字不會在沒有書面理由的情況下變動。

結帳寫入的內容

每次結帳針對一家公司、一個月份執行。以下列出結帳在審閱工作區中留下的內容,以及它讀取的內容。Haruno 將每家公司稱為 client;資料夾名稱、指令與儀表板中使用的都是這個字。在路徑中,<client> 是該公司在 workbooks/ 底下的資料夾名稱,例如 cobalt-systems

產出內容何時變更
財務報表包依公司自己的版面呈現的報表。每次為該公司結帳時。
調節底稿對照分類帳重新計算的每份明細表。每次為該公司結帳時。
投資人報告單一公司的數字,供其投資人閱讀。每次為該公司結帳時。
reports/<client>/adjustments.csv調整紀錄。每次為該公司結帳時,於鎖定之後。
投資組合儀表板涵蓋在此工作區中已完成結帳、且仍有對應設定檔(spec,每家公司一份 YAML 檔)的每一家公司。每次結帳執行結束時,前提是該次執行中至少有一家公司完成結帳。
ledger/ledger.sqlite所有報告據以產生的標準化分類帳:整個工作區共用一個檔案,每家公司的帳簿分開保存。每次結帳時。已鎖定月份只有在重新開啟後才會變更。
ledger/staging/結帳在套用您的科目對應之前,為每個來源檔案建立的工作副本。您無須開啟這些檔案。每次結帳都會重新建立。
ledger/evidence/每個來源檔案的唯讀副本。匯入新的或經更正的檔案時。
.haruno/skills/QuickBooksCFO/specs/<client>.yaml對應設定檔:您記錄的科目對應與判斷。結帳從不變更它。只有在您作出回答或核准變更時才會變更。

公司自己的檔案保留在送達時的位置,也就是 workbooks/<client>/。結帳會讀取這些檔案,但從不修改。

您在 macOS 應用程式中檢視各份報告與儀表板,也可以將其中任何一份匯出為 PDF 寄給他人。

結帳本身在您的電腦上執行;無論助理是否在執行,結帳都不會傳輸任何客戶資料。對話會傳送您送出的內容:當您請 Haruno 執行某項工作時,您輸入的內容,以及工具回傳的結果(科目名稱、項目名稱、數字、發現事項),會經由 Inferara 的託管服務傳送至回答您的模型供應商。請參閱「您的資料流向何處」。

該寄送哪份報告
要寄給某家公司投資人的,是投資人報告。儀表板包含工作區中的每一家公司,請勿寄給投資人。

財務報表包

財務報表包是依公司自身版面編製的每月財務報表包:項目名稱、小計與金額單位都與該公司送來的財務資料包相同,因為它是依據該活頁簿本身的結構建立的。每個數字都來自分類帳,其中沒有任何手動輸入的內容。

由上而下依序為:

  1. 封面。公司名稱、「Financial Reporting Package」(財務報導資料包)、「Unaudited Monthly Results Through」(截至某月之未經查核月度結果)字樣及結帳月份,以及只標示一次的表達貨幣。
  2. 「Restated periods」(經重編期間)。僅在某個已鎖定月份曾被重新開啟,且其數字隨後變動時出現。
  3. 「Issued with unresolved findings」(附未解決發現事項發布)。僅在有嚴重程度為高或中的發現事項尚未解決時出現。逐項列出其嚴重程度、檢核與所涉項目,並說明這些月份是「reported with exception」(附例外事項報告),而非「fully reconciled」(全部調節相符)。
  4. 資產負債表。分類帳中的每個月份各佔一欄。公司自己的 CHECK 列(通常為資產總額減去負債及權益總額),在任何未能於 0.01 以內核對相符的月份都會被標示。
  5. 損益表。欄位相同,另加一欄最新月份所屬曆年的本年累計數;從不呈現自成立以來的累計數。
  6. 償債能力與繼續經營。此節一律納入,內容包括:營運資金、流動比率、現金、權益總額,以及現金跑道與其計算基礎。若會計科目表中有關係人餘額,會與第三方債務分開列示。列出觸發了哪些 ASC 205-40 所述的繼續經營疑慮跡象,若無則註明未觸發任何跡象。此節只列出跡象,從不對繼續經營做出結論。
  7. 收款與營收對照。依報表推算的實收款項,對照已認列的營收;標示為推算估計值,並非銀行總額。
  8. 毛利率。每月營業收入減營業成本;若對應設定檔將各收入來源的營收項目與其成本項目配對,也會依收入來源列示。

報表沿用公司的金額單位,公司以千元表達時即以千元表達;最後三節與經重編的各列則以元為單位,並會註明。每家公司只使用一種貨幣,從不換算。若未匯入現金流量表,現金跑道以現金變動計算(包含籌資活動),並如此標示。請參閱「償債能力跡象」。

調節底稿

調節底稿收錄該公司結帳月份的各明細表與總分類帳(GL)之對照;結帳月份是指分類帳中有調節資料的最新月份。頁首會標明該月份與貨幣。

狀態摘要。公司調節底稿所調節的每個資產負債表科目各佔一列,欄位為「Account」(科目)、「Schedule」(明細表)、「Per GL」(依總分類帳)、「Per schedule」(依明細表)、「Difference」(差額)與「Status」(狀態)。「Schedule」欄標示該工作表被判讀為哪一種明細表,例如 rollforward(餘額變動表:期初、本期變動與期末)、prepaid_amort(預付費用攤銷)、fixed_assets(折舊明細表)或 accrual_reverse_new(應計項目迴轉後重新入帳)。

狀態意義
reconciled調節相符:明細表與總分類帳的差額在 0.01 以內。
exception例外:兩者差額超過 0.01。重大性不會使狀態從寬認定:$200 的差額就是例外。
open未決:無法計算出差額。

涵蓋範圍警示。完全沒有調節的重大餘額,會列出其科目名稱與餘額;是否重大,是以對應設定檔中該公司的重大性門檻衡量。您已豁免的科目不會列入。

每個科目一節。各明細表的列經重新計算,而非直接複製。餘額變動表與應計項目的列帶有「Recomputed」(重新計算)欄,若某列重新計算的結果與其所載的期末餘額不符,該列就會被標示。預付費用明細表顯示截至結帳時已認列的金額與剩餘金額;固定資產折舊明細表顯示每月折舊、累計折舊與帳面淨值。

重點就在於重新計算。調節底稿會獨立加總明細表本身的各列,不受工作表上任何手動輸入的差額影響,因此過時或手動輸入的差額,無法宣稱明細表本身並不支持的核對相符。若工作表未載明總分類帳金額,則以從報表匯入的餘額進行核對。

例外與缺漏的明細表也會列入發現事項,分別為 recon_exceptionsrecon_coverage。請參閱「調節狀態」。

投資人報告

投資人報告是儀表板上單一公司的頁面,改以出資給該公司的人、而非為其記帳的人為對象編製。每次結帳都會重寫這份報告,因此內容會反映最新一次的匯出檔。創辦人要求提供投資人近況更新時,要寄送的就是這份報告。

保留的內容

  • 現金、現金消耗與現金跑道。現金跑道指標卡以近期現金變動計算(包含籌資活動),並如此標示。
  • 以財務報表包的方式呈現的報表,但不含衡量核對差額的 CHECK 列。
  • 前後期比較。
  • 收款與營收對照。
  • 毛利率。
  • 各類別營業費用;若公司有部門劃分,也包括各部門營業費用。
  • 員工人數與每名員工的相關數字(若公司有提供員工人數)。
  • 經常性收入(MRR、ARR 與流失率),以及顧客取得成本與回收期(若公司有這些資料)。
  • 償債能力面板及其跡象。少了它們,報告會在正確的同時也造成誤導。
  • 關於帳簿能支持與不能支持哪些數字的說明,例如某個數字需要兩個月的資料,但分類帳中只有一個月。

不包含的內容

  • 完整性發現事項。
  • 科目對應表。
  • 調節狀態。
  • 差異觀察清單。
  • 結帳狀態與鎖定紀錄。
  • 呈現控制狀態的指標卡:報表核對、調節例外,以及偏離預算最多的項目。
  • 預算與實際比較,除非該公司的對應設定檔允許納入。
  • 顧客層級的明細:各顧客營收表,以及數字背後的發票列與明細表列。數字本身會保留。
  • 寫給對應設定檔維護者的註記。

不包含,是指根本沒有放入,而不是隱藏:這些區段從未寫入報告,因此其 PDF 中也沒有。儀表板上用來把問題放入聊天輸入框的按鈕也不會出現。

頁首會說明這份報告的性質:為該公司投資人編製、涵蓋至分類帳中有餘額資料的最新月份、附上數字所依據之匯出檔的日期戳記(若有),並以表達貨幣呈現。它只涵蓋一家公司。

是否讓投資人看到創辦人的預算計畫與帳簿實際數的對照,由創辦人決定;因此除非該公司的對應設定檔以下列設定將其納入,否則預算與實際比較不會出現在報告中。此值必須是 true 或 false。其他任何值,包括帶引號寫成的 "no",都會被拒絕,系統不會自行推測其含義。

yaml
investor:
  budget: true

結帳狀態

每個已鎖定月份都附有一筆紀錄,記下鎖定當時已知的情況。儀表板會在每家公司頁面的頂端,以標籤的形式顯示這項紀錄,旁邊是已鎖定的月份數。

結帳狀態標籤意義
fully reconciled綠色全部調節相符:每個已鎖定月份在結帳時都沒有未解決的事項。
reported with exception紅色附例外事項報告:至少有一個已鎖定月份在結帳時,仍有高或中嚴重程度發現事項未解決。
open琥珀色未結:尚未鎖定任何月份。
not recorded灰色未記錄:某個已鎖定月份在結帳時沒有記錄其發現事項;較早版本所做的結帳即是如此。

以最弱者為準。一個標籤代表所有已鎖定月份,因此它只做出對所有月份都成立的陳述:任何一個月份有例外,優先於沒有記錄的月份;沒有記錄的月份,又優先於調節相符的月份。標籤旁的註記會列出已鎖定的月份數,以及仍未鎖定的月份數(若有),但不會說明其中有多少個月份帶有例外。若要查看是哪些月份,請執行 ingest.py periods,它會在每個月份的那一行印出結帳狀態(請參閱「追溯數字」)。

只有高與中嚴重程度發現事項才算未解決。低嚴重程度發現事項、償債能力跡象與待確認問題都不算:公司現金短缺,並不會使其帳務被視為未調節相符。請參閱「嚴重程度」。

以合成資料產生的範例輸出:Ironwood Materials, Inc. 的儀表板頁首,顯示綠色的「fully reconciled」標籤及已鎖定 41 個月,下方的指標卡顯示「ties」(相符)與 0 項調節例外。
結帳狀態為「fully reconciled」。合成示範資料;公司與數字均為虛構。
以合成資料產生的範例輸出:Cobalt Systems, Inc. 的儀表板頁首,顯示紅色的「reported with exception」標籤、已鎖定 41 個月,以及三項未解決的檢核;下方的報表核對指標卡顯示 ($6,600),另有 1 項調節例外。
結帳狀態為「reported with exception」:月份照樣鎖定,並列出未解決的檢核名稱。合成示範資料;公司與數字均為虛構。

同一個狀態會以相同的措辭出現在:儀表板頁首、期間清單中每個月份的那一行(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:」(未解決的檢核)之後列出的檢核,以及結帳摘要括號內列出的檢核,都是這些月份鎖定當時仍未解決的檢核,而且一次結帳會在其鎖定的每個月份寫入同一份清單。之後已修正的問題,或只在最後一個月才發現的問題,仍會記在所有這些月份上。將游標停在標籤上即可看到這份清單。

結帳鎖定

結帳完成時,該次結帳有報告數字的每個月份都會被鎖定,無論是否核對相符;發現事項不左右是否鎖定。僅因某份文件提及而存在的月份(例如前瞻性預算中的月份)則不會被鎖定。

鎖定不是對帳簿的定論。
無論如何,每個已報告的月份都會被鎖定。鎖定會記錄該月份是「fully reconciled」還是「reported with exception」,也代表已報告的數字不會在沒有紀錄的情況下變動。

鎖定會拒絕什麼

月份一旦鎖定,任何會改變其表達內容的變動,都會使該公司的結帳停止:不會寫入其分類帳,不會為其更新任何報告,也不會鎖定任何月份。同一次執行中結帳的其他公司則照常進行。這包括會變更、刪除或新增數字的更正後活頁簿,也同樣包括在對應設定檔中變更科目的表達位置或報表項目的計算方式;後者不會動到任何已儲存的數字,卻會使報表項目變動。拒絕訊息會列出它將影響的每個已鎖定月份,並逐一寫出將變動的數字:前 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 匯出檔。

重新開啟月份

已鎖定的月份仍然可以更正,但不能無聲無息地更正。重新開啟已鎖定月份時,必須說明理由:一句話,由決定變更已報告月份的人以自己的話寫下。理由會永久與該期間一起保存,並在數字變動時印在財務報表包中。空白理由、tbd 之類的預留位置文字,或任何以角括號(< >)包住的內容,都會被拒絕。

Haruno 在對話中遇到這項拒絕時,會轉達拒絕內容並停止。它從不自行重新開啟月份,也從不替您撰寫理由。請以您自己的話告訴它原因,它就會重新開啟拒絕訊息中列出的那些月份,不多也不少,在每個月份記下您的那句話,套用變更,然後重新結帳。在「終端機」(Terminal)中,同樣的操作只需一行指令:

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(完整指令列在「追溯數字」一節)。它會列出每個月份是已結帳還是未結,以及其結帳狀態;對於重新開啟過的月份,還會列出每一次狀態轉換、執行者與理由。

重編

Haruno 沒有可編輯的儲存格,也沒有可過帳的調整分錄。更正是在公司自己的會計系統中入帳,因此會出現在下一次的匯出檔中;重新匯入那份更正後的活頁簿,就是重編:附上理由重新開啟它所影響的月份,這些月份就會重新結帳。

若數字確實有變動,此後的每一份財務報表包都會附上「Restated periods」表:月份、重新開啟的時間、由誰執行、理由,以及變動的數字。重新開啟後未作任何變更的月份,呈現的仍是先前已寄出的內容,因此它會出現在 ingest.py periods 中,而不會出現在財務報表包的「Restated periods」表裡。每次結帳與每次重新開啟都會依序保存,並附上每個月份在當時所呈現的數字;這段歷史從不改寫。

若要了解遭拒的結帳在審閱流程中如何處理,請參閱「結帳遭拒時」。

調整紀錄

reports/<client>/adjustments.csv 相當於事務所通常手動維護的調整明細表,只是改由分類帳推導產生。每次結帳都會在鎖定之後,以該公司的完整歷史重寫這個檔案;每次重編中的每個數字各佔一列。

欄位內容
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」列。財務報表包的「Restated periods」表也載有相同的各列,但以元為單位,而非千元。

詢問有哪些變動
問 Haruno「3 月有哪些變動?」,它會根據這份紀錄或財務報表包中的「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

您自行執行的指令只會讀取工作區,不會傳送任何內容。當您請 Haruno 替您追溯某個數字時,您輸入的內容以及工具回傳的結果,會經由 Inferara 的託管服務傳送至回答您的模型供應商。請參閱「您的資料流向何處」與「自行執行」。

後續步驟

了解每項檢核的意義、儀表板如何呈現一次結帳,以及當您向 Haruno 詢問相關內容時,您的資料會傳送到哪裡。