jaz-clio 5.43.0 → 5.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-api
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill whenever you call, debug, or review code that touches the Jaz
6
6
  REST API. Covers field names, response shapes, 159 production gotchas, error
@@ -79,7 +79,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
79
79
  18. **Bank accounts are CoA entries** with `accountType: "Bank Accounts"`. A convenience endpoint `GET /bank-accounts` exists but returns a **flat array** `[{...}]` — NOT the standard paginated `{ data, totalElements, totalPages }` shape. Normalize before use.
80
80
  19. **CoA bulk-upsert wrapper is `accounts`** — not `chartOfAccounts`.
81
81
  20. **CoA POST uses `currency`** — not `currencyCode`. (Asymmetry — GET returns `currencyCode`.)
82
- 21. **CoA POST uses `classificationType`** — GET returns `accountType`. Same values. Both fields accept the classic 12 types (Bank Accounts, Cash, Current Asset, Fixed Asset, Inventory, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Operating Expense, Direct Costs) AND the IFRS 18 set added 2026-04 (Discontinued Expense, Discontinued Income, Finance Cost, Financing Income, Goodwill, Income Tax Expense, Investing Expense, Investing Income, Investment) see rule 140 for IFRS 18 detail.
82
+ 21. **CoA POST uses `classificationType`** — GET returns `accountType`. Same values. Both accept all 23 types: Bank Accounts, Cash, Current Asset, Non-current Asset, Fixed Asset, Inventory, Investment, Goodwill, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Discontinued Income, Financing Income, Investing Income, Direct Costs, Operating Expense, Other Expense, Finance Cost, Investing Expense, Income Tax Expense, Discontinued Expense (nine of these are the IFRS 18 set added 2026-05, listed in rule 140). COGS is **Direct Costs**, never Operating Expense; "Cost of Goods Sold" is the default account NAME, not a type. Values are singular — a plural or invented value returns zero rows with no error, and `search_accounts` does not normalise (only `create_account` does). The set is GLOBAL (same for every org); confirm against the platform with `list_account_classifications` using `limit: 100` — its default page is 20 and there are 23.
83
83
  22. **CoA code mapping: match by NAME, not code** — pre-existing accounts may have different codes. Resource IDs are the universal identifier.
84
84
 
85
85
  ### Bulk Upsert (Items, Contacts & Rates)
@@ -442,9 +442,9 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
442
442
 
443
443
  139. **`validate_drafts` per-result enrichment (MID7)** — every entry in `results[]` now carries two extra slices alongside the existing `eligible` / `errors[]` / `displayData[]`: (a) **`contactSignals`** — full Mid-7 insight (cadence, outliers, severity, divergences, outstanding balance) computed against the draft's contact history. Null when the draft has no contact, the draft is ineligible, or the contact has no qualifying history in the 12-month window. Same shape as `get_contact_signals` but populated WITH the always-empty-on-GET slices (severitySummary, outlierFlags, revealedDivergences) — those compare the draft against the contact's modal pattern. (b) **`breakdown`** — full Balance-panel payload (`items[]` + `meta` with subtotal / tax / total / paymentRecorded / balance / exchangeRate). Use breakdown to surface the trx-level metadata an agent needs for "show me what this draft looks like" questions without a separate `get_invoice` / `get_bill` call. Top-level: `eligibleCount`, `ineligibleCount`, `columns` / `errorColumns` (table render hints), and `contactSignalsMeta.unavailable=true` when the freshness layer was offline for the whole batch (per-result `contactSignals` will all be null). Wire response uses legacy field names `contactInsight` (per-result) and `contactInsightsMeta` (top-level); motherboard's API client renames both to `contactSignals` / `contactSignalsMeta` for consistency with `get_contact_signals`.
444
444
 
445
- 140. **IFRS 18 accountType values (effective 2027)** — `create_account` / `update_account` / `bulk_upsert_chart_of_accounts` accept the 9 IFRS 18 classification types alongside the classic 12: **Discontinued Expense**, **Discontinued Income**, **Finance Cost**, **Financing Income**, **Goodwill**, **Income Tax Expense**, **Investing Expense**, **Investing Income**, **Investment**. `normalizeAccountType` (in `core/api/guards.ts`) maps unambiguous variants client-side: "income tax" / "tax expense" → "Income Tax Expense", "finance costs" → "Finance Cost", "investments" → "Investment". **Ambiguous variants are intentionally NOT auto-mapped** — under IFRS 18, "interest expense" can land in EITHER Finance Cost (financing activities) OR Operating / Investing Expense depending on the entity's main business activity, and "interest income" can land in EITHER Financing Income OR Investing Income. The agent must pick the explicit canonical string for those cases instead of relying on a guess that could misclassify the account. Pass any value to `accountType` (POST/PUT will receive it as `classificationType` per rule 21). The classic types still work — IFRS 18 is purely additive.
445
+ 140. **IFRS 18 accountType values (effective 2027)** — `create_account` / `update_account` / `bulk_upsert_chart_of_accounts` accept the 9 IFRS 18 classification types alongside the 14 pre-IFRS-18 types (23 in total, listed in rule 21): **Discontinued Expense**, **Discontinued Income**, **Finance Cost**, **Financing Income**, **Goodwill**, **Income Tax Expense**, **Investing Expense**, **Investing Income**, **Investment**. `normalizeAccountType` (in `core/api/guards.ts`) maps unambiguous variants client-side: "income tax" / "tax expense" → "Income Tax Expense", "finance costs" → "Finance Cost", "investments" → "Investment". **Ambiguous variants are intentionally NOT auto-mapped** — under IFRS 18, "interest expense" can land in EITHER Finance Cost (financing activities) OR Operating / Investing Expense depending on the entity's main business activity, and "interest income" can land in EITHER Financing Income OR Investing Income. The agent must pick the explicit canonical string for those cases instead of relying on a guess that could misclassify the account. Pass any value to `accountType` (POST/PUT will receive it as `classificationType` per rule 21). The classic types still work — IFRS 18 is purely additive.
446
446
 
447
- 141. **`bulk_upsert_chart_of_accounts` — sync bulk-upsert with PARTIAL_SUCCESS** — wraps `POST /api/v1/chart-of-accounts/bulk-upsert` (max 500 per call). Returns synchronously (no jobId polling): `{ resourceIds: string[], failedRows: ImportedRowError[], failedCount: number }` per rule 136. Each successful row contributes one `resourceId`; each failure surfaces a `failedRows[]` entry with `rowIndex` (1-based per the API), `columnName`, `columnValue`, `errorCode`, `errorMessage`. **Dedup is by NAME, not code** — collisions emit `ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED` per row (other rows in the batch still succeed). Provide `resourceId` per account to update; omit to create. Accepts the classic 12 + 9 IFRS 18 `accountType` values per rule 140 (variants normalized client-side). For one-off creates with auto-dedup-on-name (returns existing if found), use `create_account` instead. CLI counterpart: `clio accounts bulk-upsert --input <file.json>`.
447
+ 141. **`bulk_upsert_chart_of_accounts` — sync bulk-upsert with PARTIAL_SUCCESS** — wraps `POST /api/v1/chart-of-accounts/bulk-upsert` (max 500 per call). Returns synchronously (no jobId polling): `{ resourceIds: string[], failedRows: ImportedRowError[], failedCount: number }` per rule 136. Each successful row contributes one `resourceId`; each failure surfaces a `failedRows[]` entry with `rowIndex` (1-based per the API), `columnName`, `columnValue`, `errorCode`, `errorMessage`. **Dedup is by NAME, not code** — collisions emit `ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED` per row (other rows in the batch still succeed). Provide `resourceId` per account to update; omit to create. Accepts the all 23 `accountType` values per rules 21 and 140 (variants normalized client-side). For one-off creates with auto-dedup-on-name (returns existing if found), use `create_account` instead. CLI counterpart: `clio accounts bulk-upsert --input <file.json>`.
448
448
 
449
449
  142. **`capsuleRecipe` payload is mutually exclusive with `capsuleResourceId`** on trigger mutations (create/update of invoice, bill, journal, cash_in, cash_out). Use `capsuleRecipe` to CREATE a new capsule via the recipe engine; use `capsuleResourceId` to ATTACH a base-trx to an existing capsule. Sending both returns 422 (`excluded_with` validator).
450
450
 
@@ -33,14 +33,18 @@ Common `error_type` values:
33
33
  ## Chart of Accounts Errors
34
34
 
35
35
  ### "Account Classification Type not found" (400)
36
- **Cause**: `classificationType` value doesn't match one of the 12 valid values.
37
- **Wrong values we tried**: `"Revenue"`, `"REVENUE"`, `"revenue"`, `"INCOME"`, `"OPERATING_REVENUE"`, `"Sales"`, `"Asset"`, `"ASSET"`
36
+ **Cause**: `classificationType` value doesn't match one of the 23 valid values.
37
+ **Wrong values we tried**: `"Revenue"`, `"REVENUE"`, `"revenue"`, `"INCOME"`, `"OPERATING_REVENUE"`, `"Sales"`, `"Asset"`, `"ASSET"`, `"Operating Expenses"` (plural), `"Cost of Goods Sold"` (an account NAME — the type is `"Direct Costs"`)
38
38
  **Fix**: Use the exact `accountType` values from GET response:
39
39
  ```
40
- "Bank Accounts", "Cash", "Current Asset", "Current Liability", "Direct Costs",
41
- "Fixed Asset", "Inventory", "Non-current Liability", "Operating Expense",
42
- "Operating Revenue", "Other Revenue", "Shareholders Equity"
40
+ "Bank Accounts", "Cash", "Current Asset", "Non-current Asset", "Fixed Asset",
41
+ "Inventory", "Investment", "Goodwill", "Current Liability",
42
+ "Non-current Liability", "Shareholders Equity", "Operating Revenue",
43
+ "Other Revenue", "Discontinued Income", "Financing Income", "Investing Income",
44
+ "Direct Costs", "Operating Expense", "Other Expense", "Finance Cost",
45
+ "Investing Expense", "Income Tax Expense", "Discontinued Expense"
43
46
  ```
47
+ Or call `list_account_classifications` — authoritative for that organisation.
44
48
  **Key insight**: `classificationType` in POST uses the same values as `accountType` from GET. NOT `accountClass` values (which are broader: Asset, Liability, Equity, Revenue, Expense).
45
49
 
46
50
  ### "ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED" (400)
@@ -109,13 +109,26 @@ When POSTing, `classificationType` must be one of these exact strings (same as `
109
109
  | `"Current Asset"` | Asset |
110
110
  | `"Fixed Asset"` | Asset |
111
111
  | `"Inventory"` | Asset |
112
+ | `"Non-current Asset"` | Asset |
113
+ | `"Investment"` | Asset |
114
+ | `"Goodwill"` | Asset |
112
115
  | `"Current Liability"` | Liability |
113
116
  | `"Non-current Liability"` | Liability |
114
117
  | `"Shareholders Equity"` | Equity |
115
118
  | `"Operating Revenue"` | Revenue |
116
119
  | `"Other Revenue"` | Revenue |
120
+ | `"Discontinued Income"` | Revenue |
121
+ | `"Financing Income"` | Revenue |
122
+ | `"Investing Income"` | Revenue |
117
123
  | `"Operating Expense"` | Expense |
124
+ | `"Other Expense"` | Expense |
118
125
  | `"Direct Costs"` | Expense |
126
+ | `"Finance Cost"` | Expense |
127
+ | `"Investing Expense"` | Expense |
128
+ | `"Income Tax Expense"` | Expense |
129
+ | `"Discontinued Expense"` | Expense |
130
+
131
+ COGS maps to `"Direct Costs"` — "Cost of Goods Sold" is the default account name shipped in the CoA template, not a type.
119
132
 
120
133
  ### Account Create (POST /chart-of-accounts) Fields
121
134
 
@@ -55,20 +55,44 @@ Used by: invoices, bills, credit notes, journals, items, scheduled transactions,
55
55
 
56
56
  ### accountType (Chart of Accounts)
57
57
 
58
- | Value |
59
- |-------|
60
- | `Bank Accounts` |
61
- | `Cash and Cash Equivalents` |
62
- | `Current Assets` |
63
- | `Non-Current Assets` |
64
- | `Current Liabilities` |
65
- | `Non-Current Liabilities` |
66
- | `Equity` |
67
- | `Revenue` |
68
- | `Cost of Goods Sold` |
69
- | `Operating Expenses` |
70
- | `Other Income` |
71
- | `Other Expenses` |
58
+ 23 values. Source: `GET /api/v1/account-classifications` (`list_account_classifications`),
59
+ which is authoritative. The set is GLOBAL — the same 23 for every organisation
60
+ (the classifications table has no org column) — so this is a stable list, not a
61
+ per-tenant one. This table mirrors the CLI's canonical
62
+ account-type list and is kept in step with it by an automated drift check.
63
+
64
+ **Singular, and not the account's name.** An earlier version of this table listed
65
+ pluralized inventions (`Current Assets`, `Operating Expenses`, `Other Expenses`)
66
+ plus `Cost of Goods Sold`, which is an account NAME whose type is `Direct Costs`.
67
+ A wrong value returns **zero rows with no error**, which reads exactly like "the
68
+ org has no such account". `search_accounts` does not normalise — only
69
+ `create_account` does.
70
+
71
+ | Value | accountClass |
72
+ |-------|--------------|
73
+ | `Bank Accounts` | Asset |
74
+ | `Cash` | Asset |
75
+ | `Current Asset` | Asset |
76
+ | `Non-current Asset` | Asset |
77
+ | `Fixed Asset` | Asset |
78
+ | `Inventory` | Asset |
79
+ | `Investment` | Asset |
80
+ | `Goodwill` | Asset |
81
+ | `Current Liability` | Liability |
82
+ | `Non-current Liability` | Liability |
83
+ | `Shareholders Equity` | Equity |
84
+ | `Operating Revenue` | Revenue |
85
+ | `Other Revenue` | Revenue |
86
+ | `Discontinued Income` | Revenue |
87
+ | `Financing Income` | Revenue |
88
+ | `Investing Income` | Revenue |
89
+ | `Direct Costs` | Expense |
90
+ | `Operating Expense` | Expense |
91
+ | `Other Expense` | Expense |
92
+ | `Finance Cost` | Expense |
93
+ | `Investing Expense` | Expense |
94
+ | `Income Tax Expense` | Expense |
95
+ | `Discontinued Expense` | Expense |
72
96
 
73
97
  ---
74
98
 
@@ -185,7 +209,7 @@ Used by: invoices, bills, credit notes, journals, items, scheduled transactions,
185
209
  |-------|-------------|
186
210
  | `status` | `ACTIVE`, `INACTIVE` |
187
211
  | `accountClass` | `Asset`, `Liability`, `Equity`, `Revenue`, `Expense` |
188
- | `accountType` | See 12 values in Universal Enums above |
212
+ | `accountType` | See the 23 values in Universal Enums above |
189
213
  | `appliesTo` | `Sales & Sale Credits`, `Purchases & Purchase Credits`, `Payments` |
190
214
  | `controlFlag` | `true`, `false` (BooleanExpression) |
191
215
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-cli
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill when running Clio CLI commands, building shell scripts with
6
6
  Clio, debugging auth issues, understanding --json output, paginating results,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-conversion
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill when migrating accounting data into Jaz — importing from Xero,
6
6
  QuickBooks, Sage, MYOB, or Excel exports. Covers the full conversion pipeline:
@@ -45,7 +45,9 @@ Source systems use different classification names. Map to Jaz types:
45
45
  | Operating Expenses | Operating Expense |
46
46
  | Other Income | Other Revenue |
47
47
 
48
- **Valid `classificationType` values (exactly 13):** Bank Accounts, Cash, Current Asset, Fixed Asset, Non-current Asset, Inventory, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Direct Costs, Operating Expense
48
+ **Valid `classificationType` values (exactly 23):** Bank Accounts, Cash, Current Asset, Non-current Asset, Fixed Asset, Inventory, Investment, Goodwill, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Discontinued Income, Financing Income, Investing Income, Direct Costs, Operating Expense, Other Expense, Finance Cost, Investing Expense, Income Tax Expense, Discontinued Expense
49
+
50
+ The set is GLOBAL (identical for every org). Confirm with `list_account_classifications` using `limit: 100` — its default page size is 20 and there are 23 types.
49
51
 
50
52
  ### Clearing Account Creation
51
53
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-kit
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill when an accountant, bookkeeper, or owner is running real books
6
6
  in Jaz across one or more organizations from the terminal — setting up a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-pseudo-sql
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill when answering ad-hoc data questions that aren't covered by
6
6
  download_export (canonical reports — anomaly, audit, aging, P&L, BS, GL,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-jobs
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill for recurring accounting workflows — month/quarter/year-end
6
6
  close, bank reconciliation, GST/VAT filing, payment runs, credit control,
@@ -21,7 +21,7 @@
21
21
  ### Platform tools — current/non-current reclassification (manual annual journals)
22
22
  - **`search_capsules(filter: {capsuleType: {eq: 'Loan Repayment'}})`** + per-capsule `clio calc loan` to compute next-12-months principal portion.
23
23
  - **`search_capsules(filter: {capsuleType: {eq: 'Lease'}})`** + per-capsule `clio calc lease` for IFRS 16 reclassification.
24
- - **`create_journal(...)`** for the reclassification entries (Dr Loan Payable Non-Current / Cr Loan Payable Current; Dr Lease Liability Non-Current / Cr Lease Liability Current).
24
+ - **`create_journal(...)`** for the reclassification entries (Dr Loan Payable Non-current / Cr Loan Payable Current; Dr Lease Liability Non-current / Cr Lease Liability Current).
25
25
 
26
26
  ### Handoff to audit-prep
27
27
  - See `audit-prep.md` — year-end-close hands off to the audit-prep job, which produces the report pack + supporting schedules + audit analyses.
@@ -166,14 +166,14 @@ create_journal({
166
166
  valueDate: '2025-12-31',
167
167
  reference: 'YE-RECLASS-LOAN-<facility>',
168
168
  journalEntries: [
169
- { accountResourceId: <Loan Payable Non-Current>, amount: <next-12mo-principal>, type: 'DEBIT' },
169
+ { accountResourceId: <Loan Payable Non-current>, amount: <next-12mo-principal>, type: 'DEBIT' },
170
170
  { accountResourceId: <Loan Payable Current>, amount: <next-12mo-principal>, type: 'CREDIT' }
171
171
  ],
172
172
  saveAsDraft: false
173
173
  })
174
174
  ```
175
175
 
176
- Mirror for IFRS 16 lease liability (`Lease Liability Non-Current` → `Lease Liability Current`).
176
+ Mirror for IFRS 16 lease liability (`Lease Liability Non-current` → `Lease Liability Current`).
177
177
 
178
178
  ### Y7 — Final TB + draft gate + report pack handoff
179
179
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-recipes
3
- version: 5.43.0
3
+ version: 5.44.1
4
4
  description: >-
5
5
  Use this skill when modeling complex multi-step accounting transactions —
6
6
  anything that spans multiple periods, involves changing amounts, or requires
@@ -94,7 +94,7 @@ For gain (proceeds > NBV): engine debits Cash, debits Accum Dep, credits Vehicle
94
94
  ### Step 3 — Resolve dependencies
95
95
 
96
96
  For each account in `requiredAccounts`:
97
- - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: asset → `Non-Current Asset`; accum dep → `Non-Current Asset` contra; **`Gain on Disposal` → `Other Revenue`** (NOT Operating Revenue per IAS 16.71); `Loss on Disposal` → `Other Expense` (or `Operating Expense`, jurisdiction-specific).
97
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: asset → `Non-current Asset`; accum dep → `Non-current Asset` contra; **`Gain on Disposal` → `Other Revenue`** (NOT Operating Revenue per IAS 16.71); `Loss on Disposal` → `Other Expense` (or `Operating Expense`, jurisdiction-specific).
98
98
 
99
99
  Bank account: resolve via `list_bank_accounts()` if the bank account resourceId isn't already known. For scrap (no proceeds): `bankAccountResourceId` is required only if there's a disposal-cost cash-out (e.g., scrap fee paid to disposal vendor) — pass it for safety even if proceeds are zero.
100
100
 
@@ -68,7 +68,7 @@ Returns: `RecipePlan` with `requiredAccounts`, `needsContact: true`, `steps[0]`
68
68
  ### Step 3 — Resolve dependencies
69
69
 
70
70
  For every account in `requiredAccounts`:
71
- - `search_accounts(filter: {name: {eq: <accountName>}})`. If empty, halt: "Loan recipe references GL account `<accountName>` not in CoA. Create via `create_account` (suggested classifications: `Loan Payable` → `Non-Current Liability`; `Interest Expense` → `Operating Expense`) or remap the account before retry."
71
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. If empty, halt: "Loan recipe references GL account `<accountName>` not in CoA. Create via `create_account` (suggested classifications: `Loan Payable` → `Non-current Liability`; `Interest Expense` → `Operating Expense`) or remap the account before retry."
72
72
 
73
73
  If `bankAccountResourceId` resolution failed:
74
74
  - `list_bank_accounts()`, match by `name + currency`. If still no match: halt and surface it.
@@ -143,7 +143,7 @@ After the FINAL period (60th repayment) is finalized:
143
143
  - **Interest-only period:** Not supported by the loan calculator. Workaround: post N manual interest-only journals via `create_journal` (Dr Interest Expense / Cr Cash) for the interest-only window, then run `plan_recipe(recipe: 'loan', ...)` from the start of the amortizing window with the full outstanding principal.
144
144
  - **Multi-currency loan (USD loan with SGD base):** Pass `currency: 'USD'`. Disbursement records via `currency: { sourceCurrency: 'USD' }` per `jaz-api/SKILL.md` rule 25. Monthly repayments stay in USD. Period-end FX revaluation against base currency is auto-handled by Jaz (Loan Payable is a monetary item per IAS 21.23 — Jaz auto-translates at closing rate). Verify via the month-end close FX verification flow; do NOT invoke `execute_recipe(recipe: 'fx-reval', ...)`.
145
145
  - **Loan origination fees:** Out of scope for this recipe (the engine's IFRS 9 effective-interest treatment doesn't currently amortize fees into the EIR). Post fees as a separate manual journal: Dr `Operating Expense > Loan Origination Fee` / Cr Cash. For IFRS 9 EIR-amortized fees, model the fee as `prepaid-expense` over the loan term.
146
- - **Year-end current/non-current reclassification:** Out of scope for the engine — manual annual journal: Dr Loan Payable Non-Current / Cr Loan Payable Current for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
146
+ - **Year-end current/non-current reclassification:** Out of scope for the engine — manual annual journal: Dr Loan Payable Non-current / Cr Loan Payable Current for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
147
147
 
148
148
  ---
149
149
 
@@ -254,15 +254,15 @@ Each recipe lists the specific CoA accounts needed. Common patterns:
254
254
  | Prepaid Expenses | Asset | Current Asset | Prepaid amortization |
255
255
  | Deferred Revenue | Liability | Current Liability | Deferred revenue |
256
256
  | Accrued Expenses | Liability | Current Liability | Accrued expenses |
257
- | Loan Payable | Liability | Non-Current Liability | Bank loan |
257
+ | Loan Payable | Liability | Non-current Liability | Bank loan |
258
258
  | Loan Payable (Current) | Liability | Current Liability | Bank loan (current portion) |
259
259
  | Interest Expense | Expense | Expense | Bank loan, IFRS 16 |
260
- | Right-of-Use Asset | Asset | Non-Current Asset | IFRS 16 |
261
- | Lease Liability | Liability | Non-Current Liability | IFRS 16 |
260
+ | Right-of-Use Asset | Asset | Non-current Asset | IFRS 16 |
261
+ | Lease Liability | Liability | Non-current Liability | IFRS 16 |
262
262
  | Lease Liability (Current) | Liability | Current Liability | IFRS 16 |
263
- | Accumulated Depreciation | Asset | Non-Current Asset | Declining balance, Capital WIP |
263
+ | Accumulated Depreciation | Asset | Non-current Asset | Declining balance, Capital WIP |
264
264
  | Depreciation Expense | Expense | Expense | Declining balance, Capital WIP |
265
- | FX Unrealized Gain | Revenue | Other Income | FX revaluation |
265
+ | FX Unrealized Gain | Revenue | Other Revenue | FX revaluation |
266
266
  | FX Unrealized Loss | Expense | Other Expense | FX revaluation |
267
267
  | Bad Debt Expense | Expense | Expense | ECL provision |
268
268
  | Allowance for Doubtful Debts | Asset | Current Asset (contra) | ECL provision |
@@ -271,12 +271,12 @@ Each recipe lists the specific CoA accounts needed. Common patterns:
271
271
  | Bonus Expense | Expense | Expense | Employee accruals |
272
272
  | Accrued Bonus Liability | Liability | Current Liability | Employee accruals |
273
273
  | Provision Expense | Expense | Expense | IAS 37 provisions |
274
- | Provision for Obligations | Liability | Non-Current Liability | IAS 37 provisions |
274
+ | Provision for Obligations | Liability | Non-current Liability | IAS 37 provisions |
275
275
  | Finance Cost — Unwinding | Expense | Expense | IAS 37 provisions, Lease |
276
276
  | Retained Earnings | Equity | Retained Earnings | Dividends |
277
277
  | Dividends Payable | Liability | Current Liability | Dividends |
278
278
  | Intercompany Receivable | Asset | Current Asset | Intercompany |
279
279
  | Intercompany Payable | Liability | Current Liability | Intercompany |
280
- | Capital Work-in-Progress | Asset | Non-Current Asset | Capital WIP |
280
+ | Capital Work-in-Progress | Asset | Non-current Asset | Capital WIP |
281
281
 
282
282
  **API:** `POST /chart-of-accounts` or `POST /chart-of-accounts/bulk-upsert`
@@ -1,6 +1,6 @@
1
1
  # Recipe: Capital Work-in-Progress (CWIP) → Fixed Asset (manual — no engine)
2
2
 
3
- > Multi-month asset construction pattern: accumulate construction costs in `Capital Work-in-Progress` (Non-Current Asset) via bills coded to CWIP, then transfer the accumulated cost to a Jaz native FA on completion. No recipe engine — built from primitive `create_bill` + `create_journal` + `create_fixed_asset`. The CWIP-to-FA transfer triggers Jaz's auto-depreciation (SL).
3
+ > Multi-month asset construction pattern: accumulate construction costs in `Capital Work-in-Progress` (Non-current Asset) via bills coded to CWIP, then transfer the accumulated cost to a Jaz native FA on completion. No recipe engine — built from primitive `create_bill` + `create_journal` + `create_fixed_asset`. The CWIP-to-FA transfer triggers Jaz's auto-depreciation (SL).
4
4
 
5
5
  ## Why no engine
6
6
 
@@ -38,7 +38,7 @@ search_accounts(filter: {name: {in: ['Capital Work-in-Progress', 'Office Improve
38
38
 
39
39
  `Capital Work-in-Progress` is the holding account. The eventual FA destination (`Office Improvements`, `Buildings`, `Plant & Equipment`, etc.) and its corresponding accumulated depreciation account both need to exist before completion-time transfer.
40
40
 
41
- If `Capital Work-in-Progress` doesn't exist: `create_account(name: 'Capital Work-in-Progress', accountType: 'Non-Current Asset')` first. CRITICAL: classify as Non-Current Asset (not Operating Expense) — the whole point of CWIP is to defer expense recognition.
41
+ If `Capital Work-in-Progress` doesn't exist: `create_account(name: 'Capital Work-in-Progress', accountType: 'Non-current Asset')` first. CRITICAL: classify as Non-current Asset (not Operating Expense) — the whole point of CWIP is to defer expense recognition.
42
42
 
43
43
  ### Step 1 — Create the project capsule
44
44
 
@@ -188,7 +188,7 @@ Close the project capsule (or keep ACTIVE for traceability — the FA still refe
188
188
 
189
189
  | Source | Error | Recovery |
190
190
  |--------|-------|----------|
191
- | Step 0 | `Capital Work-in-Progress` doesn't exist as Non-Current Asset | `create_account(accountType: 'Non-Current Asset')`. Common gap in CoAs that haven't done capital projects. |
191
+ | Step 0 | `Capital Work-in-Progress` doesn't exist as Non-current Asset | `create_account(accountType: 'Non-current Asset')`. Common gap in CoAs that haven't done capital projects. |
192
192
  | Step 2 | Bill posted to Operating Expense instead of CWIP | Reverse via `delete_bill` (if DRAFT) OR `create_supplier_credit_note` + `apply_credit_to_bill` (if ACTIVE). Re-post correctly. AVOID year-end audit headache — auditor will challenge any P&L expense for capital project items. |
193
193
  | Step 4b | Transfer journal unbalanced | Verify the `amount` on both lines exactly matches the closing CWIP balance from step 4a. Per `jaz-api/SKILL.md` rule 23 — total debits = total credits. |
194
194
  | Step 4c | `create_fixed_asset` 422 `cost_mismatch` | Cost passed differs from the transfer journal amount. Both must equal CWIP closing balance. Re-pull `generate_general_ledger` and re-confirm. |
@@ -72,7 +72,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Vehicles', 'Accumulated Depreciat
72
72
  ### Step 3 — Resolve dependencies
73
73
 
74
74
  For each account in `requiredAccounts`:
75
- - `search_accounts(filter: {name: {eq: <accountName>}})`. If empty: halt. Suggested classifications: asset GL → `Non-Current Asset`; accumulated depreciation → `Non-Current Asset` (contra); expense → `Operating Expense`.
75
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. If empty: halt. Suggested classifications: asset GL → `Non-current Asset`; accumulated depreciation → `Non-current Asset` (contra); expense → `Operating Expense`.
76
76
 
77
77
  NO contact resolution (depreciation has no counterparty). NO bank account resolution.
78
78
 
@@ -73,7 +73,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Fixed Deposit Receivable', 'Accru
73
73
  ### Step 3 — Resolve dependencies
74
74
 
75
75
  For each account in `requiredAccounts`:
76
- - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Fixed Deposit Receivable` → `Current Asset` (≤12-month FD) OR `Non-Current Asset` (>12-month); `Accrued Interest Receivable` → `Current Asset`; `Interest Income` → `Other Revenue`.
76
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Fixed Deposit Receivable` → `Current Asset` (≤12-month FD) OR `Non-current Asset` (>12-month); `Accrued Interest Receivable` → `Current Asset`; `Interest Income` → `Other Revenue`.
77
77
 
78
78
  Bank account: resolve `bankAccountResourceId` for the disbursement bank (where the cash leaves to placement). Should be the actual operational bank account, NOT the FD account itself — the FD becomes its own balance-sheet line, separate from cash.
79
79
 
@@ -76,7 +76,7 @@ Returns `RecipePlan` with:
76
76
  ### Step 3 — Resolve dependencies
77
77
 
78
78
  For each account in `requiredAccounts`:
79
- - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Right-of-Use Asset` → `Non-Current Asset`; `Lease Liability` → `Non-Current Liability`; `Interest Expense — Leases` → `Operating Expense`. The Depreciation Expense + Accumulated Depreciation accounts are FA-register defaults — Jaz uses standard ones unless overridden.
79
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Right-of-Use Asset` → `Non-current Asset`; `Lease Liability` → `Non-current Liability`; `Interest Expense — Leases` → `Operating Expense`. The Depreciation Expense + Accumulated Depreciation accounts are FA-register defaults — Jaz uses standard ones unless overridden.
80
80
 
81
81
  Lessor:
82
82
  - `search_contacts(filter: {supplier: true, name: {eq: 'Marina One Holdings'}})`. If empty: `create_contact(supplier: true, ...)`.
@@ -164,7 +164,7 @@ After the FINAL period (month 36):
164
164
  - **Variable rent** (CPI-linked, turnover-linked): NOT supported by initial recipe. Recompute PV at each reset event and re-measure manually.
165
165
  - **Multi-currency lease** (USD payments from SGD bank): pass `currency: 'USD'`. ROU + Lease Liability denominate in USD; Jaz auto-translates BS balances at closing rate per IAS 21.23 (do NOT invoke `fx-reval` recipe).
166
166
  - **Lease with prepayments** (initial payment at signing): post the prepayment as `create_cash_out_entry` against ROU Asset BEFORE invoking the recipe. The recipe's PV calculation should exclude the upfront payment portion.
167
- - **Year-end current/non-current reclassification**: Out of scope for the engine. Manual annual journal: Dr Lease Liability (Non-Current) / Cr Lease Liability (Current) for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
167
+ - **Year-end current/non-current reclassification**: Out of scope for the engine. Manual annual journal: Dr Lease Liability (Non-current) / Cr Lease Liability (Current) for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
168
168
 
169
169
  ---
170
170
 
@@ -73,7 +73,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Provision for Warranties', 'Warra
73
73
  ### Step 3 — Resolve dependencies
74
74
 
75
75
  For each account in `requiredAccounts`:
76
- - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Provision for Warranties` → `Non-Current Liability` (or `Current Liability` if settlement < 12 months); `Warranty Expense` → `Operating Expense` (P&L, period of recognition); `Finance Cost` → `Operating Expense` or `Other Expense` (jurisdiction-specific; SG often `Other Expense`).
76
+ - `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Provision for Warranties` → `Non-current Liability` (or `Current Liability` if settlement < 12 months); `Warranty Expense` → `Operating Expense` (P&L, period of recognition); `Finance Cost` → `Operating Expense` or `Other Expense` (jurisdiction-specific; SG often `Other Expense`).
77
77
 
78
78
  Bank account: only needed for the settlement cash-out at the end of the term.
79
79
 
@@ -135,7 +135,7 @@ If actual settlement amount differs from estimated $500,000 (highly likely for w
135
135
  | `plan_recipe` | 422 `unsupported_recipe` | Use canonical engine name `provision` (not `provisions`). |
136
136
  | `plan_recipe` | 422 `term_too_short` | Provision must span ≥ 2 periods (otherwise PV unwinding is immaterial). For short-term provisions (settlement < 6 months): post directly via `create_journal` at face value, no PV needed. |
137
137
  | `plan_recipe` | 422 `rate_invalid` | Discount rate must be > 0. Per IAS 37.47, use a pre-tax rate reflecting current market + obligation-specific risks. SG: typically gov't bond rate + risk premium. |
138
- | `execute_recipe` | 422 `account_not_found` for `Finance Cost` | Step 3 incomplete. Create via `create_account(accountType: 'Operating Expense' or 'Other Expense', name: 'Finance Cost')`. |
138
+ | `execute_recipe` | 422 `account_not_found` for `Finance Cost` | Step 3 incomplete. Create via `create_account(accountType: 'Finance Cost', name: 'Finance Cost')`. Note `Finance Cost` is both a valid account TYPE and the account NAME here — the error refers to the missing account, not a bad type. |
139
139
  | Step 6 remeasurement | Recipe doesn't natively support mid-life remeasurement | Manual journal + delete remaining DRAFT unwinding journals + re-execute recipe for remaining term. |
140
140
  | Step 7 actual settlement ≠ estimated | (always, for real-world provisions) | Edit settlement cash-out via `update_cash_out_entry` before finalizing, post true-up journal for the delta. |
141
141
  | Provision presented as Operating Expense vs Finance Cost confusion | (presentation) | Per IAS 37.84, the unwinding charge is presented in P&L as a Finance Cost (separate from the recognition expense which is Operating Expense). Practitioner judgment if jurisdiction disagrees. |