Version 1.0 — draft, August 26, 2026 — BlackStone Development
This document is two things at once: the public promise at blackstonescripts.com/data, and the engineering constraint every Sentinel component is built against. If code and this document disagree, the code is the bug.
It is written in plain language on purpose. If a rule can't be stated plainly, it isn't a rule yet.
| Term | Meaning |
|---|---|
| BlackStone / we | BlackStone Development, operator of Sentinel and the free tools. |
| Owner | The person or team who links a FiveM/RedM server to Sentinel. The owner controls what their server sends and can end it at any time. |
| Player | Anyone who connects to an owner's server. Players never have a relationship with us; their data reaches us only through the owner's server, and the owner is responsible for telling players it does. |
| Tenant | One linked server and everything stored for it. Nothing crosses tenants. |
| Artifact | Something a person hands a free tool: a crash zip, a CitizenFX.log, a server console log, a server.cfg, a profiler JSON, a resource folder. |
| Finding | The structured result of analysis: what happened, why, where, who fixes it, how confident we are. Findings are the only thing Sentinel is trying to produce. |
| Pseudonym | A stable, one-way stand-in for a player identifier, computed on the owner's server with a key we never hold. |
Every field that could ever pass through Sentinel belongs to exactly one class. The class decides the rule. A field with no class is not allowed to exist.
Server license keys (sv_licenseKey), Steam Web API keys, Cfx keymaster tokens, database connection strings and passwords, Discord bot tokens, Discord webhook URLs, txAdmin credentials, any rcon_password, API keys for third-party resources, and anything else that grants access to something.
server.cfg or any file, and never emits a field that could hold one.license:, license2:, discord:, steam:, fivem:, xbl:, live:, ip: identifiers, hardware tokens, and player IP addresses.
Player display names (in-game character or account names as the server sees them), staff display names, resource names, event names, model names, vehicle plates, amounts, timestamps, hitch durations, artifact/build versions, agent version, resource counts, and free-text reason strings from drops, bans, and staff actions.
reason, detail) are passed through a secret filter (Class S patterns) before storage, because txAdmin and other tools sometimes put things in reasons that don't belong there.Crash signatures (build, module, offset, human-hash, exception code), finding families and confidence, resource names seen across servers, pool ceilings and pressure measurements, hitch cause rankings, artifact version distributions, adapter and framework in use.
Sends: the event types in the wire protocol registry, and only those. Every batch is validated against a schema at the door; anything not in the schema is rejected with a named reason. Unrecognized event types from third-party SDK users are stored raw but pass through the same Class S filter.
Never sends: Class S, player IPs, file contents, server.cfg, chat messages, voice, positions/coordinates, screenshots, or anything the agent has not been explicitly coded to emit. The agent has no file-read scope except the resources folder listing needed for the Assets scanner, and that scope is announced in agent.boot (scopes: [...]) so the owner sees it every start.
Direction: outbound only. The agent opens every connection. There is no inbound port, no listener, and no way for our backend to execute anything on the owner's server. Portal-to-agent commands ride back in the response to the agent's own batch and are limited to a small, documented command set published with the agent's source.
Authentication: a per-server bearer token issued at link time, shown once, stored on our side as a hash. Rotatable and revocable from the portal instantly. Subscription lapse revokes it; the agent stops sending and says so in the server console.
Self-reporting: on every boot the agent emits agent.boot with its version, its redaction configuration, the scopes it has, and the pseudonymization key fingerprint (not the key). If redaction is misconfigured the agent refuses to send and reports why. This is ARCH Rule 1 applied to privacy.
Open source. The agent's code is public so any owner can verify these statements against what actually runs.
Third-party developers who integrate Sentinel.Error(), Sentinel.Metric(), and friends are bound by this contract as a condition of the SDK license:
| Property | Rule |
|---|---|
| Hosting | The application and database run on a managed cloud provider; the static site, docs, and browser tools are served from a separate CDN so that the free tools never touch the systems that hold tenant data. Encrypted backups are kept with a second provider so no single account failure can lose them. Named providers are listed in the Privacy Policy and Data Processing Terms. |
| Tenant isolation | Every query is scoped by tenant at the data layer, not the UI. There is no "all tenants" query path in the portal. |
| Encryption | TLS in transit everywhere. Class N encrypted at rest with a separate key per tenant; keys are never stored in code, in the database, or alongside the data they protect. Tokens stored hashed. Backups encrypted before they leave the primary provider. |
| Retention — events | Raw events: 30 days. Daily rollups per resource/event type: 13 months. Findings: life of the tenant. Asset snapshots: 90 days nightly plus recent incrementals. |
| Retention — free tools | Shared reports: until deleted by holder of the delete token, or 12 months of no views. Unknown-case submissions: until classified or 12 months. |
| Deletion | Owner deletes tenant → all Class N and I data purged within 7 days, backups age out within 35. Class A aggregates that can no longer be traced to the tenant remain. |
| Access on our side | One operator today. Every read of tenant data from an administrative path is written to an audit log the owner can see. No support access without the owner's ticket. |
| Subprocessors | Hosting, CDN/DNS, identity, billing, and alert delivery are each provided by a named third party. The current list lives in the Privacy Policy and Data Processing Terms, where the law requires it. Adding one requires a contract version bump and 30 days' notice. |
| Logs | Application logs never contain request bodies, tokens, or Class I/N values. Log lines carry tenant ID and event counts only. |
We intend to publish aggregate findings ("what crashed in FiveM this month and why"). Rules:
/.well-known/security.txt. We will not take legal action against good-faith research that respects owners' data.This section exists so the suggestions tab can point at it.
Requests to add any of the above will be declined with a link here.
agent.boot; the portal shows it, so an owner always knows which promises their running agent honors.The engineering changes this contract requires are tracked in docs/data-contract-engineering.md (internal). Questions about this document: security@blackstonescripts.com. It will change. That's the point of versioning it.