security & data access
Telemetry is read-only. Raw events stay in your store; Perfloop keeps only derived aggregates and snapshots. On code, the only writes are case branches and the pull requests they carry. The merge is always yours.
every data-access claim here is verifiable against the access you granted and your own audit logs
The contract is the same for every customer. One connection is live today — the code host. The telemetry connectors are in development, so the telemetry rows below are the contract for when each ships, not a connection you can make yet. Which datasets and fields it binds to is something you configure with your telemetry source's own primitives, before any discovery runs.
| category | what crosses the boundary | what perfloop keeps | retention |
|---|---|---|---|
| metricsread-only | aggregated series with their labels: metric names, label keys and values, percentiles, rates, counts | snapshot-level summaries | life of workspace |
| tracesread-only | span structure: names, durations, status, service labels. other attributes only as keys you approve per case; default none | derived topology + timing summaries | life of workspace |
| logsread-only | aggregate query results only: counts, distributions, percentiles, over views you author. the connector never selects raw columns, and every query it runs is recorded verbatim in your audit logs | aggregates | life of workspace |
| profilesread-only | stack frames and sample counts; code structure, no payloads | derived flame summaries | life of workspace |
| source coderead + pr write | code in repos you connect; the writes are case branches and the pull requests you review, never a merge | repo structure (symbols, references, packages, files, entry points) | life of connection |
never collected
What you connect and where Perfloop runs are separate, independent choices. Each connection is its own grant and revokes on its own. Nothing is connected by default.
Read access plus PR-write on repositories you select: the only writes are case branches and the PRs they carry, never a merge. Stands alone; no telemetry required.
read-only repo grant · benchmarks run in perfloop's sandbox · writes: case branches + prs, never a merge
A separate grant. Aggregates are the only mode it has.
aggregate reads are all the product makes · enforced by source permissions where they exist, by audited connector policy where they don't · each guide states which
One workspace per customer on shared infrastructure.
the default · your data stays in this deployment
The derived model never leaves your boundary.
byoc · enterprise · same contract, your residency
soc 2 attests our controls and applies regardless of what you connect or where we run · status below
Where a source's permission model can scope Perfloop's access, it does the enforcing: GCP IAM, GitHub's app permissions. Where a source's permissions are coarser, the aggregate-only boundary is connector policy, checkable in your audit logs. Every guide lists its grants verbatim and states which kind of enforcement you're getting, before anyone connects anything.
datadog · axiom · grafana · gitlab · bitbucket: guides ship with their connectors · all connection guides
The agent runs your code and reads your telemetry, so the architecture treats it as compromised and contains it.
the agent is treated as compromised
Containing the agent is half of it. The platform that holds your derived data is itself least-privilege.
least privilege by default
Answered up front, against ground truth.
Today, connected source code enters model context; telemetry connectors are in development, and when they ship only aggregates will. Inference runs on Vertex AI inside the same Google Cloud boundary that hosts the product: your data is not used to train models and never reaches a vendor outside GCP. By design, raw log events never enter model context: the planned telemetry path reads aggregates, not rows.
Assume it happens; the architecture does. The session holds no secrets and has one network path: the proxy, where destination allowlists, per-session permissions, and egress DLP are enforced outside the model. A hijacked agent gains no credentials, no new destinations, and no way to merge anything, and every request it makes passes through the proxy's checks.
Three. Google Cloud for hosting and for model inference through Vertex AI: your data stays inside GCP, is not used to train models, and the model's maker never receives it. WorkOS for user authentication: it verifies identity and stores account data (name, email, IP address) for anyone who logs into Perfloop, and never receives your telemetry or source code. Axiom for Perfloop's own operational telemetry: service logs and metrics about Perfloop itself, which exclude customer code and customer telemetry content.
Operating the product on your behalf can require a Perfloop engineer to run a support session against your workspace. That access is SSO-authenticated, runs over the same proxy-mediated, revocable grant your own sessions use, and uninstalling cuts it. The formal controls around it (per-incident scoping, time-boxing, and access logging) are in progress, and we'll walk your team through exactly where they stand under a security review.
You revoke on your side, not by asking us. Uninstall the GitHub App and access dies immediately: the proxy mints every token per request from that App, so once it's gone there is nothing left to mint. No ticket, no waiting on us.
We don't need to; that is the point of the contract. The categories are fixed and customer-invariant. The mapping to your datasets and fields happens inside grants you've already scoped: Perfloop discovers within them and proposes expansions per case, with stated justification, for you to approve. Access always precedes discovery.
This page documents what Perfloop accesses and how that access is controlled, in claims you can verify today. Formal attestations are in progress; their status is below.
full specification + security questions: security@perfloop.ai →