The reusable half of the fleet β how we pull structure out of a document, and how we show it. Every kit rides into every repo, so Claude reaches for it the moment someone starts the work. Nobody has to know it exists.
How Rivent turns a document into structured, traceable facts β PDFs, decks, filings (10-K, S-1), reports, spreadsheets.
Rides into every repo as .claude/skills/document-extraction
The Rivent display grammar for showing a broken-down document β how an extracted PDF, deck, report or filing is rendered so every number stays traceable to its page.
Rides into every repo as .claude/skills/visual-breakdown
Claude reaches for this when someone says: extract, parse, ingest, upload, PDF, PPTX, deck, filing, 10-K, S-1, prospectus, OCR, "break down this document".
Do not build a parser. We already have a working one. This describes the shape it has and where the reference implementation lives, so a new document type is a few hundred lines on top, not a rebuild.
Reference implementation: Ford (rivent-dev/slw-idea-atlas) β lib/pipeline/ (ingest.ts Β· readers/ Β· ocr.ts Β· filer.ts Β· analyze.ts Β· delta.ts Β· commit.ts). Read those before you design anything. If your version ends up better, say so β the pointer moves to yours (see Evolving the kit).
readers/pptx.ts, docx.ts, xlsx.ts, PDF inline). Adding a format means adding a file; nothing downstream changes. Legacy binaries (.ppt, .doc, .xls) are recognised and rejected honestly, not silently mangled.A document decomposes into 3β5 angles, most important first. Each angle:
Quotes are verified by code, not trusted from the model. A quote the page text actually contains is direct; anything else is kept but marked inferred. This is the single most important line in the kit β it is what makes the output citable rather than plausible.
Every proposed fact lands as new Β· confirms Β· updates Β· conflicts:
Attribute and value comparison is canonicalised (case, punctuation, ~/β, thousands separators, trailing .0), and recency is scored from loose as-of strings β "Jun 2026", "2026-06-30" and "Q2 26" all resolve.
You are almost certainly not adding a parser. Work down this list and stop at the first that fits:
Filings are one job, not several. A 10-K, an S-1, a 20-F and a 10-Q are the same shape: audited financial statements, segment tables, risk factors, MD&A. Build the filing profile once and pick the document type up as a variant. If someone else on the team is already working a filing type, join that work rather than starting a second one β check the catalog at https://rivent.dev/kit first.
An extraction profile is tuned, not written once. Getting a filing profile right takes twenty passes over a real document, and if the prompt is a string constant, each of those passes is a commit, a review and a deploy. That kills the iteration before the profile is any good.
Put the prompt and its rules in a config store the app can edit at runtime:
Reference implementation: rivent-dev/Terminal β artifacts/api-server/ (src/routes/prompts.ts, src/routes/system-rules.ts, src/lib/systemRules.ts). Terminal splits it usefully in two, and a document profile usually wants both:
Ford's analysis prompt is currently a constant in lib/pipeline/analyze.ts β fine while there was one profile, the wrong shape the moment there are several. Adding a second document type is the point to port this pattern over.
This kit is a pattern plus a pointer to the best working implementation. It is deliberately not a shared library:
See also: visual-breakdown β how the extracted result is displayed.
Claude reaches for this when someone says: display, render, show, visualize, breakdown, dashboard, artifact page, exhibits, key slides, citations, charts for extracted data.
We already render broken-down documents in production. Match this grammar before inventing a layout; the parts below exist because each one was needed.
Reference implementations:
rivent-dev/slw-idea-atlas) β app/artifacts/[id]/page.tsx β the canonical document breakdown, top to bottom. Start here.rivent-dev/slw-workspace-hub) β components/ThemeExhibits.tsx, MagellanShelf.tsx (the filename still carries the old name) β how a second app consumes and re-displays another's breakdown.p.12 citations β Counterpoint in-line where one exists β Implication β a collapsed "the N quotes behind this" drawer.p.7 opens the page viewer on page 7; the URL carries ?p=7 so a citation can be linked from anywhere, including another app.inferred, with a tooltip saying it's the model's reading.The grammar above covers evidence display: pages, quotes, citations, datapoints. It does not yet cover charts β there is no house standard for a revenue bridge, a segment breakdown, a cash-flow waterfall or a YoY comparison, because nothing has needed one yet.
If you are the first to need charts (a 10-K or S-1 breakdown will be):
dataviz skill for the chart mechanics β palette, form, axes, legends, accessible light/dark.Locked with Shawn, 2026-08-04 β and shipped. Ford generates this for any filing; it is not a design to re-litigate. Renderer: rivent-dev/slw-idea-atlas β app/artifacts/[id]/tear-sheet.tsx. Builder: lib/pipeline/filing-sheet.ts. Reference rendering: mockups/filing-breakdown.html. Guarded by lib/pipeline/filing-format.test.ts.
A filing β S-1, 424B4, 10-K, prospectus β does not get the page-and-quote grammar above. It gets an analyst tear sheet: a written argument with the evidence attached, in the shape a research note takes.
Guide pill on the left, the numbered sections beside it on the same line, document identity (400pp Β· read in full) pinned right. The whole nav is the height of the pill; with more sections than fit, the strip scrolls sideways rather than wrapping to a second line β a nav that grows a row pushes the sheet down the page. No left rail and no document guide: both were built and cut. The per-finding page citations are the route into the document; a table of contents on top of them is noise.| Form | Use for | Why | |---|---|---| | Diverging bars around a zero line | Segment operating income | The series crosses zero; profit vs loss must read as direction, not colour alone | | Stacked bars, one per period | Revenue mix over time | The mix change is the story; totals are secondary | | Column comparison against a baseline | Dilution arithmetic | Several related per-share figures read against one reference | | Ranked bars | Risk-factor count by group | The ordering is the finding |
Colour is semantic and fixed: one hue per segment, held across every chart; loss and profit are separate hues used nowhere else. Numbers are tabular figures throughout.
The sheet is the specification. Producing it needs more than prose findings:
Both passes are built. Sections are read in parallel on page boundaries, each returning findings, figures as numbers, offering terms and buried admissions; one merge pass then holds every figure at once, writes the sheet, and computes the derived metrics. A section that fails is retried once and counted, and the build aborts if more than a third fail β a tear sheet on a partial read is the failure this exists to end.
Measured on a real 400-page prospectus: 23 sections, 400 of 400 pages, about four minutes, roughly $3.
Build the mockup first and publish it β the reviewer reads in a browser, not in a repo. Match the existing app's palette and tokens; the grammar is shared, the skin is not.
Mockups are light theme only β no dark variants. One theme to review keeps the feedback about the layout. Dark mode belongs in the production build, not in the thing being approved.
No fixed-width type. Every Rivent surface is sans-serif, including code-ish labels, filenames and page numbers. --mono is aliased to --sans on purpose in the portal β do not "fix" it. The full rule is in the portal's AGENTS.md.
See also: document-extraction β how the material on this page is produced.
Edit a kit at dev-portal/standards/kit/, run python3 standards/build-kit-page.py, then ./sync-team-rules.sh to open a PR into every repo. A kit is a pattern plus a pointer to the best working implementation β never a forked copy of the code.