TLPT Scope v1 Contract

Contract ID: CONTRACT-TLPT-SCOPE-V1-023 Version: tlpt-scope.v1 Status: Draft Owner: Tools Guild Last updated: 2026-05-01

Purpose

TLPT Scope v1 is the deterministic white-team scoping document for DORA TLPT preparation. It identifies the tenant, included critical assets, included business functions, third-party dependencies, TLPT objectives, ReachGraph subgraph reference, and frozen baseline hash used for later replay and evidence pack assembly. The frozen baseline hash is the baselineHash from tlpt-baseline.v1once Replay Core baseline capture has run.

This contract is for engineers and white-team auditors who scope a DORA TLPT engagement. The scope document is the first artifact of the TLPT evidence chain: scope → baselineevidence pack.

The scoper does not run offensive tooling and does not perform red-team activity. It only produces evidence-side scope JSON from declared inputs.

Schema Pinning

Document Shape

Required top-level fields:

Determinism Rules

Input Source Rules

The deterministic local input path (--asset-registry <file>) remains supported for offline replay. It accepts a local asset-registry.v1 JSON input file containing a single asset object (with an assetId property), an array of assets, or an envelope with assets[] or items[]. The verbatim file bytes are SHA-256 hashed into assetRegistry.inputHash. Local scopes record assetRegistry.source as local-file.

Live Asset Registry query integration is selected by omitting --asset-registry and supplying --graph-asset-registry-url <base-url> (with an optional --graph-bearer-token). It targets Graph’s public Asset Registry client contract over POST /graph/assets/query (which requires the graph:read scope, or query equivalent, on the Graph service). The scoper sends the tenant via the X-StellaOps-TenantId request header, requests active assets (includeTombstones=false, limit=500, ordering=assetId), follows the returned cursor token until exhausted (failing closed on a repeated cursor), maps each AssetRegistryAssetRecord to the local asset-registry.v1 scope input shape, and hashes the canonical mapped asset set into assetRegistry.inputHash. Live scopes record assetRegistry.source as graph-api. If neither --asset-registry nor --graph-asset-registry-url is supplied, the command fails closed with exit code 2. Live-mode Graph query failures and any non-asset-registry.v1 response schema version also fail closed.

Offline and Replay Expectations

Example Command

Local/offline mode. Canonical JSON is written to stdout unless --output/-o is supplied. Here the ReachGraph reference is derived from the subgraph file hash because --reachability-subgraph-digest is omitted.

dotnet run --project src/Tools/StellaOps.Tools.TlptScoper/StellaOps.Tools.TlptScoper.csproj -- scope `
  --tenant tenant-a `
  --criticality-threshold high `
  --asset-registry src/Tools/StellaOps.Tools.TlptScoper/fixtures/synthetic-tenant/asset-registry.json `
  --reachability-subgraph src/Tools/StellaOps.Tools.TlptScoper/fixtures/synthetic-tenant/reachgraph-subgraph.json `
  --frozen-baseline-hash sha256:2222222222222222222222222222222222222222222222222222222222222222 `
  --valid-from 2026-05-01T00:00:00Z `
  --valid-to 2026-08-01T00:00:00Z `
  --output scope.json

Live Graph mode. Omit --asset-registry and supply the Graph base URL; an explicit ReachGraph digest may replace the local subgraph file.

dotnet run --project src/Tools/StellaOps.Tools.TlptScoper/StellaOps.Tools.TlptScoper.csproj -- scope `
  --tenant tenant-a `
  --criticality-threshold high `
  --graph-asset-registry-url https://graph.internal/ `
  --graph-bearer-token <token> `
  --reachability-subgraph-digest sha256:1111111111111111111111111111111111111111111111111111111111111111 `
  --frozen-baseline-hash sha256:2222222222222222222222222222222222222222222222222222222222222222 `
  --valid-from 2026-05-01T00:00:00Z `
  --valid-to 2026-08-01T00:00:00Z

CLI options

OptionRequiredNotes
--tenantyesTenant id to scope.
--criticality-thresholdyeslow, medium, high, or critical.
--asset-registrylocal modeLocal asset-registry.v1 JSON input.
--graph-asset-registry-urllive modeBase URL for live Graph Asset Registry; used only when --asset-registry is omitted.
--graph-bearer-tokennoOptional bearer token for live Graph requests.
--reachability-subgraphone of these twoLocal ReachGraph subgraph file (hashed into reachabilitySubgraph.inputHash).
--reachability-subgraph-digestone of these twoExplicit sha256: ReachGraph digest; falls back to the subgraph file hash when omitted.
--frozen-baseline-hashyessha256: baseline hash this scope binds to.
--valid-from, --valid-toyesUTC RFC3339 timestamps; validTo must be later than validFrom.
--output, -onoOutput file; writes canonical JSON to stdout when omitted.