arcodange-bank-reco: add known-patterns.json catalog + bank-match annotation
V6.1 follow-up to the bank-reco V6 ship. Splits the BANK-ONLY bucket into "known patterns" (intentional gaps, documented and classified) vs "unknown" (real action items). What the catalog covers today: - FOUREZ Quentin → capital_deposit (apport en capital 1000 € initial, notaire FOUREZ centralisateur du dépôt). Maps to Dolibarr account 1013. - URSSAF → social_charges (account 645100) - MISTRAL.AI, CLAUDE.AI → ai_subscription (account 6262) - Wise *Plan, qonto_fee → bank_fee (account 627) - BALANCE_DEPOSIT / FEATURE_CHARGE on Wise → internal_topup (self-funding pair, often nets to zero) Effect on the V6 baseline (Jan-May 2026): - Before catalog: 8 BANK-ONLY mixed entries (noise + signal) - After catalog: 7 known + 1 UNKNOWN (just the +2147 € KM Wise payment 2026-05-29 that genuinely needs a Dolibarr entry) The catalog is JSON (not YAML — stdlib only, no dependency). Schema documented in SKILL.md. Pattern matches case-insensitive regex against both bank label AND operation type. Optional filters: bank, side, amount_min, amount_max. Exit code now reflects only the UNKNOWN bank-only and dolibarr-only counts — the verdict is no longer noisy because of intentional gaps. Edit known-patterns.json as new recurring patterns emerge. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -124,6 +124,51 @@ Current state (V1 baseline):
|
||||
- Wise **STANDARD EUR** : 5 308,25 € live
|
||||
- **Total bank-side** : 9 499,79 €
|
||||
|
||||
## Known-patterns catalog ([known-patterns.json](known-patterns.json))
|
||||
|
||||
Bank movements that have no Dolibarr counterpart fall into two groups:
|
||||
|
||||
1. **Intentional gaps** — operational expenses or one-off events the operator knows about (URSSAF mensuel, AI subs, capital deposit, Wise plan fees). These keep recurring but their accounting treatment is well-understood.
|
||||
2. **Real action items** — incoming payments not yet entered, expenses missing a supplier invoice, anomalies.
|
||||
|
||||
Without a catalog, both look identical in the BANK-ONLY bucket — noise drowns the signal. The catalog is an operator-curated list of patterns; `bank-match.sh` reads it and splits BANK-ONLY into two sub-buckets:
|
||||
|
||||
- **BANK-ONLY — known patterns** : annotated with `[classification]` + a one-line note (which Dolibarr account to use, etc.). Don't action; just verify.
|
||||
- **BANK-ONLY — unknown** : the real signal. Each entry is either a missing supplier invoice, an unrecorded payment, or a new pattern to add to the catalog.
|
||||
|
||||
**Schema** (JSON, see [known-patterns.json](known-patterns.json) for current entries):
|
||||
|
||||
```json
|
||||
{
|
||||
"patterns": [
|
||||
{
|
||||
"pattern": "regex (case-insensitive, matched against bank label + operation type)",
|
||||
"classification": "capital_deposit | social_charges | ai_subscription | bank_fee | internal_topup | personal_apport | needs_classification",
|
||||
"bank": "qonto | wise (optional, default both)",
|
||||
"side": "credit | debit (optional, default both)",
|
||||
"amount_min": 0.0, "amount_max": 99999.0, // optional numeric bounds
|
||||
"note": "human-readable context — what this is, which Dolibarr account, recurring schedule, etc."
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Editing workflow:**
|
||||
1. Run `bin/arcodange bank match` → look at BANK-ONLY unknown.
|
||||
2. For each recurring entry that's "expected", add a pattern to `known-patterns.json`.
|
||||
3. Re-run match → the entry should now appear in the known sub-bucket.
|
||||
4. For one-off action items (e.g. "+2147 € KM May 29 not in Dolibarr"), don't add a pattern — enter it in Dolibarr instead.
|
||||
|
||||
**V6.1 catalog** ships with these patterns for the current Arcodange baseline:
|
||||
- `FOUREZ Quentin` → capital_deposit (initial 1000 € apport via notaire, 2026-01-21)
|
||||
- `URSSAF` → social_charges
|
||||
- `MISTRAL.AI` / `CLAUDE.AI` → ai_subscription
|
||||
- `Wise *Plan` → bank_fee (Wise account plan billed via Qonto card)
|
||||
- `qonto_fee` → bank_fee
|
||||
- `BALANCE_DEPOSIT|For your account plan` → internal_topup (the Wise +50/-50 self-funding pair)
|
||||
|
||||
After applying the catalog to the V6 baseline, the **only remaining BANK-UNKNOWN** is the **+2147 € KissMetrics payment on 2026-05-29** that hasn't been entered in Dolibarr — the actual signal.
|
||||
|
||||
## Matching heuristic — what's in v1 and what's V7
|
||||
|
||||
Today's match logic:
|
||||
|
||||
Reference in New Issue
Block a user