Review a change against every repository it reaches.
A pull request pins one repository. Your change does not stop there. SourceAnt records the services, components, queues and datastores that work together, then uses that map to review a change against everything it reaches, and names the repositories it could not read rather than skipping them.
Every engineer and every agent included, never per seat · Your own model keys
System architecture
The review
A pull request pins one repository. Your change does not stop there.
Every review tool reads the diff in front of it. When the contract you just changed is consumed by a service in another repository, the diff is the half of the story that cannot tell you so. SourceAnt starts from the changed files, walks the graph to whatever they reach, and reads there too.
What the change reaches
Starting from the changed files, the review walks the graph to the services, queues and datastores on the other end. Approved links are stated. Pending ones are raised as a question, never as a fact.
The code it read over there
In each repository it reaches, it searches for the code that touches what you changed, and quotes it with the repository and the revision it came from. You can open the file it names.
What it could not read
A repository it failed to reach is named in the review, with the reason. A reviewer that quietly skips half your system is worse than one that admits the gap.
Where the links came from
Read from the manifests your repositories already publish, through the API. Nothing is cloned, nothing is executed, and no model guesses. Every edge names the file it came from, and nothing is approved without a person.
A sibling repository is read at the revision it was last indexed, because a pull request pins only its own. Where that revision is old, the review says so rather than presenting it as current.
How it knows
The map the review walks, and how it stays honest
A review can only reach as far as the graph behind it. Every other architecture map is a snapshot someone took once. This one is a loop: read the source of truth, propose the difference, wait for you, and admit when it has aged.
01
It reads what your repositories already publish
package.json, composer.json, go.mod, requirements.txt and pyproject.toml, fetched through the GitHub API. A manifest that will not parse proposes nothing rather than failing the whole system.
02
It proposes, and only where it can point at a file
A dependency is proposed where one repository declares a name another publishes itself under. Every proposal names the manifest it came from, so you can check it by opening one file.
03
You approve it
Proposals arrive pending and stay pending. Nothing here approves itself. Send persist: false first if you want to see the proposal without touching the graph at all.
04
It tells you when it has stopped being true
A part believed out of date is marked stale rather than deleted. The record says it is unsure instead of going quietly wrong, which is the failure every architecture diagram has.
Evidence, not assertion
Every edge shows its work
A relationship you cannot check is a rumour. Each one carries where it came from, how sure it is, and whether anyone has signed it off.
billing-apidepends_onshared-auth pending
Status
proposed, approved, or retired. Where the part stands, chosen by your team and not by the parser.
Confidence
0 to 1. A part someone declared is 1. An inferred one is lower, and the reason is recorded.
Stale
Believed out of date. Kept and flagged rather than deleted, so you can see what aged and decide.
Evidence
The file, the manifest, the revision. Plus the exact name that was declared and which ecosystem issued it.
confidence 0.6
A bare name is not proof the dependency resolves to you. A public registry can carry the same name, which is how dependency confusion works, so an unowned name is proposed with lower confidence rather than asserted.
Bounded on purpose
An answer small enough to act on
A traversal returns a subgraph you can inspect or give to a model. It tells you when it had to stop rather than quietly returning half a graph.
Field
Default
Range
depth
2
1 to 3
direction
both
outbound, inbound, both
minimum_confidence
0.0
0 to 1
include_stale
false
on or off
entity_limit
50
up to 50
relationship_limit
100
up to 100
Read the graph directly with /api/topology/search and /api/topology/traverse, or let an agent pull the same subgraph through a context pack over MCP.
Why not a catalog
A catalog is a copy someone typed. This is read from the code.
Developer portals ask a person to register each service and then trust the entry forever. The entry does not rot loudly. It just stops matching the code, and nobody finds out until an incident.
A registered catalog
Someone types the service in once
Accuracy depends on who remembered
Drift is silent
No record of why an entry is believed
SourceAnt Systems
Read from the manifests on every pass
Accuracy carries a number you can filter on
Drift is marked stale
Every edge names the file behind it
Questions
Cross-repository review, answered
What it reads, how far it goes, and what it does when it cannot get there.
What is a cross-repository review?
What Systems makes possible. It is a review that does not stop at the repository the pull request was opened in. It starts from the changed files, follows the connections in your system to the services, queues and datastores on the other end, and reads the code there. A normal review sees one diff. This one sees what the diff reaches.
Is this the same as multi-repo code review?
Yes. Multi-repo code review, cross-repo review and polyrepo review all name the same problem: the change is in one repository and the consequence is in another. We say cross-repository review because the reach is the point, not how many repositories you happen to have.
How is it different from reviewing each repository separately?
Reviewing each one separately gives you a verdict per repository and nobody looking at what runs between them. That is where the breakages are: one side changed a contract the other side still expects. A cross-repository review reads both sides in one pass, and quotes the code it read on the far side with the repository and revision it came from.
How does it know which repositories are related?
It reads your code and works out what belongs together. Some joins are obvious, like one repository depending on another. Others only the code implies. You can add more custom connections and SourceAnt shows you suggestions after looking at your system.
Does it work on a monorepo?
Yes. A monorepo counts as one repository, so a change inside it is already reviewed against the rest of it. Systems matter more in a multi-repo or polyrepo setup, where the other side of a change sits in a different repository. They also help a monorepo that talks to something outside its own tree, such as a service, a queue or a datastore. You can add those as parts even though they have no code to read.
Does a link have to be approved before a review will cross it?
No. The review crosses whether the link is approved or not. Approval changes how it may talk about it. An approved link is stated as fact, with where the change could break the other side. A pending one is raised as a question, and carries no suggestion.
What happens to a repository it cannot read?
It is named in the review, with the reason. It is never skipped quietly. A reviewer that silently skips half your system looks the same as one that read everything and found nothing. The usual causes: the repository was never read, it is connected but not in the same system, or the app is not installed on it.
How current is the code it reads in the other repository?
A sibling repository is read at the revision it was last indexed, because a pull request pins only its own. Where that revision is old, the review says so rather than presenting it as current.