@fourier-labs/harbour-contracts 0.68.0 → 0.69.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.68.0.0",
4
- "publishVersion": "0.68.0",
5
- "publishTag": "v0.68.0",
6
- "schemasDigest": "sha256:3860585b4a4a55334e788faca34018dfaa21bf7ee5fa42bb50b0a454a77047b3",
3
+ "repositoryVersion": "0.69.0.0",
4
+ "publishVersion": "0.69.0",
5
+ "publishTag": "v0.69.0",
6
+ "schemasDigest": "sha256:e21f310517adb289db8b8233fd3c742a711fed8226892591f6581afb8510e30c",
7
7
  "aiFixturesDigest": "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6",
8
- "generatedGoDigest": "sha256:0c97fd145737bf8fba6de780187033f04e52fe524284cd95c084fcda38e31a28",
9
- "generatedTypeScriptDigest": "sha256:bd9927f250e96a91958f078ea29d1420ca3d6545ce93b2b2901033ac09e52827",
8
+ "generatedGoDigest": "sha256:1f793a0d039976e5a9b65a72753928ab68de66d6878c96a6ea242e48a16ca24e",
9
+ "generatedTypeScriptDigest": "sha256:6bdb0271dae8bf7df75f72e61addda29ebb778a054b59c8538d05112000ac0e4",
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)"
@@ -66,8 +66,8 @@
66
66
  "schema/saas-connection.schema.json": "sha256:82ed8018201800a95aa792bde1d22568e86b55b3be926aa094a260c8c78a58d7",
67
67
  "schema/sanitized-binding-evidence.schema.json": "sha256:1191ab88e2764df927e5f17837674cebebe068d480da2b2fdb390e589f96b51f",
68
68
  "schema/secret-reference.schema.json": "sha256:db4e3c2c6a2dbd72d7ea0f9c91cb3b2343a7e67b601996c6818b2ef08e440895",
69
- "schema/security-scan-input-v2.schema.json": "sha256:adf90e7e158e2a29145fa9696219dad82d294cac14614bcd10910a251ebe6940",
70
- "schema/security-verdict.schema.json": "sha256:6650c327b58431c6a567bbbf1e59bb9d4a8dc2f0ff2efc92ca4c2fd5b2cf28b6",
69
+ "schema/security-scan-input-v2.schema.json": "sha256:0d418342078c9b5046ea6f4bef3c2c57539285dfee99cc0850d4f0d03739ee13",
70
+ "schema/security-verdict.schema.json": "sha256:f4a1c109ed27779374c52daccb0a96589613db4f3cf030a8b0e4713bf1b3dbff",
71
71
  "schema/transform-parked-result.schema.json": "sha256:11729980d4c89d4a9e18f5f213232cd3359739c85626b36c20c2a37ba794c9af",
72
72
  "schema/transform-report.schema.json": "sha256:b9b4b09f88714b49d855f01ab9b611f34fb856447c0d063be409bb12a6c2700a",
73
73
  "schema/version-state.schema.json": "sha256:3b190007e2f8e3821c41ef11c6f5b226da7d5a18d34d4077f4618004846fd444",
@@ -112,7 +112,7 @@
112
112
  "gen-go/integration_execute_input_rules.go": "sha256:52a405aa7a97f7b4e2ed3c314a7bd28b7698cc7883ee72ad4c027637be602ab9",
113
113
  "gen-go/integration_execute_input_rules_test.go": "sha256:c437a8406a2f062a0173b9419e4cb176fc6eb54e569506225d5162323f55b40b",
114
114
  "gen-go/schema_documents.go": "sha256:c19c0d540f602ee997a84b90e20702d9bc63ed7d27aec267e76c04655fc182e0",
115
- "gen-go/types.go": "sha256:e700fb22b4e2eb59f8531da4bdac154ac22991f9fd39e72b2f4483e1fa2e0264",
115
+ "gen-go/types.go": "sha256:9e3c05f1fcdd06a0eebfc56fe7ddf4b37c9ddc367822c2d3ec753770a09ee1ae",
116
116
  "gen-go/version_state.go": "sha256:4ef8abb126414c0025cf2c59bc9c79a74ef4a2ff89e8f316cbf05acc872371c1"
117
117
  },
118
118
  "generatedTypeScript": {
@@ -177,8 +177,8 @@
177
177
  "gen-ts/sanitized-binding-digest-helper.ts": "sha256:c47d7fdc20500e2e72c23fe39ecdd610fc397c47fcba51335ebec3c380fe6872",
178
178
  "gen-ts/sanitized-binding-evidence.ts": "sha256:f3fb7b1d7d2e0929eb0ea981eaf32db3104010647185f6ae59f67167d42538a9",
179
179
  "gen-ts/secret-reference.ts": "sha256:731fbcde7315cb4128d5b01bdbe6e6f248f13c7ad8dea04a3a4e927ac4890198",
180
- "gen-ts/security-scan-input-v2.ts": "sha256:ec703b8fe1734a623ce138adc54dc7acbe3b0880e469c70e8bf8f94d7ddb85c2",
181
- "gen-ts/security-verdict.ts": "sha256:c7c4c82183e7996941cee93a9cdb4dcaa8a4dab2d607ce29aab8683ee5ced8eb",
180
+ "gen-ts/security-scan-input-v2.ts": "sha256:cccbfc5dae0ea5a328e6b15525ac190a0aae522e3220dffe7e6c80c445d54610",
181
+ "gen-ts/security-verdict.ts": "sha256:beef7e4e23b385f3b18579f43bb4eb92b19aeef9e5089f3e9a149bf0067be4e8",
182
182
  "gen-ts/transform-parked-result.ts": "sha256:6279e27cee8d75c29f3ede45580fef1daa0ca300867a78e43ead8a7689ec613f",
183
183
  "gen-ts/transform-report.ts": "sha256:d83f1c34c4a082bd80bf9588b08e2fba3b7e25cd1855375ca3073ab9fafddfec",
184
184
  "gen-ts/version-state-machine.ts": "sha256:c67af3e86ac306743345b850dfd3ae5201c19d10c40e2c149cf8c38258320d5f",
@@ -1,7 +1,7 @@
1
- export declare const ContractRepositoryVersion: "0.68.0.0";
2
- export declare const ContractPublishVersion: "0.68.0";
3
- export declare const ContractPublishTag: "v0.68.0";
4
- export declare const ContractSchemasDigest: "sha256:3860585b4a4a55334e788faca34018dfaa21bf7ee5fa42bb50b0a454a77047b3";
1
+ export declare const ContractRepositoryVersion: "0.69.0.0";
2
+ export declare const ContractPublishVersion: "0.69.0";
3
+ export declare const ContractPublishTag: "v0.69.0";
4
+ export declare const ContractSchemasDigest: "sha256:e21f310517adb289db8b8233fd3c742a711fed8226892591f6581afb8510e30c";
5
5
  export declare const ContractAiFixturesDigest: "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
6
- export declare const ContractGeneratedGoDigest: "sha256:0c97fd145737bf8fba6de780187033f04e52fe524284cd95c084fcda38e31a28";
7
- export declare const ContractGeneratedTypeScriptDigest: "sha256:bd9927f250e96a91958f078ea29d1420ca3d6545ce93b2b2901033ac09e52827";
6
+ export declare const ContractGeneratedGoDigest: "sha256:1f793a0d039976e5a9b65a72753928ab68de66d6878c96a6ea242e48a16ca24e";
7
+ export declare const ContractGeneratedTypeScriptDigest: "sha256:6bdb0271dae8bf7df75f72e61addda29ebb778a054b59c8538d05112000ac0e4";
@@ -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.68.0.0";
4
- export const ContractPublishVersion = "0.68.0";
5
- export const ContractPublishTag = "v0.68.0";
6
- export const ContractSchemasDigest = "sha256:3860585b4a4a55334e788faca34018dfaa21bf7ee5fa42bb50b0a454a77047b3";
3
+ export const ContractRepositoryVersion = "0.69.0.0";
4
+ export const ContractPublishVersion = "0.69.0";
5
+ export const ContractPublishTag = "v0.69.0";
6
+ export const ContractSchemasDigest = "sha256:e21f310517adb289db8b8233fd3c742a711fed8226892591f6581afb8510e30c";
7
7
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
8
- export const ContractGeneratedGoDigest = "sha256:0c97fd145737bf8fba6de780187033f04e52fe524284cd95c084fcda38e31a28";
9
- export const ContractGeneratedTypeScriptDigest = "sha256:bd9927f250e96a91958f078ea29d1420ca3d6545ce93b2b2901033ac09e52827";
8
+ export const ContractGeneratedGoDigest = "sha256:1f793a0d039976e5a9b65a72753928ab68de66d6878c96a6ea242e48a16ca24e";
9
+ export const ContractGeneratedTypeScriptDigest = "sha256:6bdb0271dae8bf7df75f72e61addda29ebb778a054b59c8538d05112000ac0e4";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The policy profile is named by the caller when it knows better than the data classification (the kit lane names BASELINE); `profile` and `classification` are mutually exclusive, and both absent still defaults to STANDARD with `classificationDefaulted: true`. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.
2
+ * Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The caller always names the policy profile (governance names BASELINE for the kit lane); there is no classification input and no default profile. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.
3
3
  */
4
4
  export interface SecurityScanInputV2 {
5
5
  schema: 'harbour.security-scan-input/2.0';
@@ -18,13 +18,9 @@ export interface SecurityScanInputV2 {
18
18
  package: PackageSource;
19
19
  execution: Execution;
20
20
  /**
21
- * Policy profile named by the caller. Takes the place of deriving one from `classification`; the verdict echoes the profile evaluated and stamps `classificationDefaulted: false`. Governance names BASELINE for kit-lane scans; the default when nothing is named is STANDARD.
21
+ * Policy profile the machine evaluates the evidence against; the verdict echoes it. Governance names BASELINE for kit-lane scans.
22
22
  */
23
- profile?: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
24
- /**
25
- * Data classification, mapped to a profile as in v1 (GREEN → BASELINE, YELLOW → STANDARD, ORANGE → HIGH, RED → CRITICAL). Not allowed beside `profile`. Absent with no `profile` means STANDARD and `classificationDefaulted: true`; an invalid value fails closed.
26
- */
27
- classification?: 'GREEN' | 'YELLOW' | 'ORANGE' | 'RED';
23
+ profile: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
28
24
  }
29
25
  /**
30
26
  * The bytes `isomorph secure` (or a later console re-run against a deploy upload) put through source intake.
@@ -7,7 +7,7 @@ export interface SecurityVerdict {
7
7
  */
8
8
  outcome: 'PASS' | 'BLOCKED';
9
9
  /**
10
- * Policy profile the evidence was evaluated against: the input's `profile` when the caller named one, else derived from the input classification, else STANDARD.
10
+ * Policy profile the evidence was evaluated against, echoed from the input's `profile`.
11
11
  */
12
12
  profile: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
13
13
  /**
@@ -62,22 +62,28 @@ export interface Finding {
62
62
  * Suggested fix, when the tool provides one.
63
63
  */
64
64
  remediation?: string;
65
+ dependency?: Dependency;
65
66
  /**
66
- * Dependency name, for a dependency-sca finding.
67
+ * Set by policy on every finding it evaluated: true when the finding on its own fires a block rule under the evaluated profile, false when it is reported only.
67
68
  */
68
- package?: string;
69
+ blocking?: boolean;
70
+ }
71
+ /**
72
+ * The dependency a dependency-sca finding is about. Absent on findings that are not about one installed package (secrets, code, a missing lockfile).
73
+ */
74
+ export interface Dependency {
69
75
  /**
70
- * Installed version of `package` the vulnerability applies to.
76
+ * Package name as the lockfile names it.
71
77
  */
72
- installedVersion?: string;
78
+ name: string;
73
79
  /**
74
- * First version of `package` that fixes the vulnerability, when the tool knows one.
80
+ * Version of the package the app installs, which the vulnerability applies to.
75
81
  */
76
- fixedVersion?: string;
82
+ installedVersion: string;
77
83
  /**
78
- * Set by policy on every finding it evaluated: true when the finding on its own fires a block rule under the evaluated profile, false when it is reported only.
84
+ * The one version to upgrade to: the lowest fixed release on the installed version's major line, else the lowest fixed release above the installed version. Absent when no fix above the installed version exists.
79
85
  */
80
- blocking?: boolean;
86
+ fixedVersion?: string;
81
87
  }
82
88
  export interface EvidenceRef {
83
89
  /**
@@ -113,8 +119,4 @@ export interface Provenance {
113
119
  * Orderable release version of the runner image that produced the evidence. Governance compares its numeric core with MINIMUM_SCANNER_VERSION to decide whether a PASS still counts.
114
120
  */
115
121
  scannerVersion: string;
116
- /**
117
- * True iff the input named neither a profile nor a classification and the machine assumed STANDARD (decision 2026-08-27). An invalid classification fails closed and never reaches a verdict.
118
- */
119
- classificationDefaulted: boolean;
120
122
  }
@@ -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.68.0.0" as const;
5
- export const ContractPublishVersion = "0.68.0" as const;
6
- export const ContractPublishTag = "v0.68.0" as const;
7
- export const ContractSchemasDigest = "sha256:3860585b4a4a55334e788faca34018dfaa21bf7ee5fa42bb50b0a454a77047b3" as const;
4
+ export const ContractRepositoryVersion = "0.69.0.0" as const;
5
+ export const ContractPublishVersion = "0.69.0" as const;
6
+ export const ContractPublishTag = "v0.69.0" as const;
7
+ export const ContractSchemasDigest = "sha256:e21f310517adb289db8b8233fd3c742a711fed8226892591f6581afb8510e30c" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:0c97fd145737bf8fba6de780187033f04e52fe524284cd95c084fcda38e31a28" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:bd9927f250e96a91958f078ea29d1420ca3d6545ce93b2b2901033ac09e52827" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:1f793a0d039976e5a9b65a72753928ab68de66d6878c96a6ea242e48a16ca24e" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:6bdb0271dae8bf7df75f72e61addda29ebb778a054b59c8538d05112000ac0e4" as const;
@@ -2,7 +2,7 @@
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
4
  /**
5
- * Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The policy profile is named by the caller when it knows better than the data classification (the kit lane names BASELINE); `profile` and `classification` are mutually exclusive, and both absent still defaults to STANDARD with `classificationDefaulted: true`. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.
5
+ * Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The caller always names the policy profile (governance names BASELINE for the kit lane); there is no classification input and no default profile. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.
6
6
  */
7
7
  export interface SecurityScanInputV2 {
8
8
  schema: 'harbour.security-scan-input/2.0';
@@ -21,13 +21,9 @@ export interface SecurityScanInputV2 {
21
21
  package: PackageSource;
22
22
  execution: Execution;
23
23
  /**
24
- * Policy profile named by the caller. Takes the place of deriving one from `classification`; the verdict echoes the profile evaluated and stamps `classificationDefaulted: false`. Governance names BASELINE for kit-lane scans; the default when nothing is named is STANDARD.
24
+ * Policy profile the machine evaluates the evidence against; the verdict echoes it. Governance names BASELINE for kit-lane scans.
25
25
  */
26
- profile?: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
27
- /**
28
- * Data classification, mapped to a profile as in v1 (GREEN → BASELINE, YELLOW → STANDARD, ORANGE → HIGH, RED → CRITICAL). Not allowed beside `profile`. Absent with no `profile` means STANDARD and `classificationDefaulted: true`; an invalid value fails closed.
29
- */
30
- classification?: 'GREEN' | 'YELLOW' | 'ORANGE' | 'RED';
26
+ profile: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
31
27
  }
32
28
  /**
33
29
  * The bytes `isomorph secure` (or a later console re-run against a deploy upload) put through source intake.
@@ -10,7 +10,7 @@ export interface SecurityVerdict {
10
10
  */
11
11
  outcome: 'PASS' | 'BLOCKED';
12
12
  /**
13
- * Policy profile the evidence was evaluated against: the input's `profile` when the caller named one, else derived from the input classification, else STANDARD.
13
+ * Policy profile the evidence was evaluated against, echoed from the input's `profile`.
14
14
  */
15
15
  profile: 'BASELINE' | 'STANDARD' | 'HIGH' | 'CRITICAL';
16
16
  /**
@@ -65,22 +65,28 @@ export interface Finding {
65
65
  * Suggested fix, when the tool provides one.
66
66
  */
67
67
  remediation?: string;
68
+ dependency?: Dependency;
68
69
  /**
69
- * Dependency name, for a dependency-sca finding.
70
+ * Set by policy on every finding it evaluated: true when the finding on its own fires a block rule under the evaluated profile, false when it is reported only.
70
71
  */
71
- package?: string;
72
+ blocking?: boolean;
73
+ }
74
+ /**
75
+ * The dependency a dependency-sca finding is about. Absent on findings that are not about one installed package (secrets, code, a missing lockfile).
76
+ */
77
+ export interface Dependency {
72
78
  /**
73
- * Installed version of `package` the vulnerability applies to.
79
+ * Package name as the lockfile names it.
74
80
  */
75
- installedVersion?: string;
81
+ name: string;
76
82
  /**
77
- * First version of `package` that fixes the vulnerability, when the tool knows one.
83
+ * Version of the package the app installs, which the vulnerability applies to.
78
84
  */
79
- fixedVersion?: string;
85
+ installedVersion: string;
80
86
  /**
81
- * Set by policy on every finding it evaluated: true when the finding on its own fires a block rule under the evaluated profile, false when it is reported only.
87
+ * The one version to upgrade to: the lowest fixed release on the installed version's major line, else the lowest fixed release above the installed version. Absent when no fix above the installed version exists.
82
88
  */
83
- blocking?: boolean;
89
+ fixedVersion?: string;
84
90
  }
85
91
  export interface EvidenceRef {
86
92
  /**
@@ -116,8 +122,4 @@ export interface Provenance {
116
122
  * Orderable release version of the runner image that produced the evidence. Governance compares its numeric core with MINIMUM_SCANNER_VERSION to decide whether a PASS still counts.
117
123
  */
118
124
  scannerVersion: string;
119
- /**
120
- * True iff the input named neither a profile nor a classification and the machine assumed STANDARD (decision 2026-08-27). An invalid classification fails closed and never reaches a verdict.
121
- */
122
- classificationDefaulted: boolean;
123
125
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.68.0",
3
+ "version": "0.69.0",
4
4
  "description": "Single source of truth for every data shape that crosses a boundary between Isomorph components.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -2,10 +2,10 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/security-scan-input-v2.schema.json",
4
4
  "title": "SecurityScanInputV2",
5
- "description": "Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The policy profile is named by the caller when it knows better than the data classification (the kit lane names BASELINE); `profile` and `classification` are mutually exclusive, and both absent still defaults to STANDARD with `classificationDefaulted: true`. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.",
5
+ "description": "Input to the Security Assurance machine, second shape, replacing security-scan-input.schema.json. V1 scanned a deployed commit located through the deployment state; v2 scans exactly one thing: an uploaded package that governance validated at source intake, identified by the zip sha256 the stager verifies before extraction and by the tree digest governance computed from the unzipped bytes (`sourceDigestOf`, `sha256:`-prefixed), which keys the governance scan record and the check report on the laptop. Commit-mode and ARTIFACT-phase inputs are deliberately absent: the console's later on-demand scan uses this same package path against the deploy upload, and the Transform lane runs the scanner in-process; an image scan, if it returns, is an additive v3. The caller always names the policy profile (governance names BASELINE for the kit lane); there is no classification input and no default profile. Nothing here carries a scanner version: the scanner stamps its own into verdict provenance, and governance decides validity by comparing that against its MINIMUM_SCANNER_VERSION. `org`/`app` are the tenant and app ids for kit apps; `env` stays required because the evidence key carries it (governance passes `preview` for a package scan; promotion never re-scans). The `execution` block names the tenant's execution-account scanner, invoke role and artifacts bucket, resolved by governance the way admission resolves them for the deploy machine.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
- "required": ["schema", "org", "app", "env", "package", "execution"],
8
+ "required": ["schema", "org", "app", "env", "package", "execution", "profile"],
9
9
  "properties": {
10
10
  "schema": { "type": "string", "const": "harbour.security-scan-input/2.0" },
11
11
  "org": { "type": "string", "minLength": 1, "description": "Isomorph organization id (the governance tenant id for kit apps), e.g. fourier." },
@@ -20,15 +20,9 @@
20
20
  "profile": {
21
21
  "type": "string",
22
22
  "enum": ["BASELINE", "STANDARD", "HIGH", "CRITICAL"],
23
- "description": "Policy profile named by the caller. Takes the place of deriving one from `classification`; the verdict echoes the profile evaluated and stamps `classificationDefaulted: false`. Governance names BASELINE for kit-lane scans; the default when nothing is named is STANDARD."
24
- },
25
- "classification": {
26
- "type": "string",
27
- "enum": ["GREEN", "YELLOW", "ORANGE", "RED"],
28
- "description": "Data classification, mapped to a profile as in v1 (GREEN → BASELINE, YELLOW → STANDARD, ORANGE → HIGH, RED → CRITICAL). Not allowed beside `profile`. Absent with no `profile` means STANDARD and `classificationDefaulted: true`; an invalid value fails closed."
23
+ "description": "Policy profile the machine evaluates the evidence against; the verdict echoes it. Governance names BASELINE for kit-lane scans."
29
24
  }
30
25
  },
31
- "not": { "required": ["profile", "classification"] },
32
26
  "definitions": {
33
27
  "PackageSource": {
34
28
  "type": "object",
@@ -15,7 +15,7 @@
15
15
  "profile": {
16
16
  "type": "string",
17
17
  "enum": ["BASELINE", "STANDARD", "HIGH", "CRITICAL"],
18
- "description": "Policy profile the evidence was evaluated against: the input's `profile` when the caller named one, else derived from the input classification, else STANDARD."
18
+ "description": "Policy profile the evidence was evaluated against, echoed from the input's `profile`."
19
19
  },
20
20
  "reason": {
21
21
  "type": "string",
@@ -60,12 +60,21 @@
60
60
  "line": { "type": "integer", "minimum": 1, "description": "1-based line number, when the finding is line-anchored." },
61
61
  "message": { "type": "string", "minLength": 1, "description": "Human-readable finding description. Secret values are never included — only locations." },
62
62
  "remediation": { "type": "string", "description": "Suggested fix, when the tool provides one." },
63
- "package": { "type": "string", "minLength": 1, "description": "Dependency name, for a dependency-sca finding." },
64
- "installedVersion": { "type": "string", "minLength": 1, "description": "Installed version of `package` the vulnerability applies to." },
65
- "fixedVersion": { "type": "string", "minLength": 1, "description": "First version of `package` that fixes the vulnerability, when the tool knows one." },
63
+ "dependency": { "$ref": "#/definitions/Dependency" },
66
64
  "blocking": { "type": "boolean", "description": "Set by policy on every finding it evaluated: true when the finding on its own fires a block rule under the evaluated profile, false when it is reported only." }
67
65
  }
68
66
  },
67
+ "Dependency": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["name", "installedVersion"],
71
+ "properties": {
72
+ "name": { "type": "string", "minLength": 1, "description": "Package name as the lockfile names it." },
73
+ "installedVersion": { "type": "string", "minLength": 1, "description": "Version of the package the app installs, which the vulnerability applies to." },
74
+ "fixedVersion": { "type": "string", "minLength": 1, "description": "The one version to upgrade to: the lowest fixed release on the installed version's major line, else the lowest fixed release above the installed version. Absent when no fix above the installed version exists." }
75
+ },
76
+ "description": "The dependency a dependency-sca finding is about. Absent on findings that are not about one installed package (secrets, code, a missing lockfile)."
77
+ },
69
78
  "EvidenceRef": {
70
79
  "type": "object",
71
80
  "additionalProperties": false,
@@ -78,7 +87,7 @@
78
87
  "Provenance": {
79
88
  "type": "object",
80
89
  "additionalProperties": false,
81
- "required": ["org", "app", "env", "snapshotSha256", "scannedAt", "toolManifestDigest", "scannerVersion", "classificationDefaulted"],
90
+ "required": ["org", "app", "env", "snapshotSha256", "scannedAt", "toolManifestDigest", "scannerVersion"],
82
91
  "properties": {
83
92
  "org": { "type": "string", "minLength": 1 },
84
93
  "app": { "type": "string", "minLength": 1 },
@@ -102,10 +111,6 @@
102
111
  "type": "string",
103
112
  "pattern": "^v?\\d+\\.\\d+\\.\\d+(?:[-+].*)?$",
104
113
  "description": "Orderable release version of the runner image that produced the evidence. Governance compares its numeric core with MINIMUM_SCANNER_VERSION to decide whether a PASS still counts."
105
- },
106
- "classificationDefaulted": {
107
- "type": "boolean",
108
- "description": "True iff the input named neither a profile nor a classification and the machine assumed STANDARD (decision 2026-08-27). An invalid classification fails closed and never reaches a verdict."
109
114
  }
110
115
  }
111
116
  }