PRISM-INSIGHT
13개의 특화 AI 에이전트가 한국·미국 주식을 실시간 분석합니다. 오픈소스, 무료
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Finance controls that show their work: close, payroll, controls on real 10-K filings, and a FinQA grader. Portfolio prototype.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Finance controls that show their work. A portfolio case study and working prototype for month-end close, payroll review and financial-model evaluation. It grew out of the earlier "Run Replay" prototype.
Live: https://tickmark-martinzhang.vercel.app · Notes: https://tickmark-martinzhang.vercel.app/notes
A static site: open index.html, or run node scripts/serve.mjs and visit http://localhost:5173. It deploys to Vercel as-is, with no build step; every push to main redeploys.
Open the workbench and choose Your data (or press Ctrl K / ⌘K and type "your data"). It runs the same rules as the sample, on your own CSV files, in a separate tab:
Files are read in your browser and saved only there (localStorage). Nothing is sent to a server. Decisions, the audit log and your files survive a reload; Reset session and Remove my data clear them. Every table exports to CSV.
| File | Columns (header row, any order; bold = required) |
|---|---|
| HRIS | employee_id, department, status, hire_date, termination_date, currency |
| Payroll register | employee_id, gross, prior_gross, currency, note, equity_value |
| Equity vesting | employee_id, units, fmv |
| Bank statement | date, description, amount |
| Ledger cash account | date, reference, amount |
Dates are YYYY-MM-DD. Amounts may use thousands separators, a currency sign, or accounting brackets for negatives ((1,000.00)). Each upload box has a Download a template link with the sample rows in the right shape. Errors name the row and column, as a spreadsheet would. Files are limited to 2 MB and 5,000 rows.
All rules live in engine.js, which has no page code: the site and the tests both load it.
| Rule | Fires when | Severity |
|---|---|---|
| MISSING_EMPLOYEE | A payroll row's employee is not in the HRIS file | High, blocks release |
| DUPLICATE_PAYMENT | An employee appears twice in the register for the period | High, blocks release |
| INACTIVE_PAID | Status is terminated / inactive / left / separated and the leaving date is before the period | High, blocks release |
| OUTLIER | Gross differs from prior gross by more than 40% | Medium |
| CURRENCY | Paid currency differs from the HRIS currency | Medium |
| PRORATION | Hired inside the period; expected pay = gross × days worked ÷ days in period | Medium |
| EQUITY_MISSING | A vest in the equity file has no equity value on the payslip | Medium |
| INJECTION | A note contains instruction-like text (English or Chinese, after undoing lookalike characters) | Low; the note is withheld from any model |
Employee IDs are matched without regard to case or surrounding spaces. Bank matching: each statement line takes the first unused ledger line with the same amount inside the date window; an unmatched line shows the nearest candidate within 10%.
node --test "tests/*.test.js"
25 tests cover every payroll rule and its boundaries, bank matching, the SEC controls, the FinQA grader, journal checks, the FX revaluation, CSV parsing and validation, and a round trip of the sample through the CSV templates (same results either way). GitHub Actions runs them, plus a syntax check of the page scripts, on every push.
| Part | Data | Source |
|---|---|---|
| Close, payroll, bank lines | Synthetic | data.js. The rules in engine.js run on it in the browser |
| Payroll engine evaluation (74 cases, recall 98.5%) | From the original Run Replay harness | carried over, not re-run here |
| Controls on public filings | Real | SEC EDGAR XBRL companyfacts, 8 companies' latest 10-K |
| FX revaluation (JE-1037) | Real rates, synthetic balance | Bank of Canada Valet API, EUR/CAD and USD/CAD |
| FinQA grader | Real benchmark | FinQA test set, 1,147 questions (MIT licence, Chen et al., 2021) |
Findings the real data produced:
Liabilities, so the identity can't be tested from tags alone.node scripts/fetch-real.mjs
curl -L https://raw.githubusercontent.com/czyssrs/FinQA/main/dataset/test.json -o finqa-test.json
node scripts/finqa-grader.mjs finqa-test.json
node scripts/build-real.mjs
The SEC asks for a contact address in the User-Agent; fetch-real.mjs sends Martin's.
index.html: the Work page (intro, hero, results, workbench, live control, contact).notes.html: every explanation (principles, one exception end to end, scores, what broke, close calendar, data sources, history, letter, credits).engine.js: every rule, plus CSV parsing, validation and export. No page code.app.js: renders the workbench, records decisions, saves the session, handles uploads and exports.motion.js: intro, page wipe, reveals, progress bar, counters, magnetic buttons, jump palette, toasts, segmented indicators, spotlight and tilt.blender/mark3d.py: the 3D mark in the hero (Blender 5.4). blender -b -P blender/mark3d.py -- still <out> and -- anim <frames dir>/f_. The frames are transparent; composite them onto #0a0a0a with ffmpeg before encoding.Pictures: "Pittsboro Merchant Business Ledger", public domain, via Wikimedia Commons · "HollerithMachine.CHM" by Adam Schuster, CC BY 2.0. Full records are in assets/credits.json.