01 The map
Your repository has neighbourhoods. Nobody drew them.
Thicket reads every file once and builds a graph of what it found: imports, calls, routes, migrations, the lot. Then it detects the communities those edges fall into and names them. There is no diagram to redraw after a refactor, because the map is the repository.
Build the graph- files read
- 1,184
- edges found
- 8,402
- communities
- 6
- http edge214 files
- ledger core268 files
- payments231 files
- identity152 files
- reporting173 files
- infrastructure146 files
02 The route
Ask where a change lands. Get the route, not a hunch.
Name two ends and Thicket prints the path between them: every hop, the kind of edge it took, and the file it took it in. Where the answer had to be worked out rather than read, the hop says so and says what made it guess. You get the route and the reason to trust it in the same sheet.
Trace a pathgraphify path "POST /v2/refunds" "ledger.postEntry"routes/refunds.tsrouter.postAlso touches: http/middleware/auth.ts http/middleware/idempotency.ts
http/RefundController.tscreateAlso touches: http/serialise.ts http/errors.ts
payments/RefundService.tsauthoriseAlso touches: payments/mandate.ts payments/fees.ts infra/flags.ts
payments/gateways/registry.tsfor(mandate.scheme)Resolved at runtime from a string key. Three gateways register for it; all three are on the route until you pin the scheme.
Also touches: payments/gateways/stripe.ts payments/gateways/adyen.ts
payments/GatewayAdapter.tsvoidAlso touches: payments/retry.ts payments/dispute.ts
ledger/EntryBuilder.tsreversalAlso touches: ledger/currency.ts ledger/rounding.ts ledger/validate.ts
ledger/postEntry.tspostEntryThe write is a template string assembled in infra/db/pool.ts. The table name is the migration's, not the caller's.
Also touches: infra/db/pool.ts ledger/audit.ts
- edges scanned
- 8,402
- nodes visited
- 31
- hops kept
- 7
- answered in
- 180 ms
03 The receipts
Every edge shows how it was found.
Most of a graph is read straight off the source and can be proved. Some of it is assembled from more than one file, and a little of it is a genuine coin toss. Thicket keeps the three apart and shows you where the doubt collects, so you know the difference between something it read and something it worked out.
Read the audit trail- Extracted
- 6,908
- 82.2%
- Read straight off the source. An import, a call, a route table.
- Inferred
- 1,244
- 14.8%
- Assembled from more than one file, or from a name resolved at runtime.
- Ambiguous
- 250
- 3.0%
- More than one target fits and nothing in the repository picks one.
04 The seams
The edges worth arguing about are the ones that leave.
Most edges stay inside their own community, which is what makes it a community. The 1,064 that cross are the ones that make a change expensive. Thicket weighs every boundary in the repository, so you can see which two neighbourhoods have quietly become one.
Weigh a boundary- 01payments againstledger core236 edges
- 02http edge againstpayments168 edges
- 03reporting againstledger core143 edges
05 The answer
Ask in English. See exactly what it read.
Thicket answers from the graph rather than from a search over your files, and it shows the bill: fifteen nodes, 1,437 tokens of a 1,500 budget, each one sized by how much of the answer it paid for. The five that matched and did not fit are printed underneath, because an answer that drops its tail quietly is the thing this whole page is against.
Ask a question- http edge
- ledger core
- payments
- infrastructure
5 more matched and did not fitpayments/settlement.ts 47ledger/rounding.ts 38payments/fees.ts 34ledger/period.ts 29infra/queue.ts 21
06 The drift
It stays true after the merge.
A graph that is right on Tuesday and stale on Friday is a diagram again. Thicket rebuilds on every push, in forty-one seconds, and tells you when the repository got harder to read rather than waiting to be asked. It flagged the gateway refactor the afternoon it landed.
Turn on watchGateway registry refactor
Three gateways moved behind one string key. 214 edges arrived, 58 of them unprovable, and the rebuild said so 41 seconds after the merge.
- rebuilds
- 312
- median
- 38s
- longest
- 1m 04s
- pushes missed
- 0