Your AI inventory, from what you already run
Found on your platforms, in your code and at the gateway (the browser extension is coming); claimed by its owner, who adds the purpose and the risk class.
- GitHub organisationevery repository, archived included and flagged, none skipped; one system per deployable unit
- GitLab groupevery project of the group and its subgroups, by group token; GitLab.com and self-managed
- Self-hosted hostsGitHub Enterprise Server, GitLab self-managed: a collector you run reads them and pushes the findings
- OpenAIeach API key, in its project
- Anthropiceach workspace or service-account key
- Azure OpenAIeach model deployment
- Amazon Bedrockeach caller: an IAM role seen in CloudTrail
- Databrickseach serving endpoint
- Snowflakeeach role calling Cortex
- A repository you scanone per application, on the Policy tab: the AI SDKs and models it imports
- The gatewayeach application registered with a Saible key
- The browser extensionAI services people use, by team: Catalog › People
- roadmapAzure DevOps · Bitbucketafter GitHub and GitLab
- roadmapOne system across platformsa repository matched to its keys, roles and images
Each repository is read as one archive of its head commit, in memory, and discarded; the next scan re-reads only repositories whose head moved. With the collector the archive is read on your own network and only the findings below are sent. The per-application scan on Policy → From your code is separate: it keeps the trimmed line a finding sits on, and the inventory takes only the SDK and model names from it.
- Read, by fixed patterns
- Dependency manifests naming an AI SDK or agent framework; imports in code
- Environment variable names: OPENAI_API_KEY, ANTHROPIC_API_KEY, AZURE_OPENAI_*, BEDROCK_*
- Model id strings; prompt files and system prompts; .mcp.json and tool schemas; AGENTS.md, CLAUDE.md, .cursorrules
- Terraform and CloudFormation for Bedrock agents, Azure OpenAI deployments and Vertex endpoints; CODEOWNERS
- One archive per repository whose default branch moved, read in memory; no model reads your code
- Kept by Saible
- Repository names, the head commit, each unit's folder, and the file and line a signal sits on with the matched name only
- SDK, framework and model names; environment variable names; counts of prompts, tools and MCP servers
- A CODEOWNERS team, shown in the claim drawer as a suggestion; a person named there is only flagged
- A confidence of high, medium or low, computed from the kinds of signal found
- Never
- Source code or prompt text stored, or sent to a model; prompts are counted; a line's text beyond the matched name
- An environment variable's value, or your code host's token in a finding
- A person's name or e-mail on a candidate: workloads, never people
- A repository skipped because it looks stale; a connection Saible opens into your network
- Metadata: readthe list of repositories, their default branch and whether each is archived
- Contents: readone archive of the head commit per repository whose branch moved, read in memory
- All repositoriesthe installation covers the organisation; nothing is picked by hand and nothing skipped
- App ID · installation ID · private keytyped once at Connect; the key goes to the per-tenant secret store and an installation token is minted per scan
- Your own GitHub App on the organisation, or Saible's when your instance offers the install link. The push and repository events are not read yet: a change is picked up by the nightly scan or Scan now; webhooks are on the roadmap.
- FirstA collector you run
- A distroless image: non-root, no shell, no inbound port, outbound only to your code host and to your Saible instance
- Connect the host in Saible as “Our collector reads it”, then issue a collector key: sdc.<org>.<secret>, shown once; Saible keeps its SHA-256
- Runs as a cron job or a Kubernetes CronJob; asks Saible which commits it already holds, reads only what moved, pushes the findings
- The same scanner as Saible's own, so the push gives the same systems as a pull; up to 200 repositories per push
- Every pushed value is checked on arrival for its shape: a name, a path, a line number, a team slug; anything else is refused
- SecondPrivate connectivity, if you prefer to run nothingroadmap
- AWS PrivateLink: your endpoint service, Saible's interface endpoint in the region of your instance
- Then an allow-listed fixed egress address, as the gateway's control-plane calls use today
- Then VPC peering, for a Dedicated Saible instance only
- SplitA unit that is really several services: name the folders and why. Each folder becomes a system of its own; a folder with no signal is refused. The record says whether the parent was kept or replaced.
- MergeSeveral units that are one product: pick the rows, name it and say why. One system to claim; a reconnect keeps the merge.
- Not AIAn org admin sets a row aside with why: a test fixture, nothing deployed calls a model. It is not listed again.
- ConfidenceHigh: an SDK, import or infrastructure declaration plus another kind of signal. Medium: one strong signal, or a supporting one. Low: a prompt file or README mention alone. Coding-assistant files alone never make a system.
- PurposeWhat the system is for, in a sentence. Required to claim; never pre-filled.
- AI Act risk class and its reasonProhibited, high, limited or minimal, with the reason in a sentence; or decide later. The owner declares it; Saible never does.
- Owner and teamThe CODEOWNERS team is a suggestion in the claim drawer; the person confirms it. Data classes and autonomy are declared by the owner, or taken from the data map where your platforms' tags say so.
- ApprovalsA claim into an existing system by its owner or an org admin; a policy change by a second person; an attestation by the owner, every 90 days.
Home and the catalog count the systems found with no owner, in code and on the platforms, with where each was found and how long it has waited; after 14 days a system is flagged to the org admins.
The AI Act inventory lists each discovered, unclaimed system as such, with where it was found and the date first seen, and no owner, purpose or tier until a person claims it. The AI landscape report counts them, apart from the names seen in use with no registration. No owner suggestion appears on a report. A row count is a list of what was found, never a register on its own.
See chains, checks and the evidence pack for what the reports hold, and control coverage for where Know and Own come from.
- 1Open Catalog → Systems → Discovered from code → Connect GitHub: your GitHub organisation through a GitHub App or a fine-grained token, or a GitLab group through a group token. For a self-hosted host choose Our collector reads it, then Collector key and run the collector where it can reach the host.
- 2Connect your AI platforms under Settings → Providers. The first scan runs tonight, or press Scan now; Test counts the repositories and reads nothing else.
- 3Open Discovered from code: each service that calls a model, with its repository and folder, how sure Saible is and what was found. Home and the catalog's figures count what has no owner, in code and on the platforms.
- 4Open a row: where each signal was found, file and line, and the CODEOWNERS team as a suggestion. Press Claim it and type the purpose and the risk class; or Split it by folder, pick rows to Merge, or mark it Not AI, each with why.
- 5Press Attest as owner on the system's Access tab, and again every 90 days. Mark what is not yours Not ours.
This topic is also written as Agent Skills your agents can load: discovery, catalog, code-scan, exposure-report, human-ai-use. Ask us for them.