@fourier-labs/harbour-contracts 0.26.0 → 0.28.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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schema": "harbour.contract-release/1.0",
3
- "repositoryVersion": "0.26.0.0",
4
- "publishVersion": "0.26.0",
5
- "publishTag": "v0.26.0",
6
- "schemasDigest": "sha256:510b57798fd632a4fd34ea7701106b03285c491ab1eddbdef7d1ec0f82d7f70c",
7
- "aiFixturesDigest": "sha256:5d68828a1364dc63cafbb3c2d3f5c5f6c232d5333e7668a9c79e7652e5144b42",
8
- "generatedGoDigest": "sha256:02a598e4606a1d24bbfdd881e548128ce9b60c090db7ff98dcee5bfe94b74ad3",
9
- "generatedTypeScriptDigest": "sha256:72865190987cb97215b1db19d46e5c54579f2c01677e5b8e5c735df1d669b74b",
3
+ "repositoryVersion": "0.28.0.0",
4
+ "publishVersion": "0.28.0",
5
+ "publishTag": "v0.28.0",
6
+ "schemasDigest": "sha256:f5fa7ad6b50cdd28fdfbbd594b2c92035052cd1091eed1273586082565da6df4",
7
+ "aiFixturesDigest": "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6",
8
+ "generatedGoDigest": "sha256:b7c2021f907620ab3df9122992f73c25661a2e4e5ae0207cdc000de1d5227b04",
9
+ "generatedTypeScriptDigest": "sha256:72c340ec27372dbd65849b677e671f42b2a09dec5e6bc7810d735c6b0c6edcd0",
10
10
  "generatedExclusions": {
11
11
  "gen-go/contract_release.go": "contains the generated aggregate digests (self-reference)",
12
12
  "gen-ts/contract-release.ts": "contains the generated aggregate digests (self-reference)"
@@ -21,7 +21,7 @@
21
21
  "schema/ai-gateway-key-lookup.schema.json": "sha256:e994d4782c9bc4f14d3a1c35c9ac1e7a5ec84284cde5b3af7e3e6022130ddbb3",
22
22
  "schema/ai-governance-decision.schema.json": "sha256:fab63e1b869b0e821efe9c27ee63f87fc7023a01d99bc810bad12049b968b788",
23
23
  "schema/ai-metering-policy.schema.json": "sha256:044115938d254d914feac162219d20ee48f741cd7ad32df4613b45f9c862fe8c",
24
- "schema/ai-policy-snapshot.schema.json": "sha256:a866146c953a0577680ff12ec7baff04ddca687783661feaa65f52415b21bce2",
24
+ "schema/ai-policy-snapshot.schema.json": "sha256:8229b855861e029c7792c4c43d42c209055f175af747f437570d42c5008f70d8",
25
25
  "schema/ai-pricing-revision.schema.json": "sha256:5ddb40c23712c0cec37b733678e4bb34811f5db44a233773c21a7dfaec188375",
26
26
  "schema/ai-runtime-binding.schema.json": "sha256:e86cac2f70a474997bdef1577ca15f22982ec0ce866921df3f763c4d7f7fa191",
27
27
  "schema/ai-runtime-contract.schema.json": "sha256:338fbf576d67934592648aff9a9c8ae05a54993e8080c90172b00f346a15db02",
@@ -53,7 +53,7 @@
53
53
  "schema/secret-reference.schema.json": "sha256:966f7a6d2575b46a4b54804d06dc05c6229ebbcbd9200fe6a6c8d3b4ffb90f9f",
54
54
  "schema/security-scan-input.schema.json": "sha256:9f9c9e6131c1abee454320b77e4332e3780c0c63f108f54f75c93194a32ccff7",
55
55
  "schema/security-verdict.schema.json": "sha256:ec3c2d5c9df3601aeed0909b36c7f427469c7f0eeb3295c5809b96d09bf3fc26",
56
- "schema/transform-report.schema.json": "sha256:821755a9d13be24139b168cc11d494c080194eb5a85950dd4878049a59557cea",
56
+ "schema/transform-report.schema.json": "sha256:815e764445fb41b912d0c0468f00621ad61f941fb4c7b9364e3f204ad47cdf7f",
57
57
  "schema/version-state.schema.json": "sha256:e7c4b2e7b615ebb07f36d0df22ded51b2c9688ef9e9bfe79de1d5cd94de9ae40"
58
58
  },
59
59
  "aiFixtures": {
@@ -71,7 +71,7 @@
71
71
  "fixtures/ai/valid-governance-decision.json": "sha256:b9d4904b8b6df5f652acc68ec7c8716f192f80d23177ae82b0cc26081bbb9d25",
72
72
  "fixtures/ai/valid-inventory.json": "sha256:3bb29df5525c3a69f6c13c203fbd08bb3d493ae5416fdd2f99125c74bbc11759",
73
73
  "fixtures/ai/valid-metering-policy.json": "sha256:73d10929f0232a09d31b263c5bf61f8985c9c629e1e78ea5c867dd919ff95c96",
74
- "fixtures/ai/valid-policy-snapshot.json": "sha256:d4662ec2e5aa5249f4ebec6aa37f384d6c1d2bd596adf9a3374dd185b657539c",
74
+ "fixtures/ai/valid-policy-snapshot.json": "sha256:90cdaf9ee93bd0f601eac700d8a885ec63a2814a48fdcff283fce5845750b186",
75
75
  "fixtures/ai/valid-pricing-revision.json": "sha256:b8a89816a332397257fa0c40e5142ad9f05c9c6cbb92c37ae700f9b61c31fbce",
76
76
  "fixtures/ai/valid-runtime-binding.json": "sha256:df971a518b8e680bb5260e801e7a0b03dd05076aeb11258205ec5ec205719f53",
77
77
  "fixtures/ai/valid-runtime-contract.json": "sha256:ee9b3e810bca14e487d55f171597d570a79801d5aba0a8080951d51d7772c233",
@@ -92,8 +92,8 @@
92
92
  "gen-go/contracts_test.go": "sha256:7c7ee46f2b4277e22b1ee21af9f17d201eb83067c613b049749f932706ed24f8",
93
93
  "gen-go/doc.go": "sha256:c17bc2d39ed175ce7105c68305f8ae7152f659eb7cd187ecceee7698eb3a65dd",
94
94
  "gen-go/error_category.go": "sha256:a8b64524be3716e62ca6016e56f2332a56fa5e16e42647421e516aa01a7d6806",
95
- "gen-go/schema_documents.go": "sha256:10fcbf0966bca7d81fc1456afe8744a94d4ebf7d2863b49e6f4f179cbfb69f7e",
96
- "gen-go/types.go": "sha256:4df0d1c9ba000cad237c3bb37c66ed646b4fc7d0cd41037b49c7264ad4934186",
95
+ "gen-go/schema_documents.go": "sha256:4b9094aaf0acc4bae4b65784954853f0888572a53fa1a1dc354f97c88ded805f",
96
+ "gen-go/types.go": "sha256:b61e41c09988a76c706cbb13c45547234a368f6d1214c86d7fa5ffa0f362a559",
97
97
  "gen-go/version_state.go": "sha256:827f8768359998409b86ea02d9ba1a149981928bae7161e4dc95fe0520ce7410"
98
98
  },
99
99
  "generatedTypeScript": {
@@ -108,7 +108,7 @@
108
108
  "gen-ts/ai-gateway-key-token.ts": "sha256:ff6551ad3332cc665878d7ec93f42ce185c375e637531b2fbc82c697b877e784",
109
109
  "gen-ts/ai-governance-decision.ts": "sha256:cd9f24d6381cffe73f08532cf556eaa9ecb815b23218f7ac504f3bc26e686b2b",
110
110
  "gen-ts/ai-metering-policy.ts": "sha256:dd261d57646a509cd46efaefac4aad58d018c7f7da98326dd8859e4ce951c56a",
111
- "gen-ts/ai-policy-snapshot.ts": "sha256:20e7a5d01d0ff0c00229357db1f15443f3ee876c9d8a6e570b83889846e6cdd9",
111
+ "gen-ts/ai-policy-snapshot.ts": "sha256:05f5cea100e43a5cc6c1e8c7c07edea974ea0e6785730f622e824e40128f1ebc",
112
112
  "gen-ts/ai-pricing-revision.ts": "sha256:48afdea7fb09b9a392147a0a62bcee013157a9d536c07e0782ef28781a3000de",
113
113
  "gen-ts/ai-runtime-binding.ts": "sha256:176c830d400ce44c508f8d249bb3c9724b2d595b78262615487cdafc4790263e",
114
114
  "gen-ts/ai-runtime-contract.ts": "sha256:f34533728dfcf7ce8d2e959b55379650f317a06e29e316caf86e131667891ddc",
@@ -144,7 +144,7 @@
144
144
  "gen-ts/secret-reference.ts": "sha256:a8b65de72705b6f51f57cd8ca58881483108005b1fa4d19106c3e9cf1fa877e7",
145
145
  "gen-ts/security-scan-input.ts": "sha256:5d9bde7394d8b34cca1d36b51ce17bf73cfccd9cfd7cab810f83d4de58f22285",
146
146
  "gen-ts/security-verdict.ts": "sha256:fea950cddbd12fe0218e2573c9a29c6748d56612a464559f1e6d688fa97f68c7",
147
- "gen-ts/transform-report.ts": "sha256:c59e2e3c91c8ef6727a030a0e0763e3b57aa0c80f1873ddcf1a34a3c82cd0f99",
147
+ "gen-ts/transform-report.ts": "sha256:6c54b579884d98135d73945d00980820b136f269622db27fa56a1c4c0e57d3b6",
148
148
  "gen-ts/version-state-machine.ts": "sha256:4371bc7e2bde86b0447f5242104c576cc160dfd7dae1885acbfb63540f230bdd",
149
149
  "gen-ts/version-state.ts": "sha256:a835112930299e7b593a1b8810b7414f6c9e809da2092306c743128170a3b702"
150
150
  }
@@ -109,7 +109,22 @@ export interface AiPolicyModel {
109
109
  export interface AiPolicyPricing {
110
110
  revision: AiPolicyIdentifier;
111
111
  revisionDigest?: AiPolicyDigest;
112
+ /**
113
+ * Input token rate. Applies to noncached text when separate image/cache rates are present; remains the aggregate input rate for legacy pricing.
114
+ */
112
115
  inputMicroUsdPerMillion: number;
116
+ /**
117
+ * Optional noncached image input token rate; falls back to inputMicroUsdPerMillion when absent.
118
+ */
119
+ inputImageMicroUsdPerMillion?: number;
120
+ /**
121
+ * Optional cached text input token rate; falls back to inputMicroUsdPerMillion when absent.
122
+ */
123
+ cachedInputMicroUsdPerMillion?: number;
124
+ /**
125
+ * Optional cached image input token rate; falls back to inputImageMicroUsdPerMillion, then inputMicroUsdPerMillion, when absent.
126
+ */
127
+ cachedInputImageMicroUsdPerMillion?: number;
113
128
  outputMicroUsdPerMillion: number;
114
129
  mediaMicroUsdPerUnit?: {
115
130
  audio_seconds?: number;
@@ -1,7 +1,7 @@
1
- export declare const ContractRepositoryVersion: "0.26.0.0";
2
- export declare const ContractPublishVersion: "0.26.0";
3
- export declare const ContractPublishTag: "v0.26.0";
4
- export declare const ContractSchemasDigest: "sha256:510b57798fd632a4fd34ea7701106b03285c491ab1eddbdef7d1ec0f82d7f70c";
5
- export declare const ContractAiFixturesDigest: "sha256:5d68828a1364dc63cafbb3c2d3f5c5f6c232d5333e7668a9c79e7652e5144b42";
6
- export declare const ContractGeneratedGoDigest: "sha256:02a598e4606a1d24bbfdd881e548128ce9b60c090db7ff98dcee5bfe94b74ad3";
7
- export declare const ContractGeneratedTypeScriptDigest: "sha256:72865190987cb97215b1db19d46e5c54579f2c01677e5b8e5c735df1d669b74b";
1
+ export declare const ContractRepositoryVersion: "0.28.0.0";
2
+ export declare const ContractPublishVersion: "0.28.0";
3
+ export declare const ContractPublishTag: "v0.28.0";
4
+ export declare const ContractSchemasDigest: "sha256:f5fa7ad6b50cdd28fdfbbd594b2c92035052cd1091eed1273586082565da6df4";
5
+ export declare const ContractAiFixturesDigest: "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
6
+ export declare const ContractGeneratedGoDigest: "sha256:b7c2021f907620ab3df9122992f73c25661a2e4e5ae0207cdc000de1d5227b04";
7
+ export declare const ContractGeneratedTypeScriptDigest: "sha256:72c340ec27372dbd65849b677e671f42b2a09dec5e6bc7810d735c6b0c6edcd0";
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
- export const ContractRepositoryVersion = "0.26.0.0";
4
- export const ContractPublishVersion = "0.26.0";
5
- export const ContractPublishTag = "v0.26.0";
6
- export const ContractSchemasDigest = "sha256:510b57798fd632a4fd34ea7701106b03285c491ab1eddbdef7d1ec0f82d7f70c";
7
- export const ContractAiFixturesDigest = "sha256:5d68828a1364dc63cafbb3c2d3f5c5f6c232d5333e7668a9c79e7652e5144b42";
8
- export const ContractGeneratedGoDigest = "sha256:02a598e4606a1d24bbfdd881e548128ce9b60c090db7ff98dcee5bfe94b74ad3";
9
- export const ContractGeneratedTypeScriptDigest = "sha256:72865190987cb97215b1db19d46e5c54579f2c01677e5b8e5c735df1d669b74b";
3
+ export const ContractRepositoryVersion = "0.28.0.0";
4
+ export const ContractPublishVersion = "0.28.0";
5
+ export const ContractPublishTag = "v0.28.0";
6
+ export const ContractSchemasDigest = "sha256:f5fa7ad6b50cdd28fdfbbd594b2c92035052cd1091eed1273586082565da6df4";
7
+ export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
8
+ export const ContractGeneratedGoDigest = "sha256:b7c2021f907620ab3df9122992f73c25661a2e4e5ae0207cdc000de1d5227b04";
9
+ export const ContractGeneratedTypeScriptDigest = "sha256:72c340ec27372dbd65849b677e671f42b2a09dec5e6bc7810d735c6b0c6edcd0";
@@ -66,6 +66,27 @@ export type TransformReport = {
66
66
  * Optional reviewed runtime features selected for the standard application image. The first release supports Chromium for Node runtimes only.
67
67
  */
68
68
  runtimeFeatures?: 'chromium'[];
69
+ /**
70
+ * Optional bounded workload requirements, carried into the deployment plan and artifact. Null or omitted preserves standard HTTP serving. SQS jobs require platform-selected Kubernetes compute.
71
+ */
72
+ workload?: {
73
+ resourceProfile: 'standard' | 'memory-1g';
74
+ backgroundJobs: 'none' | 'sqs';
75
+ } | null;
76
+ /**
77
+ * Build-only bootstrap for authenticated browser validation. Use null when the application does not require a local database user. When local authorization resolves Harbour identity to an application-owned user or membership row, declare an idempotent command that creates the fixed validation identity in the throwaway database. Reuse an existing seed command when available; otherwise add the smallest validation-only script using the application's existing database layer. The command is never run during production deployment.
78
+ */
79
+ validationSeed?: {
80
+ /**
81
+ * @minItems 1
82
+ * @maxItems 64
83
+ */
84
+ command: string[];
85
+ /**
86
+ * Existing application-owned environment variable that receives the trusted browser probe email, for example ADMIN_EMAIL.
87
+ */
88
+ identityEmailEnvironmentVariable: string;
89
+ } | null;
69
90
  buildKind?: 'container' | 'static';
70
91
  topology?: 'static' | 'backend' | 'frontend_and_backend';
71
92
  entrypoint?: string;
@@ -34,6 +34,9 @@
34
34
  "revision": "openai-gpt-4.1-mini-2026-08-01",
35
35
  "revisionDigest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
36
36
  "inputMicroUsdPerMillion": 400000,
37
+ "inputImageMicroUsdPerMillion": 800000,
38
+ "cachedInputMicroUsdPerMillion": 100000,
39
+ "cachedInputImageMicroUsdPerMillion": 0,
37
40
  "outputMicroUsdPerMillion": 1600000,
38
41
  "mediaMicroUsdPerUnit": {
39
42
  "audio_seconds": 4,
@@ -115,7 +115,22 @@ export interface AiPolicyModel {
115
115
  export interface AiPolicyPricing {
116
116
  revision: AiPolicyIdentifier;
117
117
  revisionDigest?: AiPolicyDigest;
118
+ /**
119
+ * Input token rate. Applies to noncached text when separate image/cache rates are present; remains the aggregate input rate for legacy pricing.
120
+ */
118
121
  inputMicroUsdPerMillion: number;
122
+ /**
123
+ * Optional noncached image input token rate; falls back to inputMicroUsdPerMillion when absent.
124
+ */
125
+ inputImageMicroUsdPerMillion?: number;
126
+ /**
127
+ * Optional cached text input token rate; falls back to inputMicroUsdPerMillion when absent.
128
+ */
129
+ cachedInputMicroUsdPerMillion?: number;
130
+ /**
131
+ * Optional cached image input token rate; falls back to inputImageMicroUsdPerMillion, then inputMicroUsdPerMillion, when absent.
132
+ */
133
+ cachedInputImageMicroUsdPerMillion?: number;
119
134
  outputMicroUsdPerMillion: number;
120
135
  mediaMicroUsdPerUnit?: {
121
136
  audio_seconds?: number;
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
- export const ContractRepositoryVersion = "0.26.0.0" as const;
5
- export const ContractPublishVersion = "0.26.0" as const;
6
- export const ContractPublishTag = "v0.26.0" as const;
7
- export const ContractSchemasDigest = "sha256:510b57798fd632a4fd34ea7701106b03285c491ab1eddbdef7d1ec0f82d7f70c" as const;
8
- export const ContractAiFixturesDigest = "sha256:5d68828a1364dc63cafbb3c2d3f5c5f6c232d5333e7668a9c79e7652e5144b42" as const;
9
- export const ContractGeneratedGoDigest = "sha256:02a598e4606a1d24bbfdd881e548128ce9b60c090db7ff98dcee5bfe94b74ad3" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:72865190987cb97215b1db19d46e5c54579f2c01677e5b8e5c735df1d669b74b" as const;
4
+ export const ContractRepositoryVersion = "0.28.0.0" as const;
5
+ export const ContractPublishVersion = "0.28.0" as const;
6
+ export const ContractPublishTag = "v0.28.0" as const;
7
+ export const ContractSchemasDigest = "sha256:f5fa7ad6b50cdd28fdfbbd594b2c92035052cd1091eed1273586082565da6df4" as const;
8
+ export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:b7c2021f907620ab3df9122992f73c25661a2e4e5ae0207cdc000de1d5227b04" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:72c340ec27372dbd65849b677e671f42b2a09dec5e6bc7810d735c6b0c6edcd0" as const;
@@ -69,6 +69,27 @@ export type TransformReport = {
69
69
  * Optional reviewed runtime features selected for the standard application image. The first release supports Chromium for Node runtimes only.
70
70
  */
71
71
  runtimeFeatures?: 'chromium'[];
72
+ /**
73
+ * Optional bounded workload requirements, carried into the deployment plan and artifact. Null or omitted preserves standard HTTP serving. SQS jobs require platform-selected Kubernetes compute.
74
+ */
75
+ workload?: {
76
+ resourceProfile: 'standard' | 'memory-1g';
77
+ backgroundJobs: 'none' | 'sqs';
78
+ } | null;
79
+ /**
80
+ * Build-only bootstrap for authenticated browser validation. Use null when the application does not require a local database user. When local authorization resolves Harbour identity to an application-owned user or membership row, declare an idempotent command that creates the fixed validation identity in the throwaway database. Reuse an existing seed command when available; otherwise add the smallest validation-only script using the application's existing database layer. The command is never run during production deployment.
81
+ */
82
+ validationSeed?: {
83
+ /**
84
+ * @minItems 1
85
+ * @maxItems 64
86
+ */
87
+ command: string[];
88
+ /**
89
+ * Existing application-owned environment variable that receives the trusted browser probe email, for example ADMIN_EMAIL.
90
+ */
91
+ identityEmailEnvironmentVariable: string;
92
+ } | null;
72
93
  buildKind?: 'container' | 'static';
73
94
  topology?: 'static' | 'backend' | 'frontend_and_backend';
74
95
  entrypoint?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.26.0",
3
+ "version": "0.28.0",
4
4
  "description": "Single source of truth for every data shape that crosses a boundary between Harbour components.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -125,7 +125,10 @@
125
125
  "properties": {
126
126
  "revision": { "$ref": "#/definitions/AiPolicyIdentifier" },
127
127
  "revisionDigest": { "$ref": "#/definitions/AiPolicyDigest" },
128
- "inputMicroUsdPerMillion": { "type": "integer", "minimum": 0 },
128
+ "inputMicroUsdPerMillion": { "type": "integer", "minimum": 0, "description": "Input token rate. Applies to noncached text when separate image/cache rates are present; remains the aggregate input rate for legacy pricing." },
129
+ "inputImageMicroUsdPerMillion": { "type": "integer", "minimum": 0, "description": "Optional noncached image input token rate; falls back to inputMicroUsdPerMillion when absent." },
130
+ "cachedInputMicroUsdPerMillion": { "type": "integer", "minimum": 0, "description": "Optional cached text input token rate; falls back to inputMicroUsdPerMillion when absent." },
131
+ "cachedInputImageMicroUsdPerMillion": { "type": "integer", "minimum": 0, "description": "Optional cached image input token rate; falls back to inputImageMicroUsdPerMillion, then inputMicroUsdPerMillion, when absent." },
129
132
  "outputMicroUsdPerMillion": { "type": "integer", "minimum": 0 },
130
133
  "mediaMicroUsdPerUnit": {
131
134
  "type": "object",
@@ -129,6 +129,45 @@
129
129
  },
130
130
  "description": "Optional reviewed runtime features selected for the standard application image. The first release supports Chromium for Node runtimes only."
131
131
  },
132
+ "workload": {
133
+ "description": "Optional bounded workload requirements, carried into the deployment plan and artifact. Null or omitted preserves standard HTTP serving. SQS jobs require platform-selected Kubernetes compute.",
134
+ "anyOf": [
135
+ {
136
+ "type": "object",
137
+ "additionalProperties": false,
138
+ "required": ["resourceProfile", "backgroundJobs"],
139
+ "properties": {
140
+ "resourceProfile": { "type": "string", "enum": ["standard", "memory-1g"] },
141
+ "backgroundJobs": { "type": "string", "enum": ["none", "sqs"] }
142
+ }
143
+ },
144
+ { "type": "null" }
145
+ ]
146
+ },
147
+ "validationSeed": {
148
+ "description": "Build-only bootstrap for authenticated browser validation. Use null when the application does not require a local database user. When local authorization resolves Harbour identity to an application-owned user or membership row, declare an idempotent command that creates the fixed validation identity in the throwaway database. Reuse an existing seed command when available; otherwise add the smallest validation-only script using the application's existing database layer. The command is never run during production deployment.",
149
+ "anyOf": [
150
+ {
151
+ "type": "object",
152
+ "additionalProperties": false,
153
+ "required": ["command", "identityEmailEnvironmentVariable"],
154
+ "properties": {
155
+ "command": {
156
+ "type": "array",
157
+ "minItems": 1,
158
+ "maxItems": 64,
159
+ "items": { "type": "string", "minLength": 1, "maxLength": 1024 }
160
+ },
161
+ "identityEmailEnvironmentVariable": {
162
+ "type": "string",
163
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$",
164
+ "description": "Existing application-owned environment variable that receives the trusted browser probe email, for example ADMIN_EMAIL."
165
+ }
166
+ }
167
+ },
168
+ { "type": "null" }
169
+ ]
170
+ },
132
171
  "buildKind": { "type": "string", "enum": ["container", "static"] },
133
172
  "topology": {
134
173
  "type": "string",