@fourier-labs/harbour-contracts 0.5.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -4
- package/contract-release.json +134 -0
- package/dist/gen-ts/ai-budget-ledger-event.d.ts +21 -0
- package/dist/gen-ts/ai-budget-ledger-event.js +3 -0
- package/dist/gen-ts/ai-classification-stamp.d.ts +25 -0
- package/dist/gen-ts/ai-classification-stamp.js +3 -0
- package/dist/gen-ts/ai-composite-policy-digest-helper.d.ts +5 -0
- package/dist/gen-ts/ai-composite-policy-digest-helper.js +13 -0
- package/dist/gen-ts/ai-composite-policy-digest.d.ts +12 -0
- package/dist/gen-ts/ai-composite-policy-digest.js +3 -0
- package/dist/gen-ts/ai-deployment-gate-decision.d.ts +27 -0
- package/dist/gen-ts/ai-deployment-gate-decision.js +3 -0
- package/dist/gen-ts/ai-gateway-key-lifecycle-event.d.ts +49 -0
- package/dist/gen-ts/ai-gateway-key-lifecycle-event.js +16 -0
- package/dist/gen-ts/ai-governance-decision.d.ts +14 -2
- package/dist/gen-ts/ai-metering-policy.d.ts +16 -0
- package/dist/gen-ts/ai-metering-policy.js +3 -0
- package/dist/gen-ts/ai-policy-snapshot.d.ts +5 -269
- package/dist/gen-ts/ai-pricing-revision.d.ts +29 -0
- package/dist/gen-ts/ai-pricing-revision.js +3 -0
- package/dist/gen-ts/ai-runtime-binding.d.ts +14 -0
- package/dist/gen-ts/ai-runtime-binding.js +3 -0
- package/dist/gen-ts/ai-runtime-contract.d.ts +16 -1
- package/dist/gen-ts/ai-trace-event-v2.d.ts +31 -0
- package/dist/gen-ts/ai-trace-event-v2.js +3 -0
- package/dist/gen-ts/ai-transform-event.d.ts +2 -21
- package/dist/gen-ts/ai-transform-result.d.ts +1 -1
- package/dist/gen-ts/ai-verification-evidence.d.ts +2 -1
- package/dist/gen-ts/contract-release.d.ts +7 -0
- package/dist/gen-ts/contract-release.js +9 -0
- package/dist/gen-ts/data-grant.d.ts +1 -1
- package/dist/gen-ts/error-category-registry.d.ts +5 -0
- package/dist/gen-ts/error-category-registry.js +10 -0
- package/dist/gen-ts/index.d.ts +12 -0
- package/dist/gen-ts/index.js +12 -0
- package/dist/gen-ts/kvs-routing-entry.d.ts +19 -5
- package/dist/gen-ts/promotion-request.d.ts +23 -0
- package/dist/gen-ts/transform-report.d.ts +102 -0
- package/dist/gen-ts/transform-report.js +3 -0
- package/fixtures/ai/valid-blocked-trace-event.json +31 -0
- package/fixtures/ai/valid-budget-ledger-event.json +15 -0
- package/fixtures/ai/valid-classification-stamp.json +19 -0
- package/fixtures/ai/valid-composite-policy-digest.json +11 -0
- package/fixtures/ai/valid-deployment-gate-decision.json +18 -0
- package/fixtures/ai/valid-failed-trace-event.json +50 -0
- package/fixtures/ai/valid-gateway-key-lifecycle-event.json +16 -0
- package/fixtures/ai/valid-gateway-key-lookup.json +14 -0
- package/fixtures/ai/valid-governance-decision.json +53 -0
- package/fixtures/ai/valid-inventory.json +30 -0
- package/fixtures/ai/valid-metering-policy.json +8 -0
- package/fixtures/ai/valid-policy-snapshot.json +117 -0
- package/fixtures/ai/valid-pricing-revision.json +14 -0
- package/fixtures/ai/valid-runtime-binding.json +7 -0
- package/fixtures/ai/valid-runtime-contract.json +24 -0
- package/fixtures/ai/valid-trace-event-v2.json +24 -0
- package/fixtures/ai/valid-trace-event.json +41 -0
- package/fixtures/ai/valid-transform-event.json +32 -0
- package/fixtures/ai/valid-transform-result.json +23 -0
- package/fixtures/ai/valid-verification-evidence.json +33 -0
- package/gen-ts/ai-budget-ledger-event.ts +25 -0
- package/gen-ts/ai-callsite-inventory.ts +64 -0
- package/gen-ts/ai-classification-stamp.ts +28 -0
- package/gen-ts/ai-composite-policy-digest-helper.ts +18 -0
- package/gen-ts/ai-composite-policy-digest.ts +16 -0
- package/gen-ts/ai-deployment-gate-decision.ts +30 -0
- package/gen-ts/ai-gateway-key-lifecycle-event.ts +81 -0
- package/gen-ts/ai-gateway-key-lookup.ts +23 -0
- package/gen-ts/ai-gateway-key-token.ts +7 -0
- package/gen-ts/ai-governance-decision.ts +90 -0
- package/gen-ts/ai-metering-policy.ts +20 -0
- package/gen-ts/ai-policy-snapshot.ts +169 -0
- package/gen-ts/ai-pricing-revision.ts +33 -0
- package/gen-ts/ai-runtime-binding.ts +18 -0
- package/gen-ts/ai-runtime-contract.ts +46 -0
- package/gen-ts/ai-trace-event-v2.ts +35 -0
- package/gen-ts/ai-trace-event.ts +72 -0
- package/gen-ts/ai-transform-event.ts +51 -0
- package/gen-ts/ai-transform-result.ts +36 -0
- package/gen-ts/ai-verification-evidence.ts +54 -0
- package/gen-ts/api-error-response.ts +16 -0
- package/gen-ts/artifact-contract.ts +81 -0
- package/gen-ts/contract-release.ts +10 -0
- package/gen-ts/data-dependency.ts +46 -0
- package/gen-ts/data-grant.ts +71 -0
- package/gen-ts/data-source.ts +78 -0
- package/gen-ts/deploy-request.ts +66 -0
- package/gen-ts/deploy-response.ts +25 -0
- package/gen-ts/deployment-environment.ts +7 -0
- package/gen-ts/deployment-source.ts +16 -0
- package/gen-ts/deployment-status-failure.ts +12 -0
- package/gen-ts/deployment-status-request.ts +11 -0
- package/gen-ts/deployment-status-response.ts +39 -0
- package/gen-ts/env-bindings.ts +64 -0
- package/gen-ts/error-category-registry.ts +108 -0
- package/gen-ts/error-category.ts +7 -0
- package/gen-ts/error-envelope.ts +49 -0
- package/gen-ts/index.ts +47 -0
- package/gen-ts/kvs-routing-entry.ts +30 -0
- package/gen-ts/promotion-request.ts +43 -0
- package/gen-ts/promotion-response.ts +20 -0
- package/gen-ts/secret-reference.ts +40 -0
- package/gen-ts/transform-report.ts +105 -0
- package/gen-ts/version-state-machine.ts +52 -0
- package/gen-ts/version-state.ts +19 -0
- package/package.json +8 -4
- package/schema/ai-budget-ledger-event.schema.json +29 -0
- package/schema/ai-classification-stamp.schema.json +40 -0
- package/schema/ai-composite-policy-digest.schema.json +27 -0
- package/schema/ai-deployment-gate-decision.schema.json +38 -0
- package/schema/ai-gateway-key-lifecycle-event.schema.json +61 -0
- package/schema/ai-governance-decision.schema.json +23 -2
- package/schema/ai-metering-policy.schema.json +18 -0
- package/schema/ai-pricing-revision.schema.json +38 -0
- package/schema/ai-runtime-binding.schema.json +26 -0
- package/schema/ai-runtime-contract.schema.json +24 -2
- package/schema/ai-trace-event-v2.schema.json +41 -0
- package/schema/ai-verification-evidence.schema.json +1 -0
- package/schema/error-category.enum.json +6 -1
- package/schema/kvs-routing-entry.schema.json +28 -8
- package/schema/promotion-request.schema.json +38 -0
- package/schema/transform-report.schema.json +204 -0
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Value stored in the CloudFront KeyValueStore
|
|
2
|
+
* Value stored in the CloudFront KeyValueStore and read by the viewer-request router on EVERY request. Keyed by `<org>.<app>` — the tenant-qualified app identity, not a host header; slugs are lowercase DNS-label-shaped and cannot contain dots, so the single dot is an unambiguous separator. Two constraints cannot be expressed in JSON Schema and are enforced in the router: the TOTAL length of all `staticAssetPrefixes` must not exceed 512 bytes, and the array must be empty when `routeMode` is `static`. Written by cutover; a request whose entry fails any of these rules is refused at the edge rather than routed on a guess.
|
|
3
3
|
*/
|
|
4
4
|
export interface KvsRoutingEntry {
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Immutable prefix of the LIVE version's static output: `builds/<org>/<app>/<64-hex-digest>`, with no trailing slash. The digest is what makes a cutover safe — the router rewrites matching requests to this prefix before the cache lookup, so it is also the edge cache key, and a new version therefore cannot serve the previous version's cached bytes.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
staticPath: string;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Whether the app has an application runtime. REQUIRED: an entry without it is refused with 503 rather than guessed at. In `server` mode a path under a declared `staticAssetPrefixes` entry is served from S3 and everything else goes to `apiDomain`; in `static` mode every path is served from S3.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
routeMode: 'server' | 'static';
|
|
13
|
+
/**
|
|
14
|
+
* The version's monotonic sequence number within its lane. Cutover uses it to keep writes one-way: an entry is only replaced by a strictly higher ordinal, so a delayed or replayed write cannot move an app backwards.
|
|
15
|
+
*/
|
|
16
|
+
ordinal: number;
|
|
17
|
+
/**
|
|
18
|
+
* The app runtime's AWS_IAM-protected Lambda Function URL host. Required in `server` mode and omitted entirely for a static-only app. The router refuses any other domain shape, so this cannot be pointed at an arbitrary origin.
|
|
19
|
+
*/
|
|
20
|
+
apiDomain?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Build-derived prefixes that a `server` app serves from its immutable S3 output rather than from its runtime, e.g. `_next/static/`. Derived from verified build output, never from framework names. Must be strictly ascending, must total at most 512 bytes, and must be absent or empty in `static` mode — the last two are enforced in the router because JSON Schema cannot express them. Omitted when empty: a server app with public build output and no prefixes serves every asset from its Lambda, which is a build-plan defect rather than a routing one.
|
|
23
|
+
*
|
|
24
|
+
* @maxItems 16
|
|
25
|
+
*/
|
|
26
|
+
staticAssetPrefixes?: string[];
|
|
13
27
|
}
|
|
@@ -14,4 +14,27 @@ export interface PromotionRequest {
|
|
|
14
14
|
* Durable caller-generated key. Identical replays return the original production version; reuse with a changed request is rejected.
|
|
15
15
|
*/
|
|
16
16
|
idempotencyKey: string;
|
|
17
|
+
environmentBindings?: PromotionRequestEnvironmentBindings;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Optional secret bindings for the production version. Additive: promotions without it remain valid, and a deployment plane that ignores the field behaves exactly as before. Named environmentBindings to match deploy-request.schema.json, whose preview counterpart this mirrors.
|
|
21
|
+
*/
|
|
22
|
+
export interface PromotionRequestEnvironmentBindings {
|
|
23
|
+
/**
|
|
24
|
+
* Secret bindings for the production version. An empty array is meaningful: it says the caller looked and the app declares no secrets.
|
|
25
|
+
*/
|
|
26
|
+
bindings: PromotionRequestSecretBinding[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One secret binding. Unlike the preview counterpart there is no `value` member and `secretRef` is required, so a plain literal is unrepresentable on the promotion path rather than merely refused by the handler. The secretRef pattern admits only the app-secret shape, which is what keeps a promotion from naming a tenant integration credential.
|
|
30
|
+
*/
|
|
31
|
+
export interface PromotionRequestSecretBinding {
|
|
32
|
+
/**
|
|
33
|
+
* Environment-variable name the app reads.
|
|
34
|
+
*/
|
|
35
|
+
name: string;
|
|
36
|
+
/**
|
|
37
|
+
* Governance reference the deployment plane resolves. The value never appears in the request, in this schema, or in any record derived from it.
|
|
38
|
+
*/
|
|
39
|
+
secretRef: string;
|
|
17
40
|
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured output an agent must return from one Harbour transformation attempt. Handed to the agent as its output schema, then decoded and semantically re-validated by the control plane, which remains the authority. The enum on applied_playbooks.items is the one dynamic part: the adapter injects the names of the playbooks supplied for that invocation before writing the document, so the model is structurally prevented from naming a playbook it was not given. Application-secret handling was removed platform-wide, so this document carries no redactions and no secrets fields.
|
|
3
|
+
*/
|
|
4
|
+
export interface TransformReport {
|
|
5
|
+
/**
|
|
6
|
+
* @minItems 1
|
|
7
|
+
*/
|
|
8
|
+
applied_playbooks: string[];
|
|
9
|
+
static_rebuild_required: boolean;
|
|
10
|
+
analysis: {
|
|
11
|
+
deployable: boolean;
|
|
12
|
+
needsTransformation: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* @maxItems 64
|
|
15
|
+
*/
|
|
16
|
+
blockers: string[];
|
|
17
|
+
/**
|
|
18
|
+
* @minItems 1
|
|
19
|
+
* @maxItems 1024
|
|
20
|
+
*/
|
|
21
|
+
surfaces: string[];
|
|
22
|
+
/**
|
|
23
|
+
* @maxItems 1024
|
|
24
|
+
*/
|
|
25
|
+
evidence: {
|
|
26
|
+
path: string;
|
|
27
|
+
line: number;
|
|
28
|
+
reason: string;
|
|
29
|
+
}[];
|
|
30
|
+
};
|
|
31
|
+
database: {
|
|
32
|
+
mode: 'none' | 'sql' | 'unsupported';
|
|
33
|
+
changeType: 'none' | 'code_only' | 'schema_only' | 'code_and_schema';
|
|
34
|
+
requiresCodeChanges: boolean;
|
|
35
|
+
requiresSchemaMigration: boolean;
|
|
36
|
+
desiredSchemaPath: string;
|
|
37
|
+
/**
|
|
38
|
+
* @maxItems 128
|
|
39
|
+
*/
|
|
40
|
+
migrationPaths: string[];
|
|
41
|
+
/**
|
|
42
|
+
* @maxItems 512
|
|
43
|
+
*/
|
|
44
|
+
changedFiles: string[];
|
|
45
|
+
/**
|
|
46
|
+
* @maxItems 128
|
|
47
|
+
*/
|
|
48
|
+
evidence: {
|
|
49
|
+
path: string;
|
|
50
|
+
line: number;
|
|
51
|
+
reason: string;
|
|
52
|
+
}[];
|
|
53
|
+
/**
|
|
54
|
+
* @maxItems 64
|
|
55
|
+
*/
|
|
56
|
+
unsupportedFeatures: string[];
|
|
57
|
+
};
|
|
58
|
+
application: {
|
|
59
|
+
runtime: string;
|
|
60
|
+
buildKind: 'container' | 'static';
|
|
61
|
+
topology: 'static' | 'backend' | 'frontend_and_backend';
|
|
62
|
+
entrypoint: string;
|
|
63
|
+
build: {
|
|
64
|
+
/**
|
|
65
|
+
* @minItems 1
|
|
66
|
+
* @maxItems 64
|
|
67
|
+
*/
|
|
68
|
+
installCommand: string[];
|
|
69
|
+
/**
|
|
70
|
+
* @minItems 1
|
|
71
|
+
* @maxItems 64
|
|
72
|
+
*/
|
|
73
|
+
buildCommand: string[];
|
|
74
|
+
/**
|
|
75
|
+
* @minItems 1
|
|
76
|
+
* @maxItems 16
|
|
77
|
+
*/
|
|
78
|
+
outputs: {
|
|
79
|
+
path: string;
|
|
80
|
+
kind: 'public' | 'backend';
|
|
81
|
+
route: string;
|
|
82
|
+
}[];
|
|
83
|
+
};
|
|
84
|
+
basePath: {
|
|
85
|
+
required: boolean;
|
|
86
|
+
environmentVariable: 'HARBOUR_BASE_PATH';
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* @minItems 1
|
|
90
|
+
* @maxItems 64
|
|
91
|
+
*/
|
|
92
|
+
evidence: {
|
|
93
|
+
path: string;
|
|
94
|
+
line: number;
|
|
95
|
+
reason: string;
|
|
96
|
+
}[];
|
|
97
|
+
/**
|
|
98
|
+
* @maxItems 64
|
|
99
|
+
*/
|
|
100
|
+
unsupportedFeatures: string[];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-trace-event/1.0",
|
|
3
|
+
"traceId": "trc_blocked123",
|
|
4
|
+
"requestId": "req_blocked123",
|
|
5
|
+
"tenantId": "fourier",
|
|
6
|
+
"appId": "support-assistant",
|
|
7
|
+
"environment": "production",
|
|
8
|
+
"versionId": "fourier#support-assistant#production#000124",
|
|
9
|
+
"policyDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
10
|
+
"requestedModel": "gpt-4.1-mini",
|
|
11
|
+
"governedModelAlias": "harbour/standard",
|
|
12
|
+
"outcome": "blocked",
|
|
13
|
+
"costMicroUsd": 0,
|
|
14
|
+
"latencyMs": 4,
|
|
15
|
+
"retryCount": 0,
|
|
16
|
+
"fallbackUsed": false,
|
|
17
|
+
"reservationId": "req_blocked123#budget",
|
|
18
|
+
"attempts": [],
|
|
19
|
+
"guardrailResults": [
|
|
20
|
+
{
|
|
21
|
+
"ruleId": "input-secret-pattern",
|
|
22
|
+
"detectorId": "input.secret_pattern",
|
|
23
|
+
"detectorVersion": "1.0.0",
|
|
24
|
+
"phase": "input",
|
|
25
|
+
"action": "BLOCK",
|
|
26
|
+
"result": "blocked"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"contentCaptureStatus": "off",
|
|
30
|
+
"occurredAt": "2026-08-02T10:00:00Z"
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-budget-ledger-event/2.0",
|
|
3
|
+
"eventId": "ledger_000124_1",
|
|
4
|
+
"idempotencyKey": "reserve_000124",
|
|
5
|
+
"budgetScope": "fourier/support-assistant/production",
|
|
6
|
+
"period": "2026-08",
|
|
7
|
+
"eventType": "RESERVED",
|
|
8
|
+
"reservationId": "req_example123#budget",
|
|
9
|
+
"requestId": "req_example123",
|
|
10
|
+
"amountMicroUsd": 500,
|
|
11
|
+
"committedMicroUsdAfter": 10500,
|
|
12
|
+
"pricingRevisionDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
13
|
+
"eventDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
14
|
+
"occurredAt": "2026-08-10T10:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-classification-stamp/1.0",
|
|
3
|
+
"stampId": "cls_000124",
|
|
4
|
+
"tenantId": "fourier",
|
|
5
|
+
"appId": "support-assistant",
|
|
6
|
+
"environment": "preview",
|
|
7
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
8
|
+
"sourceRevision": "0123456789abcdef",
|
|
9
|
+
"status": "AVAILABLE",
|
|
10
|
+
"classification": "Yellow",
|
|
11
|
+
"classifierId": "harbour-source-classifier",
|
|
12
|
+
"classifierVersion": "1.0.0",
|
|
13
|
+
"sourceDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
14
|
+
"inventoryDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
15
|
+
"securityEvidenceDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
16
|
+
"evidenceDigest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
17
|
+
"stampDigest": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
18
|
+
"stampedAt": "2026-08-10T10:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"input": {
|
|
3
|
+
"schema": "harbour.ai-composite-policy-digest/1.0",
|
|
4
|
+
"baselineDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
5
|
+
"classificationStampDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
6
|
+
"tenantPolicyDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
7
|
+
"applicationPolicyDigest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
|
|
8
|
+
},
|
|
9
|
+
"preimage": "harbour.ai-composite-policy-digest/1\nsha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nsha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\nsha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\nsha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\n-",
|
|
10
|
+
"digest": "sha256:b6cf8539c27e06d64213c564c40455d56303cbf30fd346253ea1842c7377d2a0"
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-deployment-gate-decision/1.0",
|
|
3
|
+
"decisionId": "gate_000124_1",
|
|
4
|
+
"sequence": 1,
|
|
5
|
+
"tenantId": "fourier",
|
|
6
|
+
"appId": "support-assistant",
|
|
7
|
+
"environment": "preview",
|
|
8
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
9
|
+
"sourceRevision": "0123456789abcdef",
|
|
10
|
+
"decision": "PASS",
|
|
11
|
+
"reasonCodes": [],
|
|
12
|
+
"classificationStampDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
13
|
+
"planDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
14
|
+
"policyDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
15
|
+
"evidenceDigest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
16
|
+
"decisionDigest": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
17
|
+
"decidedAt": "2026-08-10T10:05:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-trace-event/1.0",
|
|
3
|
+
"traceId": "trc_failed123",
|
|
4
|
+
"requestId": "req_failed123",
|
|
5
|
+
"tenantId": "fourier",
|
|
6
|
+
"appId": "support-assistant",
|
|
7
|
+
"environment": "production",
|
|
8
|
+
"versionId": "fourier#support-assistant#production#000124",
|
|
9
|
+
"callsiteFingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
10
|
+
"policyDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
11
|
+
"routeRevision": "harbour/standard#3",
|
|
12
|
+
"requestedModel": "gpt-4.1-mini",
|
|
13
|
+
"governedModelAlias": "harbour/standard",
|
|
14
|
+
"provider": "openai",
|
|
15
|
+
"providerModel": "gpt-4.1-mini",
|
|
16
|
+
"outcome": "failed",
|
|
17
|
+
"priceRevision": "openai-gpt-4.1-mini-2026-08-01",
|
|
18
|
+
"costMicroUsd": 48,
|
|
19
|
+
"latencyMs": 31204,
|
|
20
|
+
"retryCount": 1,
|
|
21
|
+
"fallbackUsed": false,
|
|
22
|
+
"reservationId": "req_failed123#budget",
|
|
23
|
+
"attempts": [
|
|
24
|
+
{
|
|
25
|
+
"attempt": 1,
|
|
26
|
+
"provider": "openai",
|
|
27
|
+
"providerModel": "gpt-4.1-mini",
|
|
28
|
+
"priceRevision": "openai-gpt-4.1-mini-2026-08-01",
|
|
29
|
+
"outcome": "failed",
|
|
30
|
+
"usage": null,
|
|
31
|
+
"costMicroUsd": 0,
|
|
32
|
+
"latencyMs": 30001,
|
|
33
|
+
"errorCode": "provider_unavailable"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"attempt": 2,
|
|
37
|
+
"provider": "openai",
|
|
38
|
+
"providerModel": "gpt-4.1-mini",
|
|
39
|
+
"priceRevision": "openai-gpt-4.1-mini-2026-08-01",
|
|
40
|
+
"outcome": "failed",
|
|
41
|
+
"usage": { "inputTokens": 120, "outputTokens": 0 },
|
|
42
|
+
"costMicroUsd": 48,
|
|
43
|
+
"latencyMs": 1203,
|
|
44
|
+
"errorCode": "provider_server_error"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"guardrailResults": [],
|
|
48
|
+
"contentCaptureStatus": "off",
|
|
49
|
+
"occurredAt": "2026-08-02T10:00:00Z"
|
|
50
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-gateway-key-lifecycle-event/1.0",
|
|
3
|
+
"eventId": "keyevt_000124_2",
|
|
4
|
+
"sequence": 2,
|
|
5
|
+
"keyId": "0123456789abcdef0123456789abcdef",
|
|
6
|
+
"tenantId": "fourier",
|
|
7
|
+
"appId": "support-assistant",
|
|
8
|
+
"environment": "preview",
|
|
9
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
10
|
+
"fromStatus": "PENDING",
|
|
11
|
+
"toStatus": "ACTIVE",
|
|
12
|
+
"cause": "ACTIVATION",
|
|
13
|
+
"secretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
14
|
+
"eventDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
15
|
+
"occurredAt": "2026-08-10T10:03:00Z"
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-gateway-key-lookup/1.0",
|
|
3
|
+
"keyId": "0123456789abcdef0123456789abcdef",
|
|
4
|
+
"tenantId": "fourier",
|
|
5
|
+
"appId": "support-assistant",
|
|
6
|
+
"environment": "preview",
|
|
7
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
8
|
+
"tokenPrefix": "hbr_test_",
|
|
9
|
+
"status": "ACTIVE",
|
|
10
|
+
"keyMac": "AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA=",
|
|
11
|
+
"createdAt": "2026-08-02T09:59:00Z",
|
|
12
|
+
"activatedAt": "2026-08-02T10:00:00Z",
|
|
13
|
+
"expiresAt": "2026-09-01T10:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-governance-decision/1.0",
|
|
3
|
+
"phase": "PLAN",
|
|
4
|
+
"tenantId": "fourier",
|
|
5
|
+
"appId": "support-assistant",
|
|
6
|
+
"environment": "preview",
|
|
7
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
8
|
+
"sourceRevision": "0123456789abcdef",
|
|
9
|
+
"decision": "PASS",
|
|
10
|
+
"interceptionPath": "DETERMINISTIC_ADAPTER",
|
|
11
|
+
"reasonCodes": [],
|
|
12
|
+
"uncoveredCallsiteFingerprints": [],
|
|
13
|
+
"inventoryDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
14
|
+
"policyDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
15
|
+
"runtimeContractDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
16
|
+
"interceptionPlan": [
|
|
17
|
+
{
|
|
18
|
+
"callSiteFingerprint": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
19
|
+
"sourcePath": "src/ai-client.ts",
|
|
20
|
+
"expectedSourceFileSha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
21
|
+
"strategy": "deterministic_adapter",
|
|
22
|
+
"allowedSyntaxKinds": ["ImportDeclaration", "NewExpression"],
|
|
23
|
+
"transformId": "google-genai-client-boundary",
|
|
24
|
+
"transformVersion": "1.0.0",
|
|
25
|
+
"runtimeShimName": "@harbour/gemini-compat",
|
|
26
|
+
"runtimeShimVersion": "1.0.0",
|
|
27
|
+
"runtimeShimDigest": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"interceptionPlanDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
|
|
31
|
+
"runtimeContract": {
|
|
32
|
+
"schema": "harbour.ai-runtime-contract/1.0",
|
|
33
|
+
"tenantId": "fourier",
|
|
34
|
+
"appId": "support-assistant",
|
|
35
|
+
"environment": "preview",
|
|
36
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
37
|
+
"sourceRevision": "0123456789abcdef",
|
|
38
|
+
"mode": "enforce",
|
|
39
|
+
"gatewayBaseUrl": "https://ai.harbour.example/v1",
|
|
40
|
+
"gatewayKeySecretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
41
|
+
"modelAliases": { "generation": "harbour/standard" },
|
|
42
|
+
"policyDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
43
|
+
"runtimeBinding": {
|
|
44
|
+
"schema": "harbour.ai-runtime-binding/1.0",
|
|
45
|
+
"platform": "aws_lambda",
|
|
46
|
+
"workloadIdentityRef": "iam-role://harbour/preview/support-assistant/000124",
|
|
47
|
+
"secretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
48
|
+
"runtimeBindingDigest": "sha256:6666666666666666666666666666666666666666666666666666666666666666"
|
|
49
|
+
},
|
|
50
|
+
"requiredStrategies": ["deterministic_adapter"]
|
|
51
|
+
},
|
|
52
|
+
"decidedAt": "2026-08-02T10:00:00Z"
|
|
53
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-callsite-inventory/1.0",
|
|
3
|
+
"tenantId": "fourier",
|
|
4
|
+
"appId": "support-assistant",
|
|
5
|
+
"environment": "preview",
|
|
6
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
7
|
+
"sourceRevision": "0123456789abcdef",
|
|
8
|
+
"analyzerVersion": "ai-callsites/1.0",
|
|
9
|
+
"coverage": "complete_for_supported_sdks",
|
|
10
|
+
"scanStatus": "cybersecurity_scan_unavailable",
|
|
11
|
+
"callsites": [
|
|
12
|
+
{
|
|
13
|
+
"fingerprint": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
14
|
+
"path": "src/ai-client.ts",
|
|
15
|
+
"sourceFileSha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
16
|
+
"line": 18,
|
|
17
|
+
"language": "typescript",
|
|
18
|
+
"sdk": "openai",
|
|
19
|
+
"method": "responses.create",
|
|
20
|
+
"requestedModel": "gpt-4.1-mini",
|
|
21
|
+
"strategy": "deployment_injection",
|
|
22
|
+
"status": "detected",
|
|
23
|
+
"securityFindingIds": [],
|
|
24
|
+
"evidence": {
|
|
25
|
+
"fingerprint": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
26
|
+
"excerpt": "openai call via responses.create"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-metering-policy/2.0",
|
|
3
|
+
"policyDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
4
|
+
"pricingRevisionDigests": ["sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"],
|
|
5
|
+
"reservationMode": "committed_exposure",
|
|
6
|
+
"policyDigestV2": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
7
|
+
"publishedAt": "2026-08-10T09:00:00Z"
|
|
8
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-policy-snapshot/1.0",
|
|
3
|
+
"scope": {
|
|
4
|
+
"level": "application_environment",
|
|
5
|
+
"tenantId": "fourier",
|
|
6
|
+
"appId": "support-assistant",
|
|
7
|
+
"environment": "preview"
|
|
8
|
+
},
|
|
9
|
+
"revision": 3,
|
|
10
|
+
"publishedAt": "2026-08-02T10:00:00Z",
|
|
11
|
+
"contentDigest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
12
|
+
"baselineDigest": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
13
|
+
"classificationMinimum": {
|
|
14
|
+
"classification": "Yellow",
|
|
15
|
+
"mappingDigest": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
16
|
+
},
|
|
17
|
+
"providers": [
|
|
18
|
+
{
|
|
19
|
+
"id": "openai-primary",
|
|
20
|
+
"provider": "openai",
|
|
21
|
+
"baseUrl": "https://api.openai.com/v1",
|
|
22
|
+
"credentialSecretRef": "aws-sm://harbour/nonprod/ai/providers/openai/primary",
|
|
23
|
+
"enabled": true
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"models": [
|
|
27
|
+
{
|
|
28
|
+
"id": "openai-gpt-4.1-mini",
|
|
29
|
+
"providerId": "openai-primary",
|
|
30
|
+
"providerModel": "gpt-4.1-mini",
|
|
31
|
+
"capabilities": ["generation"],
|
|
32
|
+
"approved": true,
|
|
33
|
+
"pricing": {
|
|
34
|
+
"revision": "openai-gpt-4.1-mini-2026-08-01",
|
|
35
|
+
"inputMicroUsdPerMillion": 400000,
|
|
36
|
+
"outputMicroUsdPerMillion": 1600000
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"routes": [
|
|
41
|
+
{
|
|
42
|
+
"alias": "harbour/standard",
|
|
43
|
+
"version": 3,
|
|
44
|
+
"capability": "generation",
|
|
45
|
+
"targets": [
|
|
46
|
+
{ "modelId": "openai-gpt-4.1-mini", "priority": 0, "weight": 10000 }
|
|
47
|
+
],
|
|
48
|
+
"retryCount": 1,
|
|
49
|
+
"timeoutMs": 30000
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"policies": [
|
|
53
|
+
{
|
|
54
|
+
"name": "default-generation",
|
|
55
|
+
"version": 2,
|
|
56
|
+
"maxRequestBytes": 2097152,
|
|
57
|
+
"maxInputTokens": 32000,
|
|
58
|
+
"maxOutputTokens": 4096,
|
|
59
|
+
"bufferedDelivery": false,
|
|
60
|
+
"permittedRequestFields": {
|
|
61
|
+
"temperature": true,
|
|
62
|
+
"maxOutputTokens": true,
|
|
63
|
+
"responseFormat": false,
|
|
64
|
+
"tools": true
|
|
65
|
+
},
|
|
66
|
+
"guardrails": [
|
|
67
|
+
{
|
|
68
|
+
"ruleId": "input-tool-name-allowlist",
|
|
69
|
+
"detectorId": "tool.name_allowlist",
|
|
70
|
+
"detectorVersion": "1.0.0",
|
|
71
|
+
"phase": "input",
|
|
72
|
+
"action": "BLOCK",
|
|
73
|
+
"parameters": {
|
|
74
|
+
"allowedTools": ["search_documents"]
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"ruleId": "output-json-shape",
|
|
79
|
+
"detectorId": "output.json_schema",
|
|
80
|
+
"detectorVersion": "1.0.0",
|
|
81
|
+
"phase": "output",
|
|
82
|
+
"action": "BLOCK",
|
|
83
|
+
"parameters": {
|
|
84
|
+
"jsonSchema": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"properties": {
|
|
88
|
+
"answer": { "type": "string", "maxLength": 4000 },
|
|
89
|
+
"citations": {
|
|
90
|
+
"type": "array",
|
|
91
|
+
"maxItems": 16,
|
|
92
|
+
"items": { "type": "string", "maxLength": 256 }
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"required": ["answer"]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"limits": [
|
|
103
|
+
{
|
|
104
|
+
"name": "application-default",
|
|
105
|
+
"enabled": true,
|
|
106
|
+
"scope": "application",
|
|
107
|
+
"requestsPerMinute": 60,
|
|
108
|
+
"tokensPerMinute": 100000,
|
|
109
|
+
"monthlyBudgetMicroUsd": 100000000
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"retention": {
|
|
113
|
+
"captureMode": "BEST_EFFORT",
|
|
114
|
+
"retentionDays": 30,
|
|
115
|
+
"revealRoles": ["tenant-admin"]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-pricing-revision/2.0",
|
|
3
|
+
"revisionId": "openai-gpt-test-2026-08-10",
|
|
4
|
+
"provider": "openai",
|
|
5
|
+
"providerModel": "gpt-test",
|
|
6
|
+
"currency": "USD",
|
|
7
|
+
"dimensions": [
|
|
8
|
+
{ "dimension": "tokens", "direction": "input", "unit": "token", "scale": 1000000, "microUsdPerScale": 100000 },
|
|
9
|
+
{ "dimension": "tokens", "direction": "output", "unit": "token", "scale": 1000000, "microUsdPerScale": 200000 }
|
|
10
|
+
],
|
|
11
|
+
"revisionDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
12
|
+
"effectiveAt": "2026-08-10T00:00:00Z",
|
|
13
|
+
"publishedAt": "2026-08-10T09:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-runtime-binding/1.0",
|
|
3
|
+
"platform": "aws_lambda",
|
|
4
|
+
"workloadIdentityRef": "iam-role://harbour/preview/support-assistant/000124",
|
|
5
|
+
"secretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
6
|
+
"runtimeBindingDigest": "sha256:6666666666666666666666666666666666666666666666666666666666666666"
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-runtime-contract/1.0",
|
|
3
|
+
"tenantId": "fourier",
|
|
4
|
+
"appId": "support-assistant",
|
|
5
|
+
"environment": "preview",
|
|
6
|
+
"versionId": "fourier#support-assistant#preview#000124",
|
|
7
|
+
"sourceRevision": "0123456789abcdef",
|
|
8
|
+
"mode": "observe",
|
|
9
|
+
"gatewayBaseUrl": "https://ai.harbour.example/v1",
|
|
10
|
+
"gatewayKeySecretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
11
|
+
"modelAliases": {
|
|
12
|
+
"generation": "harbour/standard",
|
|
13
|
+
"embeddings": "harbour/embeddings"
|
|
14
|
+
},
|
|
15
|
+
"policyDigest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
16
|
+
"runtimeBinding": {
|
|
17
|
+
"schema": "harbour.ai-runtime-binding/1.0",
|
|
18
|
+
"platform": "aws_lambda",
|
|
19
|
+
"workloadIdentityRef": "iam-role://harbour/preview/support-assistant/000124",
|
|
20
|
+
"secretRef": "aws-sm://harbour/ai/fourier/support-assistant/preview/versions/000124/gateway-key",
|
|
21
|
+
"runtimeBindingDigest": "sha256:6666666666666666666666666666666666666666666666666666666666666666"
|
|
22
|
+
},
|
|
23
|
+
"requiredStrategies": ["deployment_injection"]
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "harbour.ai-trace-event/2.0",
|
|
3
|
+
"traceId": "trc_example123",
|
|
4
|
+
"requestId": "req_example123",
|
|
5
|
+
"policyDigest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"outcome": "succeeded",
|
|
7
|
+
"usageLineItems": [
|
|
8
|
+
{
|
|
9
|
+
"attempt": 1,
|
|
10
|
+
"dimension": "tokens",
|
|
11
|
+
"direction": "input",
|
|
12
|
+
"quantity": 120,
|
|
13
|
+
"unit": "token",
|
|
14
|
+
"priceRevisionDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
15
|
+
"scale": 1000000,
|
|
16
|
+
"costMicroUsd": 12,
|
|
17
|
+
"provenance": "reported"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"totalCostMicroUsd": 12,
|
|
21
|
+
"reservationId": "req_example123#budget",
|
|
22
|
+
"meteringStatus": "settled",
|
|
23
|
+
"occurredAt": "2026-08-10T10:00:00Z"
|
|
24
|
+
}
|