Findings and checks
What the integrity checks look for, how severe each finding is, what counts toward a clean close, and what resolves each one.
What a finding is
Every close runs integrity checks against the ledger Haruno builds from the company's exports, before anything circulates. Each check is a standing question that a spreadsheet only answers implicitly, and silently. When the answer is wrong, the check raises a finding.
Haruno calls each company a client; that is the word in folder names, commands and the dashboard.
A finding means a figure is missing, does not add up, or is presented wrongly: an account carrying balances that no statement line claims, a schedule whose per-GL figure disagrees with the ledger, a hand-typed difference asserting a tie that the detail denies.
A finding is not a crash. It is the thing you would have found in week three. A close with findings is a successful close: the findings are its output, and it still writes the statement package, the reconciliation binder and the dashboard. When Haruno runs the close for you, it reads the findings out to you before any report circulates.
A variance is not a finding. Being over budget is a fact about the business, not a defect in the books, so it appears on the budget panel and never in the findings list.
Severities
| Severity | What it means | Does it count? |
|---|---|---|
| High | A figure is missing or does not add up: a balance absent from every statement, a balance sheet that does not tie, a schedule tied to a number that is not the ledger's. | Yes. It counts on the portfolio and keeps a month from being fully reconciled. |
| Medium | The statements still tie, but something is wrong that somebody has to fix: two months misstated by the same amount, a schedule to re-cut, a budget row that matches no statement line. | Yes, exactly like high. |
| Low | Not a problem yet. Usually an account with no statement line and no balance: nothing is missing today, but its first balance would drop in silence. | No. Listed on the company's findings card, counted nowhere. |
A company is clean when it has no high or medium findings. That is what the dashboard counts and what the close records when it locks a month (see close states). A low finding is a future risk, never a reason a month is not clean.
The checks
On a company's page, the Integrity findings card lists each finding with its severity, the check that fired, its subject (an account, a statement line or a run of periods), the check's own explanation with its figures, and a Propose a fix button.

Some checks run only when the company sends the file they read: a trial balance, a receivables aging, a profit and loss by class, a budget, vendor detail or a CRM export. No finding from one of these can mean it had nothing to test. A blank is not a zero.
| Check | Severity | Fires when |
|---|---|---|
| unmapped_active_account | High | An account has a balance or activity but no statement line, so it is missing from every statement. |
| presentation_tieout | High | The balance sheet's CHECK row, the company's own formula (normally total assets less total liabilities and equity), is not zero. A run of periods with the same gap is one row. |
| bs_tieout | High | Asset balances do not equal liability and equity balances, by account classification. |
| ni_crosscheck | High | Year-to-date net income on the profit and loss disagrees with the balance sheet. |
| recon_exceptions | High | A reconciliation row is in exception, in any month. |
| recon_gl_mismatch | High | A schedule's Per GL figure is not the ledger balance. |
| cash_flow_classification | High; medium when the statement states no operating subtotal | Borrowing is presented inside operating cash flow, against ASC 230. |
| trial_balance_unbalanced | High | The trial balance's debits are not its credits, or its TOTAL row disagrees with its rows. |
| trial_balance_account_unpresented | High | An account carries a balance on the trial balance but appears in none of the imported statements. |
| statement_disagrees_with_trial_balance | High | The trial balance contradicts a figure the statements state, over a window both cover. |
| aging_disagrees_with_balance | High | The receivables aging does not tie to the receivable accounts. |
| class_total_disagrees | High | A month's class split does not add up to the month's activity. |
| orphan_lines | Medium | A statement line has no account mapped to it and will read zero forever. |
| recon_coverage | Medium | A material balance at the latest close has no reconciliation schedule and no exemption. |
| missed_accrual | Medium | A steady monthly cost is blank one month and roughly double the next. |
| schedule_drift | Medium; low when the month's movement could not be compared | A depreciation or prepaid schedule disagrees with the company's policy or with the general ledger. |
| budget_line_unmatched | Medium | A budget row matches no statement line, so it appears on no panel. |
| budget_line_uncomparable | Medium | A budget row covers only months outside the period reported. |
| budget_months_short | Medium | The budget stops before the month being closed. |
| deferred_rollforward_drift | Medium | Opening plus additions less recognition misses closing deferred revenue by more than materiality. |
| detail_disagrees_with_statement | Medium | Vendor detail exceeds a month's statement figure by more than materiality. |
| operating_count_disagrees | Medium | A stored customer count disagrees with the CRM deals underneath it. |
| evidence_integrity | Medium | A retained source workbook is missing, altered or unreadable. |
| unused_exemption | Medium | An exemption, or a useful-life entry in the policy, covers nothing or cannot be read. |
| unmapped_empty_account | Low | An account has no statement line and is zero in every period it appears in. |
Two more checks, solvency and going_concern, fire on books that are entirely correct. They appear on the Solvency and going concern card; seeSolvency indicators.
Questions, not findings
Some shapes in the books are worth asking about and wrong to count. Haruno reports them as questions. A question carries no severity, nothing counts it, and it never makes a month unclean.
| Question | What it asks about | What settles it |
|---|---|---|
| prepaid_candidate | One month carried a disproportionate share of a cost account's period total (at least 40%, and at least twice an even share), or one invoice is several times what that vendor usually bills. That is what a prepayment expensed on payment looks like, and also what a lumpy account looks like in a lumpy month. | The invoice. If it buys a service period running past the month, it belongs in prepaid. If not, it was a big month. |
| treatment_candidate: spread over a service period | A vendor row, posted to an expense account, that looks like it bought more than its month. Either the row alone is more than three times what the whole account usually costs in a month, or the memo states a term (a date range, a number of months, or a word like annual) and that vendor's month is above its usual month by at least half the invoice. Not asked when a prepaid schedule or the fixed-asset register already carries it. | Whether it bought a period of service. That comes off the invoice, not the memo. |
| treatment_candidate: capitalize | A vendor row at or above the company's own capitalization threshold, posted to expense, with no row in the fixed-asset register. | Whether it is an asset. With no threshold in the company's policy, this is never asked. |
Why questions and not findings
A treatment is a judgment the company's accountant makes about what was bought. The amount is a fact; what the purchase was is a guess from a memo somebody typed. On a real export, the prepaid shape was right about half the time. As a finding it would be false every other month, and a reader who checks one and finds nothing stops checking all of them.
Both ask about costs only. A close that holds just one month of profit and loss asks nothing about a month's share, since one month makes every account 100% of its own total; questions about a single invoice can still be asked. An invoice already on a schedule or in the register, or a bill that arrives every month at that size, is not asked about.
Haruno never answers a question for you. If an account is lumpy by nature, say so and Haruno records it, so the account is not asked about again. The answer stops the asking, not the fact: the close still lists the shape as already answered, because how a company spends can change.
Reconciliation statuses
The Reconciliation status card on a company's page asks whether each balance agrees with its schedule. It has one row per balance-sheet account reconciled in the company's binder for the close month.
| Status | Colour | Meaning |
|---|---|---|
| reconciled | Green | The schedule agrees with the general ledger within a cent. |
| exception | Red | The schedule's closing balance differs from the general ledger by more than a cent. |
| open | Amber | No difference could be computed. Not counted as an exception. |
Difference is the schedule's own closing balance less the general ledger balance. The schedule is recomputed, so a difference typed into the workbook cannot make it tie.
Materiality does not soften a status: a $200 difference is an exception. On this card, materiality (the company's reconciliation threshold, drafted as a stated default that you confirm or correct during onboarding) decides only which balances with no schedule get flagged.
- A row in exception becomes a recon_exceptions finding, at high.
- A schedule whose Per GL figure is not the ledger balance becomes recon_gl_mismatch, at high, even when it ties to its own Per GL.
- A material balance with no schedule and no exemption is not a row. It appears as recon_coverage, at medium.
Solvency indicators
The Solvency and going concern card, first on every company's page, asks whether the company can meet what it owes. It reads only the company's own statements: working capital and the current ratio, cash, total assets and equity, deferred revenue, operating cash flow when a statement of cash flows was imported, and runway.
The four indicators
| Indicator | Severity |
|---|---|
| Current ratio below 1 | High below 0.5, otherwise medium. |
| Negative equity | Medium when the deficit is under a tenth of total assets, otherwise high. |
| Deferred revenue above total assets | Always high. |
| Runway under 12 months, measured from operations | High under 3 months, otherwise medium. |
Each indicator that fires is a solvency finding. Each one carries a Draft the disclosure button, which puts a request into Haruno's chat when the dashboard is open in the macOS app. The runway indicator needs an imported statement of cash flows, with borrowing moved out of operating activities as ASC 230 requires. The runway on a tile is the trailing change in cash, financing included, and never raises an indicator; the card's Basis column says which measure its own runway uses. The card does not read covenants, debt maturities or subsequent events; those need more than the statements.
When indicators cluster
Two or more indicators, at least one high, form a going-concern cluster, reported as a going_concern finding at high. The card then opens with an amber ASC 205-40 paragraph, and the portfolio's Going-concern indicators tile counts the company.
Solvency indicators fire on books that closed perfectly, so they are something to say rather than something to fix. They never make a company unclean and never mark a month reported with exception. They travel with the statements instead: the investor report keeps the solvency panel, because a report without it would be accurate and misleading at the same time.
Resolving a finding
Most findings are resolved by a decision you make, recorded in the company's spec (the file that holds how its accounts map to statement lines and the decisions you have confirmed), or by a corrected file from the company. The dashboard proposes, you decide. Haruno never maps an account silently and never edits the company's workbook to make a finding go away.
Propose a fix puts a request into Haruno's chat for the spec change that would resolve the finding, with its before-and-after effect on the statements. Nothing is sent until you press send (see asking from the dashboard). When you send the request, it and the figures in it go through Inferara's hosted service to the model provider that answers, like anything else you type (see Data handling and security).
| Finding | What resolves it |
|---|---|
| unmapped_active_account, unmapped_empty_account | Map the account to a statement line. Haruno proposes the line from the account's name, number and neighbours; you confirm. Fix the empty one first: it costs nothing yet. |
| presentation_tieout | Usually the same mapping. When the CHECK row is off by exactly an unmapped account's balance, one mapping closes both findings. |
| orphan_lines | Map an account to the line, or record an exemption saying the line is expected to be empty. |
| recon_coverage | Add the schedule to the binder, or record an exemption saying where the balance is reconciled. |
| recon_exceptions, recon_gl_mismatch | Nothing in the spec clears these. Two of the company's own documents disagree, so the correction is made at the source. |
| missed_accrual, schedule_drift | A journal entry or a re-cut schedule in the company's own books, arriving as a corrected export or binder. A corrected export that restates locked months needs a reopen with your reason. |
| Trial balance, aging, class, vendor detail, CRM and deferred revenue checks | Find which source is wrong; the finding names the usual causes. When two reports from one general ledger disagree, re-export both as of the same moment rather than picking one. |
| Budget checks | Match the budget's caption to the statement line, or drop the row so its absence is a decision. Extend a budget that stops short. |
| evidence_integrity | Re-import a missing file if you still have it. An altered copy is not repaired by re-importing: replace it from a known-good original. The statements are unaffected. |
| unused_exemption | Correct the entry so it covers what you meant. It was a misfiled answer. |
| solvency, going_concern | Nothing in the books to fix. Something has to be said, and Draft the disclosure helps you say it. |
If the company has been closed before, the re-close after a mapping is refused, because the mapping moves figures in locked months. The refusal names what would move. Give Haruno your reason in one sentence; it re-opens exactly those months, keeps your reason against each, and closes again. See the lock.
Exemptions
An exemption is an accepted exception to a check, recorded in the company's spec. Each one answers exactly one question: where is this balance reconciled (recon_coverage), why is this statement line empty (orphan_lines), or is this account lumpy by nature (the prepaid and treatment questions). An account exemption names an exact account name, an account number, or a number prefix (10 covers every account numbered 10xx, such as the cash accounts); an empty-line exemption names the statement line. One that covers nothing is reported as unused_exemption at the next close.
Worked example: one finding stays

In the synthetic example above, Cobalt Systems carries three high findings: 1450 Deposits Receivable holds a balance no statement line claims, so the CHECK row is off by $6,600 in all 41 months; and its advances schedule lists $200 the general ledger does not.
One sentence, "1450 Deposits Receivable belongs in Other assets", maps the account. The re-close is refused, because the mapping moves figures in all 41 locked months; a second sentence giving your reason, "1450 was unmapped; approved as Other assets", re-opens them. The CHECK row goes to zero, the first two findings resolve, and the Findings count drops from 3 to 1.
The reconciliation exception stays: no mapping and no exemption clears a real disagreement between two of the company's own documents. So the months lock as reported with exception, with recon_exceptions unresolved. The point of the findings column is not that it reaches zero. It is that what remains is worth a phone call, and that the ledger says so afterwards.
Running it yourself
From the workspace folder. Answers are recorded with ingest.py answer rather than by hand-editing the spec. More in running it yourself.
# Map an account to a statement line
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py answer --spec .haruno/skills/QuickBooksCFO/specs/cobalt-systems.yaml --map "1450=Other assets"
# Re-close, giving your reason for re-opening the locked months
python3 .haruno/skills/QuickBooksCFO/scripts/close.py --workspace . --client cobalt-systems --reopen-reason "1450 was unmapped; approved as Other assets"Where findings appear
Every surface uses the same rule for what is unresolved, so no two of them give one month two answers.
| Where | What you see |
|---|---|
| The close report (read out to you in the chat, or printed in Terminal when you run it yourself) | Every finding, then which months were locked and whether they were reported with exception or fully reconciled. |
| The list of locked months (ingest.py periods, when you run the commands yourself) | The same close state on each month's line. |
| The statement package | An Issued with unresolved findings note above the statements. |
| The reconciliation binder | Every schedule recomputed, with its exceptions called out. |
| The dashboard, portfolio view | The Findings column (a count, or clean), the Clients with findings tile, and each company's close state chip. |
| The dashboard, a company's page | The Integrity findings card, low findings included, and the Solvency and going concern card. |
| The investor report | No integrity findings, mapping table, reconciliation status, variance watchlist or CHECK row. The solvency panel and its indicators stay, without the Draft the disclosure button. |
What the investor report keeps and leaves out: The investor report.
How the close records each locked month, and why the unresolved list is a snapshot, is in Close states.
The Integrity findings card, by contrast, shows the books as they stand now.