Skip to content

feat(skills): add bookkeeper - bounded reconciliation engine#360

Open
jdjioe5-cpu wants to merge 1 commit into
runxhq:mainfrom
jdjioe5-cpu:feat/bookkeeper-skill
Open

feat(skills): add bookkeeper - bounded reconciliation engine#360
jdjioe5-cpu wants to merge 1 commit into
runxhq:mainfrom
jdjioe5-cpu:feat/bookkeeper-skill

Conversation

@jdjioe5-cpu

Copy link
Copy Markdown

What this PR delivers

A new runx skill \�ookkeeper\ that turns messy transaction lines into clean books without guessing.

Behavior

  • Reads \ ransactions[], \chart_of_accounts[], and optional \prior_period{}\
  • Categorizes each transaction to an existing GL account via:
    1. direct \�ccount_code\ if supplied
    2. token-overlap between description and account name
    3. keyword matching against account \keywords[]\
    4. amount-band routing for income/expense kinds
  • Emits per-transaction \decisions\ with rule, confidence, and anomalies
  • Aggregates top-level \�nomalies[]\ and \summary\ (counts, totals, coverage rate, carry-forward drift)
  • Read-only — never writes to a live ledger, never opens bank rails, never makes external API calls

Output schema


unx.bookkeeper.reconciliation.v1\ — see \SKILL.md\ for the full packet spec.

Files

  • \skills/bookkeeper/SKILL.md\ — operator-facing spec + frontmatter
  • \skills/bookkeeper/X.yaml\ — catalog metadata (runner
    econcile, default true)
  • \skills/bookkeeper/run.mjs\ — deterministic node-stdlib-only runner
  • \skills/bookkeeper/fixtures/inputs.json\ + \�xpected_outputs.json\ — 6-tx smoke case
  • \skills/bookkeeper/README.md\ — operator-facing usage + smoke recipe

Local smoke run

\
RUNX_INPUTS_PATH=fixtures/inputs.json node run.mjs

6 transactions → 5 matched, 1 unmatched (mystery zero entry by design)

Anomalies surfaced: missing_date, suspicious_round_amount, carry_forward_drift_window

Match coverage rate: 0.83

\\

The skill is intentionally narrow and bounded; it never invents accounts or numbers and refuses to bypass human review steps.

- SKILL.md: full YAML frontmatter + runx.bookkeeper.reconciliation.v1 schema
- X.yaml: catalog metadata, runner reconcile (default), node stdlib only
- run.mjs: deterministic local reconciliation engine
  - reads transactions[], chart_of_accounts[], prior_period{}
  - matches via direct account_code, token_overlap, keyword hit, amount-band
  - emits per-transaction decision with rule + confidence + anomalies
  - aggregates top-level anomalies and reconciliation summary
  - read-only — never opens bank rails, never mutates external state
- fixtures/inputs.json + expected_outputs.json: 6-tx mixed smoke case
- README.md: operator-facing usage + local smoke recipe

Local smoke run: 6/5 matched, 4 anomaly kinds surfaced, schema complete.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant