Apache-2.0 One Go process Self-hosted MCP

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.

git clone https://github.com/bmeddeb/phebs.git
PLATE ACOMPARISON
By this page's own vocabulary: a name match — it resembles a result, it is bound to none. Proportions drawn, not measured.
01 / THE JOB

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.

01What contract is changing?
02Where is it declared and implemented?
03Which source locations call it?
04What else could be affected?
05What could the analysis not resolve?
02 / WHAT AN ANSWER LOOKS LIKE

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.

a matcha string exists
a relationshiptwo things connect
a claimrepo · rev · file · line
a bounded claimplus what wasn't searched

The distance between the second and the fourth is where the incidents live.

Caller Map billing.v1.InvoiceService/Refund SCHEMATIC
Resolved callers 3
svc-ledger/internal/refund/handler.go:214 declaration-bound
svc-ledger/internal/refund/retry.go:88 declaration-bound
svc-payments/cmd/reconcile/main.go:47 declaration-bound
Name matches 1
svc-support/tools/backfill.go:12 text: Refund — not proven
Unresolved candidates 2
svc-gateway/internal/proxy/dispatch.go:301 dynamic method name
svc-gateway/internal/proxy/route.go:156 interface value ambiguous
coverage certificate carries repository setrevision pinsextraction runs durable outcomesfailuresexclusions caller progressunresolved counts

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.

03 / AGENTS

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.

Stateless per request. Apache-2.0. No separate agent tier.

  • 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.
EXTERNAL VALIDATION GATE · NOT_ESTABLISHED

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.

04 / POSTURE

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

OPEN SOURCE · APACHE LICENSE 2.0 2,000,002-FILE SYNTHETIC SCALE TEST · CONVERGED · EVIDENCE SEALED EXTERNAL GO/gRPC ACCURACY · NOT ESTABLISHED

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.

05 / SURFACES

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.

Search & repositories
Find, browse, sync, and index source across GitHub, GitLab, Gitea, generic Git, and local checkouts.
Shipped
Code intelligence
Precise navigation from your indexer's committed index.scip, plus Git blame, history, commits, and bounded diffs. phebs reads a committed index.scip — it does not generate one. Without it you get search, history and blame; with it, precise navigation, free.
Shipped
Auth, API & MCP
Browser sessions, revocable keys, optional OIDC, permissions, audit, OpenAPI, and a stateless MCP server. The browser UI and the MCP server are thin clients over one evidence API — an agent asking who consumes a topic receives the same citations, the same scope, and the same declared gaps as a human.
Shipped
Contract Atlas
Browse protobuf/gRPC and Thrift services, operations, message shapes, and implementations.
Experimental
Caller Map
Declaration-bound static callers, name matches, unresolved sites, and old-versus-replacement differences.
Experimental
Contract impact
Operation consumers, protobuf/Thrift field references, compatibility previews, proof bundles, and coverage.
Experimental
Kafka topics
Literal producers and consumers, with a first-class census of the sites that could not be resolved.
Experimental
Change Workbench
Organize a change around Why, What, Where, and How. Development fixture only — no HTTP, UI, or MCP operation creates or edits a Workbench in this release.
Not in this release
06 / ARCHITECTURE

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.

Clients
Browser UIOpenAPI · HTTPMCP · coding agents
./phebs serve
one Go process
zoekt (in-process search)huma v2 API SCIP code navgo:embed React UI extraction packsjob queues
Supervised local children
SurrealDB (surrealkv)zoekt-git-indexbuf (optional)
On disk
bare repos @ immutable commitsshardsderived indexes
  • 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.
07 / FIVE-MINUTE START

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.

Local install bash
# 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
Point it at your own code phebs.yaml
connections:
  - name: my-service
    type: git
    url: "~/src/my-service"
    watch: true

# one exact path per connection.
# wildcard discovery is deliberately
# not supported.
Evaluate the microservice workflows on a public corpus bash
./phebs serve -config phebs-otel-demo.yaml   # OpenTelemetry demo → :3071
08 / ENGINEERING NOTES

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