Report automation in an investment firm
The question people ask: which reports do we produce, from which data, on what schedule, who owns each, what changed since last quarter, and can we automate the next one without a six-month project?
What feeds the graph: the report catalog, report templates and past editions, the data dictionary, the schedule, the sign-off records, and the conversations in which the analyst says what the report must show.
The journey
What the graph holds
| Class | For example |
|---|---|
ReportType, Section, Figure |
the quarterly exposure report, its concentration section, the top-ten holdings table |
DataSource, Dataset, Owner |
the positions warehouse, the daily positions extract, the data owner |
Schedule, Run, Approval |
the fifth business day, the run of 2026-07-07, the sign-off by the head of risk |
Requirement, Test, Decision |
the figure must reconcile to the ledger, the test that checks it, the decision to exclude a fund |
The report-automation ontology extends product-delivery: a report type is a product, with a persona, a journey, requirements and gates, so the same lifecycle applies.
A cited answer
=== Top ten holdings [Figure] (figure.top-ten-holdings) ===
status=current · as_of=2026-06-30 · source_doc=exposure-report-definition
Ten largest positions by market value at quarter end, reconciled to the ledger.
Relationships (outgoing):
reads → Daily positions extract
checked_by → Reconciliation test T-14
When the data owner says the extract changes column names in August, the capture skill records it, the fact is superseded, and every figure that reads the extract is listed as pending re-attestation.
How it is used
- The analyst defines a new report type in conversation with the agent; the definition is a graph, not a document that drifts.
- The factory builds from the graph and opens a pull request; the agent's tests are the gate.
- Operations run the report on the schedule; each run records what it read, so a wrong number is traceable to a source and a date.
- The head of risk asks which reports read a dataset that is about to change.
The commands and the skills
oto init --name "Report Factory" --pack report-automation --project reports
oto capture --project reports --title "Exposure report" --by "<analyst, role>" --at <date> --statement "..."
oto actions list --project reports # submit, build, run: described in the graph, invoked by the factory
The pack is in preparation: its ontology, five skills, five actions and two views. It will be in the catalog when it ships. Actions explains why the graph describes what can be done and never does it itself.