Review Kit Parity Map

Review kit parity map #

Classification: Restricted (describes source code structure).

Feature-by-feature and field-by-field map of what the review shows today onto the kit mechanism that carries it, with the status of each row and an Approved column for the owners (Estu, Koki, Ryota). The review core’s fixtures cite rows as “parity n”. Companion to the Review Kit ADR and the inventory.

Sources: the i18n labels of 22 review namespaces (config/i18n/en/webapp.json), the BS editor API (ui-v2/bank-statement/core/types.ts, intl/labels.ts), the onboarding cards, and the 6 YAML files in config/extraction_fields/. Written 2026-10-21.

Type TW = the tofu-web product review page (/entities/{slug}/review), added 2026-10-22: the kit is used there too, not only in onboarding.

Status: covered = in the kit or SheetGrid today, or plain props · sheetgrid-ext = a SheetGrid extension (#6003) · new-presenter = a small new presenter in ui-v2 · container = outside the kit, the container’s job · backend = needs bonsapi data · dropped = deliberately not carried over.

Features (94) #

# Area Feature Types Kit mechanism Status Source Approved
1 Document Type title + status badge (Draft, Needs review, Ready, Done, Verified, Published, Exported, Deleted, Pending deletion) AP AR DE CN BS ReviewHeader ← header.status covered review.shared.header, bank-statement labels
2 Document Previous / Next document, Copy link AP AR DE CN BS ReviewHeader.actions (navigation from the container) covered review.shared.header
3 Document Knowledge panel AP AR DE CN BS ReviewHeader.actions → the container opens the panel outside the kit container review.shared.header
4 Document Menu … : Extract / Re-extract, Later, Export / Re-export, Edit / Exit editing, Delete, Flag extraction, Mark resolved (manual cleanup) AP AR DE CN BS ReviewFooter.more[] (id, label, disabled); each id = a command covered review.extraction.actions, review-more-menu
5 Document Save / Discard while the form is dirty; “unsaved changes” warning on leaving AP AR DE CN BS footer.secondary “save” + model.dirty; leave guard in the container covered review.extraction.formHeader
6 Document Mark Ready / Ready & Publish / Revert to draft / Review later / Un-ready (dialog) / Mark done AP AR DE CN BS footer.primary variants; un-ready dialog = confirmation runner covered review.extraction.actions, unverifyDialog
7 Document Lock: ready→edit offers revert; published / exported / done / verified / unread / limit reached / busy = read-only with a message OB model.lock { reason } → ReviewNotice + readOnly on the kit; revert dialog = confirmation new-presenter onboarding.reviewForm.lock.*
8 Document Validation summary “N things to fix”, Show, list of invalid fields AP AR DE CN BS OB model.errors[] → ReviewValidationBar + cellErrors/fieldErrors new-presenter onboarding.reviewForm.validation, formHeader.invalidFields
9 Document “New extraction data available → Update form” AP AR DE CN BS ReviewNotice with an action new-presenter review.extraction.form.newDataAvailable
10 Document Progress banner: processing / publishing / importing / deleting in progress AP AR DE CN BS header.busy + ReviewNotice covered formHeader
11 Document Sync info: last publish/import, status, error, View in provider, auto-publish hint, retry AP AR DE CN BS SyncInfo presenter (ported from ui-v2 bank-statement-host) new-presenter review.extraction.sync, bank-statement-v2-sync-info
12 Document Activities history (action timeline + field/line diffs) AP AR DE CN BS ActivitiesPanel presenter, data from the container new-presenter review.extraction.activities
13 Document Duplicates: possible duplicate, view match, not a duplicate, keep all / keep selected AP AR DE CN BS ReviewNotice with actions; resolution in the container new-presenter review.extraction.duplicates
14 Document Error banner: upload / extraction / export / publish / delete / validation AP AR DE CN BS ReviewNotice, error tone covered review.extraction.errorBanner
15 Document Limit reached notice; Deleted notice + Revert to draft OB ReviewNotice covered onboarding.reviewForm.limitReached, deleted
16 Account (BS) One tab per account: bank, number, currency, balance check, published/locked; tab + Add Account BS SectionTabs, activeSectionId in the URL (?section=), select_review_section covered bank-statement account-panel, labels.addAccount
17 Account (BS) Document summary: N of M accounts published, balanced overall, failed/pending per account, retry failed BS ReviewSummary ← aggregate of sections[] covered sync.bankStatementPublishSummary, AccountPublished/Failed/Pending
18 Account (BS) New account → Accept / Accepted / Edit (bank, number, name, code dialog); confirm “create new bank accounts?”; confirm “change bank account?” BS SectionHeader.onSectionAction; edit dialog = form page; confirm = confirmation runner covered labels.newAccount, acceptAccount, editAccountTitle, confirmNewAccount*
19 Account (BS) Remove account, Pending deletion, Restore BS section.status.pendingDeletion + onSectionAction(remove/restore) covered labels.pendingDeletion, restore, deleted-account-card
20 Account (BS) Pick the bank account from the software (searchable), “No accounting integration configured”, Connected / Not connected (+ bank feed tooltip) BS keyFacts external_account_id picker + section.status.connected covered labels.selectAccount, noAccountingConfigured, form.bankFeedConnected
21 Account (BS) Statement period start/end with “end after start” validation BS keyFacts date + fieldErrors covered labels.statementPeriod, endDateBeforeStartDate
22 Account (BS) Contra defaults per account (account, tax, contact) + Apply; Categorization BS SectionDefaults presenter + onSectionAction(apply_defaults) new-presenter labels.contraDefaults, categorization, setContraDefaults()
23 Account (BS) Filter All accounts / All currencies; collapse per account BS replaced by one tab per account dropped labels.allAccounts, allCurrencies n/a
24 Verdict Counterparty: existing / new supplier / new customer, Accept, Accepted, Edit, See ID, Not found AP AR DE CN OB verdict.counterparty + onCounterpartyAction covered onboarding.reviewForm.counterparty.*, counterparty-status.tsx
25 Verdict Tax ID mismatch (3 variants) + blocked dialog “correct or turn off warn” AP AR OB counterparty.taxId { status } + ReviewNotice; block = model.errors covered form.taxIdentificationNumberWarning.*
26 Verdict Contact picker: Customer / Supplier / both groups, Create New, place of supply and tax treatment for a new contact, no permission AP AR DE CN BS picker option.group + allowCreate → the container opens the new-contact form page covered form.contactGroups, validation.newContact*
27 Verdict Total check: adds up / mismatch / off by (rounding) / no lines / no total / undo; blocked helper AP AR DE CN OB check.status + check.gap; CalculationBreakdown covered onboarding.reviewForm.totalCheck.*
28 Verdict Calculation breakdown: subtotal, line count, discount (included), tax per rate, document tax, no tax, reverse charge note, difference, “switch to {basis}” suggestion AP AR DE CN OB CalculationBreakdown rows[] + hints[] + onSwitchBasis covered totalCheck.breakdown.*
29 Verdict BS summary: Opening / Closing / Total Debit / Total Credit / Subtotal, Extracted vs Calculated, ✓, mismatch tooltip + Learn more BS CalculationBreakdown rows[] (open by default for BS) + check.help covered labels.summary, extracted, calculated, mismatchTooltip
30 Verdict Price basis: Include tax / Exclude tax / No tax (+ “No tax clears rates” tooltip) AP AR DE CN OB lines.taxMode + onTaxModeChange covered calculation.prices*, lineTable.noTaxTooltip
31 Verdict Compact strip while scrolling: Go to supplier / Go to total / No total OB VerdictStrip compact mode covered onboarding.reviewForm.strip.*
32 Verdict Balanced / N errors / N mismatches badge per account BS section.verdict.status + counts in SectionTabs covered labels.balanced, errors, mismatch(es)
33 Header fields Every header field per type from the YAML (see the field catalog below) AP AR DE CN BS KeyFactsCard / ExtrasCard ← keyFacts[], extras[] (the pipeline’s catalog visibility filters by provider, capability, setting) covered config/extraction_fields/*.yaml
34 Header fields Field adornments: required *, suggestion (Tab to complete), “Found on the document, hover to see where”, Extracted as “{value}” / empty, disabled, no options, Clear field AP AR DE CN BS FieldWithLens props { required, suggestion, box, extracted, disabled, clearable } covered review.shared.invoiceField, shared.fields
35 Header fields Date: type to fill the date, review date suggestion AP AR DE CN BS date control (ui-v2 invoice-form/review-date-field) covered invoiceField.datePlaceholder, review-date-suggestion
36 Header fields Currency select, unknown currency AP AR DE CN BS select covered invoiceField.selectCurrency, unknownCurrency
37 Header fields AR (QBO): Location of sale / Ship from; Add/remove shipping info (addresses) AR keyFacts/extras; the invoice-address-field presenter is already in ui-v2 covered form.locationOfSale, addShippingInfo, invoice-address-field
38 Header fields Discount rate/amount, deposit, balance due, subtotal/tax/total AP AR CN extras + CalculationBreakdown rows covered form.discount*, deposit, balanceDue
39 Header fields Reverse charge (Zoho), Tax treatment + out-of-scope hint AP CN toggle / select + hint; shown only where the provider supports it (catalog) covered form.reverseCharge*, taxTreatment*
40 Header fields Header-level tags (Xero/Zoho has_header_level_tags) AP AR CN kind: tags (multi-select); the presenter is already in ui-v2 covered external-accounting-header-level-tags-section
41 Header fields Credit note: number, date, original invoice number/date, reason code, reason, notes CN keyFacts from the YAML covered form.creditNote*, originalInvoice*
42 Header fields DE: payment method / payment type / spend type / paid-from account DE select / picker covered form.paymentMethod, direct_expense.yaml
43 Header fields BS: bank name, account number, currency, opening/closing (extracted) BS keyFacts; calculated values in the breakdown covered bank_statement.yaml
44 Lines Columns per type from the YAML + dynamic tag roots per entity (names from Zoho/Xero, mandatory, archived) + debit/credit sides (double entry) AP AR DE CN BS columns[] built by the container; the kit draws them covered line-columns.tsx, transaction-columns.tsx, bank-statement tagColumns
45 Lines Column kinds: text, number, money, percentage (discount), date (service date), picker (account, tax, item/service, contact, class, category, location), multiselect (tags), toggle (tax), status ✓, derived (calc. balance) AP AR DE CN BS SheetGrid: only text / boolean / select today sheetgrid-ext review.shared.columns, SheetGrid types.ts
46 Lines Picker in a cell: Create New, option groups, “(Archived)”, mandatory, Unknown account / Unknown tax rate + reason, archived tags refused on save AP AR DE CN BS options[].group/archived/mandatory, renderOption, cellErrors; refusal in the container’s applyChange sheetgrid-ext invoiceField.createNew, fields.archived, lines.unknown*, validation.removeArchivedTags
47 Lines Bounding box per cell: hover reveal, lens, pulse OB rows[].cells[].box + onCellHover; ZoomLensOverlay sheetgrid-ext line-sheet/grid/bubbles, use-hints, zoom-lens
48 Lines Error per cell + Previous/Next problem navigation “n of m”, label “Line n · column” OB cellErrors + LinesCard error navigation sheetgrid-ext lines.previousError, nextError, errorPosition
49 Lines Locked / calculated / tax-off cell notices OB lockedCells (exists) + labels.lockedReason covered lineTable.sheetCalculatedNotice, sheetTaxOffNotice, sheetLockedNotice
50 Lines Tax amount editable toggle + tooltip (override off / unsupported on Xero DE) AP AR DE columns[].editableToggle + tooltip sheetgrid-ext lineTable.taxAmount*Tooltip, line-tax-amount-editable-toggle
51 Lines Discount: “10%” or an amount, tooltip AP AR CN columns[].parse (percentage/money) sheetgrid-ext lineTable.discountTooltip, discount-field
52 Lines Keyboard: arrows, Tab, Enter, Home/End, type, fill, copy/paste tile and per-cell refusal AP AR DE CN BS SheetGrid covered SheetGrid keyboard.ts, paste.ts
53 Lines Row selection: gutter, Shift/Ctrl, select all, clear, “{n} selected” AP AR DE CN BS SheetGrid selectedRowIds covered SheetGrid row-selection, lines.selected
54 Lines Add line / Add transaction; empty state “click + to add” AP AR DE CN BS LinesCard.onAddRow + empty covered lineTable.addLineItem, addTransaction, clickToAdd
55 Lines Insert line below BS onRowAction(insert_below) covered labels.insertLineBelow, insertTransactionBelow()
56 Lines Duplicate line / transaction AP AR DE CN BS onRowAction(duplicate) covered form.duplicateLine, duplicateTransaction()
57 Lines Remove line / Remove rows (at least one stays) AP AR DE CN BS onDeleteRows / onRowAction(remove); the minimum rule in the container covered lineTable.removeRows, atLeastOneRow
58 Lines Add child transaction (parent/child, split); a parent’s actions carry its children BS rows[].parentId + indentation sheetgrid-ext labels.addChildTransaction, tree.ts, parentTransactionId
59 Lines Move to Account / Move to new account BS onMoveRows({ from, to / “new”, rowIds }) → BS adapter covered labels.moveToAccount, moveTransactionToAccount(), moveTransactionToNewAccount()
60 Lines Change currency per transaction BS onRowAction(change_currency, value) / bulk covered labels.changeCurrency, changeTransactionCurrency()
61 Lines Reorder (drag to reorder) BS AP AR onReorder(sectionId, from, to) + drag handle in the gutter sheetgrid-ext form.dragToReorder, reorderTransactions()
62 Lines Combine all / Combine selected (≥2) + hint, Combined lines, Show extracted lines, modified-line warnings AP AR DE CN OB onBulkAction(combine) + lines.view (extracted/combined); logic in the container covered lineTable.combine*, showExtractedLines, modifiedLineItem*
63 Lines Bulk edit bar: set Account / Tax rate / Contact / Currency / Tag for the selected rows, Apply, Clear, Remove rows BS AP AR DE OB BulkActionBar (#6003) + onBulkApply(sectionId, rowIds, patch) covered bulk-edit-bar.tsx, common/bulk-edit-panel, lines.bulkActions
64 Lines Columns toggle (visibility) BS ColumnVisibilityMenu (#6003) covered labels.columnsToggle
65 Lines Pagination per page BS lines.pageSize covered labels.perPage
66 Lines Show / hide account type DE lines.view toggle covered lineTable.showAccountType
67 Lines Copy / paste an item or account between cells (semantic clipboard) AP AR DE CN BS SheetGrid per-cell paste (select columns take a label) covered form.clipboard.*
68 Lines Formula footer: Lines + tax − discount = total; amounts include/exclude/no tax OB lines.sum covered lines.footer*, pricesInclusive
69 Lines Ext. Balance vs Calc. Balance per row, ✓ status per row BS read-only derived column + status column sheetgrid-ext labels.columns.extBalance, calcBalance, status
70 Lines Double entry: debit/credit account, tax rate, tax amount, tags per side; “contra account required” DE BS AP two column sets from the catalog; errors in cellErrors; the kit does not know about double entry covered double-entry/sections.tsx, form.contraAccountRequired, ap_bills_enable_double_entry
71 Lines Internal accounting (entity without an integration): internal account / tax / tags / items AP AR DE CN BS picker options from internal sources (the container picks) covered internal-account-id.tsx, internal-accounting-tags.tsx
72 Lines Transactions per statement page (grouped by billed/held page) BS pages{total,read,held} only; byPage waits for page_number in bonsapi backend bank_transaction only has order; partial read via max_pages
73 Footer Publish / Re-publish, Ready & Publish, confirmation (document type, new-contact note), failure + reason, Try again, “edits saved, mark ready again” AP AR DE CN OB footer.secondary publish_document + confirmation runner + ReviewNotice covered onboarding.reviewForm.publish.*, review.extraction.actions
74 Footer Export / Re-export (template dialog) AP AR DE CN BS footer.secondary export; the export dialog outside the kit (form page) covered actions.export, export-dialog
75 Footer Publish to bank feed: must verify, unsaved changes, already published, confirm all accounts, published/failed/pending/nothing per account, retry failed, partial, pre-flight (opening/closing required, dates, amounts, reconcile), provider errors (feed connected, disconnected, manage feeds, reconnect) BS footer.secondary publish_bank_feed + ReviewSummary status per section + ReviewNotice with the pre-flight list + SyncInfo covered review.extraction.sync.bankStatement*
76 Footer Mark done morph button, confetti, form freeze while Mark done lands, primary shortcut (Enter) OB ReviewFooter.busy + MarkDoneButton + primaryShortcut covered morph-button, confetti, freeze-form, primary-shortcut
77 Footer Validation blocked dialog: Fix it / Turn off check & mark done / Ask admin OB confirmation runner + turn_off_check command (container) covered onboarding.reviewForm.validationBlocked.*
78 Footer Delete / Restore / Revert dialog with external consequences, “Type Delete all”, skip accounting cleanup AP AR DE CN BS confirmation runner (irreversible) + confirmDetail covered review.extraction.deleteDialog
79 Footer Auto-publish / auto-import enable prompt AP AR DE ReviewNotice with an action covered sync.autoPublish*
80 Document panel Page preview, page picker, zoom, rotate, bounding box highlight, remove page, page type primary/supporting AP AR DE CN BS ReviewDocumentPanel (ui-v2 pdf-viewer), outside the card stack covered review-document-panel, pageActions, pageTypeDialog
81 Document panel Zoom lens overlay (fields and cells), snippet outlines OB ZoomLensOverlay covered zoom-lens/**, snippet-outlines
82 Chat (outside the kit) tofie narration per beat, discount meter, Try another document, Book a demo OB chat shell; triggered from model facts container tofie-demo-chat-panel, review-rail
83 tofu-web review page data-anchor / data-anchor-reveals anchors on fields, rows, actions, sections (the assistant points at the UI) TW anchor in the model; presenters spread it covered ExtractionReviewField.anchor, domain/anchors.ts
84 tofu-web review page Assistant proposal per field (not the extractor’s suggestion): accept / dismiss / accept all / dismiss all TW FieldWithLens proposal adornment + 4 callbacks new-presenter ExtractionReviewProps.onAcceptProposal…
85 tofu-web review page Controlled formWidth/formHeight split + callbacks, workbench clamp, stacked on phones, --canvas-safe-bottom TW controlled ReviewWorkspace props covered layoutStore, resize_review, @bonsai/utils/workbench
86 tofu-web review page actions slot for WorkbenchActionsRow (floating on desktop, joins the chat row on phones) TW ReviewWorkspace actions?: ReactNode covered ExtractionReviewProps.actions
87 tofu-web review page Full-screen document expand + close TW ReviewDocumentPanel expanded + onExpandDocument covered labels.expandDocument / closeDocument
88 tofu-web review page Activities tab (action history, already formatted) TW ReviewActivities presenter; activities[] in the model new-presenter ExtractionReviewActivity
89 tofu-web review page Page image sources: signed URL, webp → png → bytes fallback, onPageError, r2 asset TW ReviewDocumentPanel props as the pdf-viewer has today container usePageImages, pageImageSources, r2AssetUrl
90 tofu-web review page Phases: loading skeleton, extracting, reprocessing, failed, not extracted, no permission TW phase in the model; ReviewSkeleton (moved from review-form-skeleton) + empty states new-presenter review-form-skeleton, Empty, isLoading / isReprocessing
91 tofu-web review page Escape ladder: blur field → dialog → close_extraction; app hotkeys win over the kit TW container; the kit does not swallow Escape when no field has focus container use-review-keys.ts
92 tofu-web review page Commands for the model: read_review (ReviewModel summary for every type); context surface section / dirty / check TW container (commands + surface) container read_extraction, surface.ts
93 tofu-web review page Deep links ?page_id= (active page) and ?section= (active account) survive a reload TW container (route search schema) container review.tsx validateSearch
94 tofu-web review page Resolved label strings + ReviewKitLabels (ui-v2 has no i18n; the model carries label, not a key) TW labels prop per presenter covered ExtractionReviewLabels, bank-statement/intl/labels.ts

Summary: covered 62, container 2, new-presenter 7, dropped 1, sheetgrid-ext 9, backend 1

SheetGrid extensions derived from this map #

  • #45 Column kinds (number, money, percentage, date, async picker per row, multiselect, status, read-only derived) → SheetGrid has only text / boolean / select today
  • #46 Picker in a cell: Create New, option groups, “(Archived)”, mandatory, Unknown account / tax rate + reason → options[].group/archived/mandatory, renderOption, cellErrors; refusal in the container’s applyChange
  • #47 Bounding box per cell: hover reveal, lens, pulse → rows[].cells[].box + onCellHover; ZoomLensOverlay
  • #48 Error per cell + Previous/Next problem navigation → cellErrors + LinesCard error navigation
  • #50 Tax amount editable toggle + tooltip → columns[].editableToggle + tooltip (small)
  • #51 Discount as “10%” or an amount → columns[].parse (percentage|money), a parser per column
  • #58 Child transactions (parent/child, split) → rows[].parentId + indentation
  • #61 Drag to reorder → onReorder(sectionId, from, to) + drag handle in the gutter
  • #69 Ext. Balance vs Calc. Balance, ✓ status per row → read-only derived column + status column

Small new presenters #

  • #7 Lock with a reason and a way back from ready → model.lock { reason } → ReviewNotice + readOnly; revert dialog = confirmation
  • #8 Validation summary “N things to fix” → model.errors[] → ReviewValidationBar + cellErrors/fieldErrors
  • #9 “New extraction data available → Update form” → ReviewNotice with an action
  • #11 Sync info (last publish/import, status, error, View in provider, retry) → SyncInfo presenter (ported from ui-v2 bank-statement-host)
  • #12 Activities history → ActivitiesPanel presenter, data from the container
  • #13 Duplicates → ReviewNotice with actions; resolution in the container
  • #22 Contra defaults per account + Apply → SectionDefaults presenter + onSectionAction(apply_defaults)

Field catalog (179) → kit control #

Types Level Field Label YAML type Required Shown when Control Status
AP header ap_bill_data.title Title text — text covered
AP header ap_bill_data.description Description textarea — textarea covered
AP header ap_bill_data.invoice_number Bill Number text — text covered
AP header ap_bill_data.invoice_reference Reference text supported_providers=[‘ZOHO’, ‘NON_INTEGRATED’] text covered
AP header ap_bill_data.external_contact_id Supplier Name id yes — picker: contact covered
AP header ap_bill_data.invoice_date Bill Date date yes — date covered
AP header ap_bill_data.due_date Due Date date yes — date covered
AP header ap_bill_data.currency_id Currency enum yes — select covered
AP header ap_bill_data.line_amount_type Line Amount Type enum — select covered
AP header ap_bill_data.total_amount Total Amount currency yes — money, right-aligned covered
AP header ap_bill_data.external_location_id Location id supported_providers=[‘QUICK_BOOKS’, ‘ZOHO’] picker: location covered
AP header ap_bill_data.tax_identification_number Tax Identification Number text — text covered
AP header ap_bill_data.is_reverse_charge Reverse Charge boolean supported_providers=[‘ZOHO’] toggle covered
AP header ap_bill_data.external_tag_ids Tags Options — requires_capability=has_header_level_tags tags (multi-select) covered
AP line ap_bill_line.description Description text yes — text covered
AP line ap_bill_line.quantity Quantity number yes — number, right-aligned sheetgrid-ext
AP line ap_bill_line.unit_price Unit Price currency yes — money, right-aligned sheetgrid-ext
AP line ap_bill_line.tax_amount Tax Amount currency excluded_by_entity_settings=ap_bills_enable_double_entry money, right-aligned sheetgrid-ext
AP line ap_bill_line.external_account_id Account id yes excluded_by_entity_settings=ap_bills_enable_double_entry picker: account sheetgrid-ext
AP line ap_bill_line.external_item_id Item id supported_providers=[‘FREEE’, ‘XERO’, ‘ZOHO’, ‘SAGE’, ‘NON_INTEGRATED’] picker: item sheetgrid-ext
AP line ap_bill_line.external_tax_rate_id Tax Rate id excluded_by_entity_settings=ap_bills_enable_double_entry picker: tax rate sheetgrid-ext
AP line ap_bill_line.external_tag_ids Tags Options array excluded_by_entity_settings=ap_bills_enable_double_entry multiselect column sheetgrid-ext
AP line ap_bill_line.external_debit_account_id Debit Account — requires_entity_settings=ap_bills_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AP line ap_bill_line.external_credit_account_id Credit Account — requires_entity_settings=ap_bills_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AP line ap_bill_line.external_debit_tax_rate_id Debit Tax Rate — requires_entity_settings=ap_bills_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AP line ap_bill_line.external_credit_tax_rate_id Credit Tax Rate — requires_entity_settings=ap_bills_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AP line ap_bill_line.debit_tax_amount Debit Tax Amount — requires_entity_settings=ap_bills_enable_double_entry money (debit/credit side) sheetgrid-ext
AP line ap_bill_line.credit_tax_amount Credit Tax Amount — requires_entity_settings=ap_bills_enable_double_entry money (debit/credit side) sheetgrid-ext
AP line ap_bill_line.external_debit_tag_ids Debit Tag — requires_entity_settings=ap_bills_enable_double_entry multiselect column sheetgrid-ext
AP line ap_bill_line.external_credit_tag_ids Credit Tag — requires_entity_settings=ap_bills_enable_double_entry multiselect column sheetgrid-ext
AP CN header ap_credit_note_data.title Title text — text covered
AP CN header ap_credit_note_data.credit_note_number Credit Note Number text — text covered
AP CN header ap_credit_note_data.reference Reference text supported_providers=[‘ZOHO’, ‘NON_INTEGRATED’] text covered
AP CN header ap_credit_note_data.external_contact_id Supplier Name id — picker: contact covered
AP CN header ap_credit_note_data.credit_note_date Credit Note Date date — date covered
AP CN header ap_credit_note_data.currency_id Currency enum — select covered
AP CN header ap_credit_note_data.line_amount_type Line Amount Type enum — select covered
AP CN header ap_credit_note_data.total_amount Total Amount currency — money, right-aligned covered
AP CN header ap_credit_note_data.external_location_id Location id supported_providers=[‘QUICK_BOOKS’, ‘ZOHO’] picker: location covered
AP CN header ap_credit_note_data.tax_identification_number Tax Identification Number text — text covered
AP CN header ap_credit_note_data.original_invoice_number Original Invoice Number text — text covered
AP CN header ap_credit_note_data.original_invoice_date Original Invoice Date date — date covered
AP CN header ap_credit_note_data.reason_description Reason text — text covered
AP CN header ap_credit_note_data.notes Notes textarea — textarea covered
AP CN header ap_credit_note_data.external_tag_ids Tags Options — requires_capability=has_header_level_tags tags (multi-select) covered
AP CN line ap_credit_note_line.description Description text — text covered
AP CN line ap_credit_note_line.quantity Quantity number — number, right-aligned sheetgrid-ext
AP CN line ap_credit_note_line.unit_price Unit Price currency — money, right-aligned sheetgrid-ext
AP CN line ap_credit_note_line.tax_amount Tax Amount currency — money, right-aligned sheetgrid-ext
AP CN line ap_credit_note_line.external_account_id Account id — picker: account sheetgrid-ext
AP CN line ap_credit_note_line.external_item_id Item id supported_providers=[‘FREEE’] picker: item sheetgrid-ext
AP CN line ap_credit_note_line.external_tax_rate_id Tax Rate id — picker: tax rate sheetgrid-ext
AP CN line ap_credit_note_line.external_tag_ids Tags Options array — multiselect column sheetgrid-ext
AR CN header ar_credit_note_data.title Title text — text covered
AR CN header ar_credit_note_data.credit_note_number Credit Note Number text — text covered
AR CN header ar_credit_note_data.reference Reference text supported_providers=[‘XERO’, ‘NON_INTEGRATED’] text covered
AR CN header ar_credit_note_data.external_contact_id Customer Name id — picker: contact covered
AR CN header ar_credit_note_data.credit_note_date Credit Note Date date — date covered
AR CN header ar_credit_note_data.currency_id Currency enum — select covered
AR CN header ar_credit_note_data.line_amount_type Line Amount Type enum requires_accounting_config=supports_line_amount_types select covered
AR CN header ar_credit_note_data.total_amount Total Amount currency — money, right-aligned covered
AR CN header ar_credit_note_data.external_location_id Location id supported_providers=[‘QUICK_BOOKS’, ‘ZOHO’] picker: location covered
AR CN header ar_credit_note_data.discount_rate Discount Rate number supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled number, right-aligned covered
AR CN header ar_credit_note_data.discount_amount Discount Amount currency supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled money, right-aligned covered
AR CN header ar_credit_note_data.discount_type Discount Type enum supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled select covered
AR CN header ar_credit_note_data.tax_identification_number Tax Identification Number text — text covered
AR CN header ar_credit_note_data.original_invoice_number Original Invoice Number text — text covered
AR CN header ar_credit_note_data.original_invoice_date Original Invoice Date date — date covered
AR CN header ar_credit_note_data.reason_description Reason text — text covered
AR CN header ar_credit_note_data.notes Notes textarea — textarea covered
AR CN header ar_credit_note_data.external_tag_ids Tags Options — requires_capability=has_header_level_tags tags (multi-select) covered
AR CN line ar_credit_note_line.description Description textarea — textarea covered
AR CN line ar_credit_note_line.quantity Quantity number — number, right-aligned sheetgrid-ext
AR CN line ar_credit_note_line.unit_price Unit Price currency — money, right-aligned sheetgrid-ext
AR CN line ar_credit_note_line.tax_amount Tax Amount currency requires_accounting_config_non_null=line_level_tax_type money, right-aligned sheetgrid-ext
AR CN line ar_credit_note_line.external_account_id Account id supported_providers=[‘XERO’, ‘ZOHO’, ‘SAGE’, ‘FREEE’, ‘NON_INTEGRATED’] picker: account sheetgrid-ext
AR CN line ar_credit_note_line.external_tax_rate_id Tax Rate id — picker: tax rate sheetgrid-ext
AR CN line ar_credit_note_line.external_tag_ids Tags Options array — multiselect column sheetgrid-ext
AR CN line ar_credit_note_line.external_item_id Item id — picker: item sheetgrid-ext
AR header ar_invoice_data.title Title text — text covered
AR header ar_invoice_data.description Description textarea — textarea covered
AR header ar_invoice_data.invoice_number Invoice Number text — text covered
AR header ar_invoice_data.invoice_reference Invoice Reference text supported_providers=[‘XERO’, ‘NON_INTEGRATED’] text covered
AR header ar_invoice_data.external_contact_id Customer Name id yes — picker: contact covered
AR header ar_invoice_data.invoice_date Invoice Date date yes — date covered
AR header ar_invoice_data.due_date Due Date date — date covered
AR header ar_invoice_data.currency_id Currency enum yes — select covered
AR header ar_invoice_data.line_amount_type Line Amount Type enum requires_accounting_config=supports_line_amount_types select covered
AR header ar_invoice_data.total_amount Total Amount currency yes — money, right-aligned covered
AR header ar_invoice_data.external_location_id Location id supported_providers=[‘QUICK_BOOKS’, ‘ZOHO’] picker: location covered
AR header ar_invoice_data.discount_rate Discount Rate number supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled; excluded_by_entity_settings=ar_invoices_enable_double_entry number, right-aligned covered
AR header ar_invoice_data.discount_amount Discount Amount currency supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled; excluded_by_entity_settings=ar_invoices_enable_double_entry money, right-aligned covered
AR header ar_invoice_data.discount_type Discount Type enum supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=discounts_enabled; excluded_by_entity_settings=ar_invoices_enable_double_entry select covered
AR header ar_invoice_data.tax_identification_number Tax Identification Number text — text covered
AR header ar_invoice_data.is_reverse_charge Reverse Charge boolean supported_providers=[‘ZOHO’] toggle covered
AR header ar_invoice_data.bill_address Bill to — supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=address_for_sale_enabled address (invoice-address-field ui-v2) covered
AR header ar_invoice_data.ship_address Ship to — supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=address_for_sale_enabled address (invoice-address-field ui-v2) covered
AR header ar_invoice_data.ship_from_address Ship from — supported_providers=[‘QUICK_BOOKS’]; requires_metadata_flag=address_for_sale_enabled address (invoice-address-field ui-v2) covered
AR header ar_invoice_data.external_tag_ids Tags Options — requires_capability=has_header_level_tags tags (multi-select) covered
AR line ar_invoice_line.description Description textarea yes — textarea covered
AR line ar_invoice_line.quantity Quantity number yes — number, right-aligned sheetgrid-ext
AR line ar_invoice_line.unit_price Unit Price currency yes — money, right-aligned sheetgrid-ext
AR line ar_invoice_line.discount_rate Discount Rate number supported_providers=[‘XERO’, ‘SAGE’, ‘NON_INTEGRATED’] number, right-aligned sheetgrid-ext
AR line ar_invoice_line.discount_amount Discount Amount currency supported_providers=[‘XERO’, ‘SAGE’, ‘NON_INTEGRATED’] money, right-aligned sheetgrid-ext
AR line ar_invoice_line.discount_type Discount Type enum supported_providers=[‘XERO’, ‘SAGE’, ‘NON_INTEGRATED’] select covered
AR line ar_invoice_line.tax_amount Tax Amount currency requires_accounting_config_non_null=line_level_tax_type; excluded_by_entity_settings=ar_invoices_enable_double_entry money, right-aligned sheetgrid-ext
AR line ar_invoice_line.external_account_id Account id yes excluded_by_entity_settings=ar_invoices_enable_double_entry; supported_providers=[‘XERO’, ‘ZOHO’, ‘SAGE’, ‘FREEE’, ‘NON_INTEGRATED’] picker: account sheetgrid-ext
AR line ar_invoice_line.external_tax_rate_id Tax Rate id yes excluded_by_entity_settings=ar_invoices_enable_double_entry picker: tax rate sheetgrid-ext
AR line ar_invoice_line.external_tag_ids Tags Options array excluded_by_entity_settings=ar_invoices_enable_double_entry multiselect column sheetgrid-ext
AR line ar_invoice_line.external_item_id Item id excluded_by_entity_settings=ar_invoices_enable_double_entry picker: item sheetgrid-ext
AR line ar_invoice_line.external_debit_account_id Debit Account — requires_entity_settings=ar_invoices_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AR line ar_invoice_line.external_credit_account_id Credit Account — requires_entity_settings=ar_invoices_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AR line ar_invoice_line.external_debit_tax_rate_id Debit Tax Rate — requires_entity_settings=ar_invoices_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AR line ar_invoice_line.external_credit_tax_rate_id Credit Tax Rate — requires_entity_settings=ar_invoices_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
AR line ar_invoice_line.debit_tax_amount Debit Tax Amount — requires_entity_settings=ar_invoices_enable_double_entry money (debit/credit side) sheetgrid-ext
AR line ar_invoice_line.credit_tax_amount Credit Tax Amount — requires_entity_settings=ar_invoices_enable_double_entry money (debit/credit side) sheetgrid-ext
AR line ar_invoice_line.external_debit_tag_ids Debit Tag — requires_entity_settings=ar_invoices_enable_double_entry multiselect column sheetgrid-ext
AR line ar_invoice_line.external_credit_tag_ids Credit Tag — requires_entity_settings=ar_invoices_enable_double_entry multiselect column sheetgrid-ext
BS header bank_statement_data.bank_name Bank Name text yes — text covered
BS header bank_statement_data.account_number Account Number text yes — text covered
BS header bank_statement_data.external_account_id Bank Account id — picker: account covered
BS header bank_statement_data.currency_id Currency enum — select covered
BS header bank_statement_data.opening_balance Opening Balance currency yes — money, right-aligned covered
BS header bank_statement_data.closing_balance Closing Balance currency yes — money, right-aligned covered
BS header bank_statement_data.credit_total Credit Total currency yes — money, right-aligned covered
BS header bank_statement_data.debit_total Debit Total currency yes — money, right-aligned covered
BS header bank_statement_data.subtotal Subtotal currency yes — money, right-aligned covered
BS header bank_statement_data.start_date Start Date date yes — date covered
BS header bank_statement_data.end_date End Date date yes — date covered
BS line bank_transaction.date Transaction Date date yes — date covered
BS line bank_transaction.external_contact_id Contact Name id yes — picker: contact sheetgrid-ext
BS line bank_transaction.description Description textarea — textarea covered
BS line bank_transaction.amount Amount currency yes — money, right-aligned sheetgrid-ext
BS line bank_transaction.balance Balance currency yes — money, right-aligned sheetgrid-ext
BS line bank_transaction.reference Reference text — text covered
BS line bank_transaction.currency_id Currency enum — select covered
BS line bank_transaction.external_account_id Account id yes supported_version=[1] picker: account sheetgrid-ext
BS line bank_transaction.external_tax_rate_id Tax Rate id supported_version=[1] picker: tax rate sheetgrid-ext
BS line bank_transaction.tax_rate Tax Rate number supported_version=[1] number, right-aligned sheetgrid-ext
BS line bank_transaction.tax_amount Tax Amount currency supported_version=[1] money, right-aligned sheetgrid-ext
BS line bank_transaction.external_tag_ids Tags Options array supported_version=[1] multiselect column sheetgrid-ext
BS line bank_transaction.external_debit_account_id Debit Account id supported_version=[2] picker: account sheetgrid-ext
BS line bank_transaction.external_credit_account_id Credit Account id supported_version=[2] picker: account sheetgrid-ext
BS line bank_transaction.external_debit_tax_rate_id Debit Tax Rate id supported_version=[2] picker: tax rate sheetgrid-ext
BS line bank_transaction.external_credit_tax_rate_id Credit Tax Rate id supported_version=[2] picker: tax rate sheetgrid-ext
BS line bank_transaction.external_debit_tag_ids Debit Tags array supported_version=[2] multiselect column sheetgrid-ext
BS line bank_transaction.external_credit_tag_ids Credit Tags array supported_version=[2] multiselect column sheetgrid-ext
DE header direct_expense_data.title Title text — text covered
DE header direct_expense_data.description Description textarea — textarea covered
DE header direct_expense_data.reference Reference text — text covered
DE header direct_expense_data.spend_type Spend Type enum supported_providers=[‘XERO’] select covered
DE header direct_expense_data.payment_type Payment Type enum unsupported_providers=[‘XERO’] select covered
DE header direct_expense_data.external_contact_id Contact Name id yes — picker: contact covered
DE header direct_expense_data.external_account_id Account id yes — picker: account covered
DE header direct_expense_data.external_location_id Location id supported_providers=[‘QUICK_BOOKS’, ‘ZOHO’] picker: location covered
DE header direct_expense_data.transaction_date Transaction Date date yes — date covered
DE header direct_expense_data.currency_id Currency enum yes — select covered
DE header direct_expense_data.line_amount_type Line Amount Type enum — select covered
DE header direct_expense_data.total_amount Total Amount currency — money, right-aligned covered
DE header direct_expense_data.tax_identification_number Tax Identification Number text — text covered
DE header direct_expense_data.is_reverse_charge Reverse Charge boolean supported_providers=[‘ZOHO’] toggle covered
DE header direct_expense_data.external_tag_ids Tags Options — requires_capability=has_header_level_tags tags (multi-select) covered
DE line direct_expense_line_fields.description Description textarea yes — textarea covered
DE line direct_expense_line_fields.quantity Quantity number yes — number, right-aligned sheetgrid-ext
DE line direct_expense_line_fields.unit_price Unit Price currency yes — money, right-aligned sheetgrid-ext
DE line direct_expense_line_fields.amount Amount currency — money, right-aligned sheetgrid-ext
DE line direct_expense_line_fields.tax_amount Tax Amount currency excluded_by_entity_settings=direct_expenses_enable_double_entry money, right-aligned sheetgrid-ext
DE line direct_expense_line_fields.external_account_id Account id excluded_by_entity_settings=direct_expenses_enable_double_entry picker: account sheetgrid-ext
DE line direct_expense_line_fields.external_item_id Item id supported_providers=[‘FREEE’] picker: item sheetgrid-ext
DE line direct_expense_line_fields.external_tax_rate_id Tax Rate id excluded_by_entity_settings=direct_expenses_enable_double_entry picker: tax rate sheetgrid-ext
DE line direct_expense_line_fields.external_tag_ids Tags Options array excluded_by_entity_settings=direct_expenses_enable_double_entry multiselect column sheetgrid-ext
DE line direct_expense_line_fields.external_debit_account_id Debit Account — requires_entity_settings=direct_expenses_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
DE line direct_expense_line_fields.external_credit_account_id Credit Account — requires_entity_settings=direct_expenses_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
DE line direct_expense_line_fields.external_debit_tax_rate_id Debit Tax Rate — requires_entity_settings=direct_expenses_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
DE line direct_expense_line_fields.external_credit_tax_rate_id Credit Tax Rate — requires_entity_settings=direct_expenses_enable_double_entry picker (debit/credit side, double entry) sheetgrid-ext
DE line direct_expense_line_fields.debit_tax_amount Debit Tax Amount — requires_entity_settings=direct_expenses_enable_double_entry money (debit/credit side) sheetgrid-ext
DE line direct_expense_line_fields.credit_tax_amount Credit Tax Amount — requires_entity_settings=direct_expenses_enable_double_entry money (debit/credit side) sheetgrid-ext
DE line direct_expense_line_fields.external_debit_tag_ids Debit Tag — requires_entity_settings=direct_expenses_enable_double_entry multiselect column sheetgrid-ext
DE line direct_expense_line_fields.external_credit_tag_ids Credit Tag — requires_entity_settings=direct_expenses_enable_double_entry multiselect column sheetgrid-ext

Non-feature inputs (95+), 114 rows #

Every input from scans [1]–[7] of the inventory that is not a feature: entity settings, accounting config fields, metadata flags, capabilities, number decisions, validation points, the 18 statuses, document/permission/onboarding (R2.9, 2026-10-23). ctx field = kunci ReviewContext; Fixture id = the named context in libs/typescript/utils/src/review/fixtures/contexts/ that exercises it. Status backend = a gap only bonsapi can close; the kit tolerates it. The full list of read sites is attached to ENG-9191.

# Area Input Types ctx field Mekanisme kit Status Fixture id Approved
95 Input: entity setting ap_bills_enable_double_entry AP entity.settings.ap_bills_enable_double_entry rules-settings publishAllowed (publish gate), catalog requires/excluded read document.isDoubleEntry covered xero.apBill.doubleEntry, moneyForward.apBill.doubleEntry
96 Input: entity setting ar_invoices_enable_double_entry AR entity.settings.ar_invoices_enable_double_entry publishAllowed; columns from document.isDoubleEntry covered xero.arInvoice.doubleEntry
97 Input: entity setting direct_expenses_enable_double_entry DE entity.settings.direct_expenses_enable_double_entry publishAllowed; columns from document.isDoubleEntry covered xero.directExpense.doubleEntry
98 Input: entity setting bank_statements_enable_double_entry BS entity.settings.bank_statements_enable_double_entry publishAllowed + applyEntitySettings (contra defaults only with supports_double_entry_bank_statement) covered freeAgent.bankStatement.doubleEntry
99 Input: entity setting line_item_tax_amount_override_enabled AP CN entity.settings.line_item_tax_amount_override_enabled taxOverrideEnabled → applyEntitySettings tax_amount readOnly covered xero.apBill.taxOverrideOff
100 Input: entity setting ar_invoices_line_item_tax_amount_override_enabled AR CN entity.settings.ar_invoices_line_item_tax_amount_override_enabled taxOverrideEnabled covered xero.arInvoice.taxOverrideOff
101 Input: entity setting direct_expenses_line_item_tax_amount_override_enabled DE entity.settings.direct_expenses_line_item_tax_amount_override_enabled taxOverrideEnabled × features.directExpenseTaxOverride covered xero.directExpense.draft
102 Input: entity setting account_type_column_enabled AP AR DE CN entity.settings.account_type_column_enabled accountTypeColumnOn → applyEntitySettings covered xero.apBill.accountTypeOff
103 Input: entity setting auto_publish_{ap_bills,ar_invoices,direct_expenses,bank_statements,ap_credit_notes,ar_credit_notes}_enabled AP AR DE CN BS entity.settings.auto_publish_* autoPublishes → footer.primaryPublishes covered xero.apBill.autoPublish, xero.allTypes.autoPublish
104 Input: entity setting ap/ar_credit_notes_accounting_status_on_publish CN entity.settings.*_credit_notes_accounting_status_on_publish container (WASM validator input) container —
105 Input: entity setting ar_invoices_accounting_invoice_status_on_publish / _on_verify AR entity.settings.ar_invoices_accounting_invoice_status_on_* container (WASM validator input) container —
106 Input: entity setting {type}_enabled ×6 (+ credit_note flag) AP AR DE CN BS entity.typesEnabled applyEntitySettings keeps “Change type” only with another type covered xero.apBill.typesEnabled
107 Input: entity setting snippet_type, ai_auto_split_type, ai_page_classification_type AP AR DE CN BS — (not in §1) container (document panel actions, snippet hold) container —
108 Input: entity setting calculation_decimals AP AR DE CN entity.settings.calculation_decimals resolveNumbers step (d) covered nonIntegrated.apBill.calculationDecimals
109 Input: entity setting extraction_config (per type) AP AR DE CN entity.settings.extraction_config.{type}.* resolveNumbers step (b), credit notes their own key covered nonIntegrated.apBill.japanPreset, nonIntegrated.apCreditNote.ownRounding
110 Input: entity setting multi_currency_enabled (entity) AP AR DE entity.settings.multi_currency_enabled canCreate(currency) without a connection (P: the read had no effect) covered nonIntegrated.apBill.multiCurrency
111 Input: entity setting hidden_extraction_fields AP AR DE BS CN entity.settings.{type}.hidden_extraction_fields notHidden (full catalog names; CN obey the parent list) covered xero.apBill.hiddenFields, xero.apCreditNote.hiddenByParent
112 Input: entity setting validate_total_amount AP AR DE CN entity.settings.{type}.validate_total_amount validatesTotal → applyValidationPolicy check.blocking + total_mismatch covered xero.apBill.totalCheckOff, xero.directExpense.totalCheckOff
113 Input: entity setting validate_tax_identification_number AP AR DE CN entity.settings.{type}.validate_tax_identification_number validatesTaxId → counterparty.taxId.blocking + tax_id_mismatch covered xero.apBill.taxIdCheckOff, xero.arInvoice.validationOff
114 Input: entity setting is_contact_tax_identification_number_sync_enabled AP AR DE CN entity.settings.{type}.is_contact_tax_identification_number_sync_enabled container (verify command side effect) container —
115 Input: entity setting csv_export_target AP AR DE BS entity.settings.{type}.csv_export_target container (export dialog) container —
116 Input: entity setting bank_statement.enable_multi_account BS entity.settings.bank_statement.enable_multi_account bankStatementPolicy → canAddSection, rowActions move covered xero.bankStatement.singleAccount
117 Input: entity setting bank_statement.enable_child_transactions BS entity.settings.bank_statement.enable_child_transactions bankStatementPolicy → rowActions add_child covered xero.bankStatement.noChildRows
118 Input: entity setting bank_statement.validate_opening_closing_balance BS entity.settings.bank_statement.validate_opening_closing_balance bankStatementPolicy → check rows opening/closing covered xero.bankStatement.checksOff
119 Input: entity setting bank_statement.validate_credit_debit_total BS entity.settings.bank_statement.validate_credit_debit_total check rows total debit/credit covered xero.bankStatement.checksOff
120 Input: entity setting bank_statement.validate_subtotal BS entity.settings.bank_statement.validate_subtotal check row subtotal covered xero.bankStatement.checksOff
121 Input: entity setting bank_statement.validate_per_line_balance BS entity.settings.bank_statement.validate_per_line_balance row status kept only while on covered xero.bankStatement.checksOff
122 Input: entity setting auto_ready_*, auto_done_after_* AP AR DE CN BS — (not in §1) out of kit (onboarding automation panel) container —
123 Input: accounting config tax_calculation (Internal/None/External) AP AR DE CN integration.accountingConfig.tax_calculation priceBasisAllowed (forced no tax), tax columns, requiredBy, external tax field covered xeroNoTax.apBill.draft, qboUs.arInvoice.externalTax
124 Input: accounting config line_level_tax_type AP AR DE CN integration.accountingConfig.line_level_tax_type lineTaxIsToggle + catalog configNonNull covered qboUs.arInvoice.externalTax
125 Input: accounting config extraction_level_tax_type AR integration.accountingConfig.extraction_level_tax_type header external_tax_rate_id rule covered qboUs.arInvoice.externalTax
126 Input: accounting config tax_calculation_mode AP AR DE CN integration.accountingConfig.tax_calculation_mode → numbers.taxMode resolveNumbers + lineTaxAmountShown covered qbo.apBill.accrued, zoho.apBill.tags
127 Input: accounting config rounding_method / tax_rounding_method AP AR DE CN integration.accountingConfig.rounding_method → numbers.rounding resolveNumbers; calculator in the adapter covered nonIntegrated.apBill.japanPreset
128 Input: accounting config *_decimal_places (line, tax, unit price, quantity) AP AR DE CN integration.accountingConfig.*_decimal_places → numbers.decimals resolveNumbers step (c) covered qbo.apBill.accrued, freee.apBill.zeroDecimals
129 Input: accounting config total_decimal_places AP AR DE CN — (not in ctx) total follows line decimals, as bonsapi backend freee.apBill.zeroDecimals
130 Input: accounting config supports_tax_override AP AR DE CN — (not in ctx) nothing reads it today backend —
131 Input: accounting config supports_tax_group_override AP AR DE CN integration.accountingConfig.supports_tax_group_override container-only (calculator; adapter makes tax-group rows editable) container —
132 Input: accounting config calculate_groups_by_tax_components AP AR DE CN integration.accountingConfig.calculate_groups_by_tax_components container-only (calculator) container —
133 Input: accounting config supports_line_amount_types AP AR DE CN integration.accountingConfig.supports_line_amount_types priceBasisAllowed options + catalog configOn covered qboUs.arInvoice.externalTax
134 Input: accounting config empty_is_auto_tax AR integration.accountingConfig.empty_is_auto_tax container-only (calculator / footer hint) container —
135 Input: metadata discounts_enabled (QBO) AR CN integration.metadata.discounts_enabled header discount rule (metadataOn) covered qbo.arInvoice.salesOptions
136 Input: metadata address_for_sale_enabled (QBO) AR integration.metadata.address_for_sale_enabled catalog requiresMetadataFlag covered qbo.arInvoice.salesOptions
137 Input: metadata deposits_enabled (QBO) AR integration.metadata.deposits_enabled header deposit rule covered qbo.arInvoice.salesOptions
138 Input: metadata allow_service_date (QBO) AR integration.metadata.allow_service_date line service_date rule covered qbo.arInvoice.salesOptions
139 Input: metadata use_account_numbers (QBO) AP AR DE CN integration.metadata.use_account_numbers (→ features.accountCode) container (account option labels) container —
140 Input: metadata country_code (QBO US, Zoho, Sage) AP AR DE CN integration.metadata.country_code (→ features) provider config served (QBO US) + features; container container qboUs.arInvoice.externalTax
141 Input: metadata pays_tax (QBO, Xero) AP AR DE CN integration.metadata.pays_tax requiredBy(line.tax_rate); canCreate(taxRate) via features.paysTax covered xero.arInvoice.draft, xeroNoTax.arInvoice.draft
142 Input: metadata multi_currency_enabled (connection) AP AR DE CN integration.metadata.multi_currency_enabled (→ features.multiCurrency) canCreate(currency) via features covered xero.apBill.draft
143 Input: metadata base_currency, default_item_id, book_close_date AP AR DE CN integration.metadata.* container (WASM validator) container —
144 Input: metadata invoice_auto_number_disabled (Zoho) AR integration.metadata.invoice_auto_number_disabled (→ features.salesNumberRequired) requiredBy(invoice_number) covered zoho.arInvoice.ownNumbering
145 Input: metadata FreeAgent company fields AP AR DE CN integration.metadata.freeagent_company.* container (WASM validator) container —
146 Input: metadata short_code, bank_feed_connections (Xero) BS integration.metadata.short_code / bank_feed_connections container (link) / BS adapter → section.status.connected container xero.bankStatement.twoAccounts
147 Input: metadata books_domain, organization_id, subdomain, country_id (links) AP AR DE CN BS — (container builds the link) container (profile.documentUrl in @bonsai/utils) container —
148 Input: metadata supports_contact_tax_identification_number (Zoho) AP AR DE CN integration.features.contacts.taxId container (contact dialogs) container —
149 Input: capability can_publish AP AR DE integration.capabilities (can_publish) publishAllowed everywhere (P: no raw flag) covered status.READY
150 Input: capability can_publish_credit_note / can_publish_ap_credit_note CN integration.capabilities publishAllowed per CN type covered xero.apCreditNote.draft, xero.arCreditNote.draft
151 Input: capability can_publish_bank_statement BS integration.capabilities publishAllowed (P: capability, not the list) covered zoho.bankStatement.draft
152 Input: capability supports_double_entry_bank_statement BS integration.capabilities publishAllowed + contra defaults; tofu-web schema lacks it backend freeAgent.bankStatement.doubleEntry
153 Input: capability can_publish_attachments AP AR DE integration.capabilities container (attachment hint in the publish dialog) container —
154 Input: capability can_create_contacts AP AR DE CN BS options.canCreate.contact canCreate(contact) → allowCreate covered perm.noIntegrationWrite
155 Input: capability can_create_currencies AP AR DE CN options.canCreate.currency canCreate(currency) covered xero.apBill.draft
156 Input: capability can_create_accounts AP AR DE CN options.canCreate.account canCreate(account) covered xero.apBill.draft
157 Input: capability can_create_tax_rates AP AR DE CN options.canCreate.taxRate canCreate(taxRate) (+ pays_tax, not QBO US) covered xeroNoTax.apBill.draft, qboUs.apBill.noTax
158 Input: capability can_create_bank_account BS options.canCreate.bankAccount canCreate(bankAccount) (P: gated) covered zoho.bankStatement.draft
159 Input: capability can_create_items AP AR DE CN options.canCreate.item canCreate(item) (P: capability) covered nonIntegrated.apBill.internal
160 Input: capability has_header_level_tags AP AR DE CN integration.capabilities → features.tags.headerLevel tagColumnsFor(TRANSACTION) + catalog requiresCapability (P: capability) covered zoho.apBill.tags, freeAgent.apBill.draft, dynamicsBc.apBill.draft
161 Input: capability can_sync_contact_tax_identification_number AP AR DE CN integration.capabilities container (verify command) container —
162 Input: capability supports_invoice_status_on_publish / default_invoice_status_on_publish AR CN — (not in ctx) container (validator status) container —
163 Input: numbers Decimal resolver order AP AR DE CN BS numbers.decimals resolveNumbers (one rule for decimals and rounding; BS like every type) covered nonIntegrated.apBill.jpy, freee.apBill.zeroDecimals
164 Input: numbers Minimum shown decimals = 2 AP AR DE CN BS numbers.minDecimals applyNumbers → model.format; formatAmount covered xero.apBill.draft
165 Input: numbers Typed number parsing AP AR DE CN BS — (kit function) parseAmount: refuse comma decimal with an error covered —
166 Input: numbers Date parsing AP AR DE CN BS — (decision pending, §3.2) one parser with the date cell (M3.5.2) sheetgrid-ext —
167 Input: numbers Tax rate decimals 6 (DE was 2) AP AR DE CN numbers.decimals.taxRate resolveNumbers → 6 for every type covered xero.directExpense.draft
168 Input: numbers Display locale en-US AP AR DE CN BS numbers.locale applyNumbers → model.format.locale (en-US until decided) covered xero.apBill.draft
169 Input: numbers Total reconciliation and external-tax formula AR — (adapter) adapter changeRows with the backend formula container qboUs.arInvoice.externalTax
170 Input: validation Live form validation (zod + WASM) AP AR DE CN — (container runs WASM) results enter as field.error / cell.error / notices container —
171 Input: validation Mark ready client gates (≥1 line, total, tax ID) AP AR DE CN BS entity.settings.{type}.validate_* applyValidationPolicy → footer.primaryBlockedBy covered xero.apBill.totalCheckOff, xero.directExpense.totalCheckOff
172 Input: validation Mark done (onboarding) blocked dialog AP AR DE permissions.isAdmin applyPermissions → check.canTurnOff covered perm.notAdmin
173 Input: validation BS publish ignores the validation toggles BS — kit mirrors the toggles; backend runs all on publish backend xero.bankStatement.checksOff
174 Input: validation Mandatory tag roots have no blocking rule AP AR DE CN entity.tagRoots[].mandatory tagColumnsFor → column.mandatory (no block) backend zoho.apBill.tags
175 Input: validation New bank account needs an account number BS — tolerated: backend rejects; dialog in container backend —
176 Input: validation Credit note tax ID: client blocks, backend never checks CN entity.settings.{parent}.validate_tax_identification_number kit blocks as the client does; backend gap recorded backend xero.apCreditNote.draft
177 Input: document / permission / onboarding document.isDoubleEntry (per document) AP AR DE document.isDoubleEntry catalog double-entry rules + applyEntitySettings covered xero.apBill.doubleEntry
178 Input: document / permission / onboarding Duplicates AP AR DE CN BS document.duplicates applyValidationPolicy → notice possible_duplicate covered xero.apBill.duplicates
179 Input: document / permission / onboarding Pages read / held (partial read) BS document.pages applyDocumentLock → section.pages covered onboarding.bankStatement.pagesHeld
180 Input: document / permission / onboarding Error phase AP AR DE CN BS document.errorPhase applyValidationPolicy → notice error covered status.ERROR
181 Input: document / permission / onboarding Published / exported edit warning, accounting link AP AR DE CN BS document.isPublished / lastExportedAt / externalId applyDocumentLock → notices + open_in_provider covered status.PUBLISHED, status.EXPORTED
182 Input: document / permission / onboarding Integration disconnected AP AR DE CN BS integration.state notice disconnected; no internal fallback covered disconnected.xero.apBill
183 Input: document / permission / onboarding Internal accounting (no integration) AP AR DE CN BS entity.internalAccounting tagColumnsFor internal roots; options from the container covered nonIntegrated.apBill.internal, nonIntegrated.apBill.noInternal
184 Input: document / permission / onboarding Permission INVOICE:update / read AP AR DE CN BS permissions.canUpdate / canRead applyPermissions → read_only lock covered perm.noUpdate, perm.noRead
185 Input: document / permission / onboarding Permission INVOICE_VERIFICATION:update / delete AP AR DE CN BS permissions.canVerify / canDelete applyPermissions → no_permission block, menu covered perm.noVerify, perm.noDelete
186 Input: document / permission / onboarding INTEGRATION:write for inline create AP AR DE CN BS permissions.canWriteIntegration canCreate covered perm.noIntegrationWrite
187 Input: document / permission / onboarding Impersonation / trial cap AP AR DE CN BS permissions.isImpersonating / trialBlocked applyPermissions covered perm.impersonating, perm.trialBlocked
188 Input: document / permission / onboarding Onboarding lock, limit, units, demo AP AR DE CN BS onboarding.* applyDocumentLock (lock derived from status; demo never locks) covered onboarding.apBill.ready, onboarding.apBill.limitReached, onboarding.apBill.demo
189 Input: document / permission / onboarding Onboarding discount loop AP AR DE CN BS onboarding.discount container (chat shell) container —
190 Input: document / permission / onboarding Locale, RTL, date format AP AR DE CN BS locale.* container (labels, dir, formatted dates) container —
191 Input: status ExtractionStatus PENDING AP AR DE CN BS status STATUS_TABLE → busy lock, no primary covered status.PENDING
192 Input: status ExtractionStatus PROCESSING AP AR DE CN BS status STATUS_TABLE → busy, processing notice covered status.PROCESSING
193 Input: status ExtractionStatus AWAITING_PROCESSING AP AR DE CN BS status STATUS_TABLE → busy, processing notice covered status.AWAITING_PROCESSING
194 Input: status ExtractionStatus DRAFT AP AR DE CN BS status STATUS_TABLE → Mark ready covered status.DRAFT
195 Input: status ExtractionStatus NEEDS_REVIEW AP AR DE CN BS status STATUS_TABLE → Mark ready covered status.NEEDS_REVIEW
196 Input: status ExtractionStatus REVIEW_LATER AP AR DE CN BS status STATUS_TABLE → Mark ready covered status.REVIEW_LATER
197 Input: status ExtractionStatus VERIFIED AP AR DE CN BS status STATUS_TABLE → static (edit closed), publish/export covered status.VERIFIED
198 Input: status ExtractionStatus ERROR AP AR DE CN BS status STATUS_TABLE → unread lock covered status.ERROR
199 Input: status ExtractionStatus LIMIT_REACHED AP AR DE CN BS status STATUS_TABLE → limit notice, Mark done covered status.LIMIT_REACHED
200 Input: status ExtractionStatus DELETING AP AR DE CN BS status STATUS_TABLE → deleting notice covered status.DELETING
201 Input: status ExtractionStatus DELETED AP AR DE CN BS status STATUS_TABLE → deleted notice, revert covered status.DELETED
202 Input: status ExtractionStatus MANUAL_CLEANUP AP AR DE CN BS status STATUS_TABLE → static, Mark done covered status.MANUAL_CLEANUP
203 Input: status ExtractionStatus EXPORTING AP AR DE CN BS status STATUS_TABLE → busy covered status.EXPORTING
204 Input: status ExtractionStatus EXPORTED AP AR DE CN BS status STATUS_TABLE → Mark done, export, edit warning covered status.EXPORTED
205 Input: status ExtractionStatus PUBLISHING AP AR DE CN BS status STATUS_TABLE → publishing notice covered status.PUBLISHING
206 Input: status ExtractionStatus PUBLISHED AP AR DE CN BS status STATUS_TABLE → Mark done, edit warning, link covered status.PUBLISHED
207 Input: status ExtractionStatus DONE AP AR DE CN BS status STATUS_TABLE → export covered status.DONE
208 Input: status ExtractionStatus READY AP AR DE CN BS status STATUS_TABLE → publish / export covered status.READY

Input summary: backend 7, container 23, covered 83, sheetgrid-ext 1

Acceptance criteria (skeleton, ENG-9191) #

Rows from the features table whose Types include the type; dropped rows are left out. Filled in review by Estu, Koki and Ryota: a row counts once its Approved cell says yes. Onboarding-only rows (OB) are listed apart: the kit gives them to every type, so the reviewers decide whether each one is a criterion too.

Acceptance criteria M3.5.5 (direct expense, ENG-9196) #

  • Document: #1, #2, #3, #4, #5, #6, #8, #9, #10, #11, #12, #13, #14
  • Verdict: #24, #26, #27, #28, #30
  • Header fields: #33, #34, #35, #36, #42
  • Lines: #44, #45, #46, #50, #52, #53, #54, #56, #57, #62, #63, #66, #67, #70, #71
  • Footer: #73, #74, #78, #79
  • Document panel: #80
  • Input (95+): #97, #101, #102, #103, #106, #107, #108, #109, #110, #111, #112, #113, #114, #115, #122, #123, #124, #126, #127, #128, #129, #130, #131, #132, #133, #139, #140, #141, #142, #143, #145, #147, #148, #149, #153, #154, #155, #156, #157, #159, #160, #161, #163, #164, #165, #166, #167, #168, #170, #171, #172, #174, #177, #178, #180, #181, #182, #183, #184, #185, #186, #187, #188, #189, #190, #191, #192, #193, #194, #195, #196, #197, #198, #199, #200, #201, #202, #203, #204, #205, #206, #207, #208
  • Total: 43 rows
  • Onboarding-only (OB), to decide: #7, #15, #31, #47, #48, #49, #68, #76, #77, #81, #82

Acceptance criteria M3.5.6 (bank statement, ENG-9197) #

  • Document: #1, #2, #3, #4, #5, #6, #8, #9, #10, #11, #12, #13, #14
  • Account (BS): #16, #17, #18, #19, #20, #21, #22
  • Verdict: #26, #29, #32
  • Header fields: #33, #34, #35, #36, #43
  • Lines: #44, #45, #46, #52, #53, #54, #55, #56, #57, #58, #59, #60, #61, #63, #64, #65, #67, #69, #70, #71, #72
  • Footer: #74, #75, #78
  • Document panel: #80
  • Input (95+): #98, #103, #106, #107, #111, #115, #116, #117, #118, #119, #120, #121, #122, #146, #147, #151, #152, #154, #158, #163, #164, #165, #166, #168, #171, #173, #175, #178, #179, #180, #181, #182, #183, #184, #185, #186, #187, #188, #189, #190, #191, #192, #193, #194, #195, #196, #197, #198, #199, #200, #201, #202, #203, #204, #205, #206, #207, #208
  • Total: 53 rows; dropped and left out: #23
  • Onboarding-only (OB), to decide: #7, #15, #31, #47, #48, #49, #68, #76, #77, #81, #82

Acceptance criteria M3.5.7 (credit notes, ENG-9198) #

  • Document: #1, #2, #3, #4, #5, #6, #8, #9, #10, #11, #12, #13, #14
  • Verdict: #24, #26, #27, #28, #30
  • Header fields: #33, #34, #35, #36, #38, #39, #40, #41
  • Lines: #44, #45, #46, #51, #52, #53, #54, #56, #57, #62, #67, #71
  • Footer: #73, #74, #78
  • Document panel: #80
  • Input (95+): #99, #100, #102, #103, #104, #106, #107, #108, #109, #111, #112, #113, #114, #122, #123, #124, #126, #127, #128, #129, #130, #131, #132, #133, #135, #139, #140, #141, #142, #143, #145, #147, #148, #150, #154, #155, #156, #157, #159, #160, #161, #162, #163, #164, #165, #166, #167, #168, #170, #171, #174, #176, #178, #180, #181, #182, #183, #184, #185, #186, #187, #188, #189, #190, #191, #192, #193, #194, #195, #196, #197, #198, #199, #200, #201, #202, #203, #204, #205, #206, #207, #208
  • Total: 42 rows
  • Onboarding-only (OB), to decide: #7, #15, #31, #47, #48, #49, #68, #76, #77, #81, #82