Your agent says nothing calls this. On what evidence?
phebs answers a deliberately narrow version of the question every migration turns on — which call sites can be bound to this exact contract identity — from committed source at an immutable commit, with the repository, revision, file, line, and extraction method attached. Then it states what it could not resolve. The second half is what tells you whether the first half is enough.
Contract extraction is experimental and off by default. Search, navigation, and history are not.
Migration work starts with five deceptively simple questions.
Answering them today means grep, tribal memory, and a trace that only shows the paths that happened to run. A grep output pasted into a ticket is a match masquerading as a decision.
A guess never gets promoted into a caller.
phebs keeps its evidence classes separate and labels every row with the one it earned. Ambiguity stays visible as ambiguity — which is what makes the confident rows worth trusting.
The distance between the second and the fourth is where the incidents live.
Also a name match — the shape of an answer, with no repository, revision, or run behind it.
The classes phebs keeps separate, and the fields its coverage certificate carries.
Resolved caller
A supported source shape tied to exactly one contract identity, under the pack's documented rules.
Name match
Source text matches the operation name. It is not proven to call that contract, and it is not counted as one.
Unresolved candidate
A supported call shape was found, but ambiguity or missing identity prevented a safe binding.
Coverage certificate
The exact scope, revisions, runs, failures, exclusions, and unresolved counts that bound the answer.
An empty result is meaningful only in the context of its coverage. That is why the certificate travels with the answer instead of living in a log.
Agents act on the first answer they get.
phebs ships an MCP server. The contract-evidence tools behind it are experimental, off by default, and their external Go/gRPC extraction accuracy reads NOT_ESTABLISHED — the same gate that sits above the install command on this page. Search, navigation, history and the API make no accuracy-gate claim; they are ordinary shipped software.
One evidence API serves the browser UI and the MCP server, and the contract-evidence response has one place for what could not be established. When an agent asks which call sites bind to a contract operation, the answer arrives with the coverage certificate attached — scope, revisions, runs, exclusions, unresolved counts — and the resolved sites stay separate from the sites the analysis could not resolve.
An agent that is not told what the analysis could not reach has no way to tell a complete caller list from a partial one. phebs puts that distinction in the response. It does not make the agent act on it — what an agent does with a declared gap is the agent's behaviour, and phebs establishes nothing about it.
- absence_eligibility is a field, because “no results” and “none exist” are not the same sentence.
- The coverage digest contains no timestamp. Same state in, same bytes out — the digest moves only when the covered state under it moves.
- The gate reads NOT_ESTABLISHED. It is on the front page, above the install command.
The gate covers external Go/gRPC extraction accuracy — the experimental packs. Search, navigation, history and the API make no accuracy-gate claim; they are ordinary shipped software.
What phebs will not tell you.
A tool that cannot say what it missed is asking you to assume it missed nothing. phebs states its boundary here, on the front page, before you install it. No Contract Atlas, Caller Map, Impact, Topics, Workbench, proof-bundle, or coverage result establishes:
- runtime use, or complete caller coverage
- compatibility, or migration completion
- decommission safety
- extraction accuracy
CURRENT STATUS
The ingestion and evidence pipeline has passed its scale gate against a deterministic synthetic corpus. That is a convergence result on generated input. It is not a supported customer scale, an SLO, an accuracy or completeness claim, or a release claim.
This gate is not a placeholder. Its inputs are frozen and digest-bound, its outcomes close before the run starts, and anything unclassifiable authorizes nothing. No threshold is changed after measurement to turn a stop into a pass. How the validation works →
Static evidence complements runtime telemetry — it can reveal dormant, rare, or unexercised paths a trace never observed. It does not prove that code executed in production. Unsupported, ambiguous, failed, stale, and excluded states stay visible.
Shipped foundations. Honestly gated experiments.
Search, navigation, auth, and the API are production surfaces. The contract-evidence packs are default-dark and make no completeness or accuracy claim yet. Everything above is Apache-2.0 — navigation, SSO, permissions, audit, and MCP included. There is no second tier, no ee/ directory, no seat count, no activation code, and nothing that phones home.
One Go process. Bounded children. No control plane.
phebs is a single Go application with an embedded React UI. It serves zoekt in-process and supervises bounded local children for state, index construction, and optional compatibility checks. The database and the index builder run as supervised local children, so a failed or memory-hungry job cannot take the serving process down.
- Lineage, stated plainly. phebs is a ground-up, reference-only reimplementation of ideas observed in Sourcebot. No Sourcebot source code, UI code, or assets were copied, and no ee/ content was ever read — a rule enforced on every contributor in AGENTS.md. Search runs on zoekt, Sourcegraph's Apache-2.0 engine, in-process and pinned upstream rather than to any fork.
- Search is zoekt, in-process and on purpose. Trigram search is a solved problem and phebs does not re-solve it. The new work is the contract evidence layer above it — declarations, callers, topics, and the coverage that bounds each answer.
- Index builds run out-of-process, in a child compiled from the same go.mod SHA — so an OOM during indexing cannot take down the serving process.
- The MCP server is shipped, stateless per request, and free. Its evidence tools return the coverage certificate alongside the answer, so an agent that asks "who calls this?" is told what the analysis could not resolve rather than handed a confident partial list.
- phebs is single-node today, and the current service model admits at most 4,000 services. Horizontal scale is a measured, in-progress program, not a claim.
Clone, build, serve.
To build from source: Git, Go 1.26+, and Node 24+. To run the built binary: Git, and a compatible SurrealDB 3.0+ that phebs supervises as a local child. The React UI is embedded with go:embed — there is no JavaScript runtime in the server path and no separately operated application stack. Exact tool versions are pinned in the repository. On first start, the server log prints a one-time setup token for creating the administrator.
# clone and build git clone https://github.com/bmeddeb/phebs.git cd phebs make build # serve — indexes a public repository ./phebs serve -config phebs.yaml # → http://127.0.0.1:3070
connections:
- name: my-service
type: git
url: "~/src/my-service"
watch: true
# one exact path per connection.
# wildcard discovery is deliberately
# not supported.
./phebs serve -config phebs-otel-demo.yaml # OpenTelemetry demo → :3071
How this was built, and what it still does not establish.
Clone it, and ask it something you already know the answer to.
Then read what it says it could not reach — that is the part we are asking you to judge.
No signup, no licence key, no demo to book.
Phoebe was the first moon discovered by comparing photographs: one meaningful signal in a large static corpus.
That is the job