@fourier-labs/harbour-contracts 0.57.0 → 0.59.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.
Files changed (63) hide show
  1. package/README.md +5 -5
  2. package/contract-release.json +46 -46
  3. package/dist/gen-ts/ai-callsite-inventory.d.ts +1 -1
  4. package/dist/gen-ts/ai-gateway-key-lookup.d.ts +1 -1
  5. package/dist/gen-ts/ai-policy-snapshot.d.ts +1 -1
  6. package/dist/gen-ts/ai-runtime-binding.d.ts +1 -1
  7. package/dist/gen-ts/app-integrations-declaration.d.ts +3 -3
  8. package/dist/gen-ts/contract-release.d.ts +6 -6
  9. package/dist/gen-ts/contract-release.js +6 -6
  10. package/dist/gen-ts/data-dependency.d.ts +2 -2
  11. package/dist/gen-ts/data-source.d.ts +1 -1
  12. package/dist/gen-ts/deployment-environment.d.ts +1 -1
  13. package/dist/gen-ts/deployment-status-response.d.ts +1 -1
  14. package/dist/gen-ts/integration-error-details.d.ts +2 -2
  15. package/dist/gen-ts/integration-execute-input-rules.d.ts +1 -1
  16. package/dist/gen-ts/integration-execute-input-rules.js +1 -1
  17. package/dist/gen-ts/integration-execute-request.d.ts +2 -0
  18. package/dist/gen-ts/kit-bundle-manifest.d.ts +3 -3
  19. package/dist/gen-ts/kit-lock.d.ts +5 -5
  20. package/dist/gen-ts/security-scan-input.d.ts +3 -3
  21. package/dist/gen-ts/security-verdict.d.ts +2 -2
  22. package/dist/gen-ts/transform-report.d.ts +11 -11
  23. package/dist/gen-ts/well-defined-app-manifest.d.ts +4 -4
  24. package/dist/resolver/index.d.ts +1 -1
  25. package/dist/resolver/index.js +1 -1
  26. package/gen-ts/ai-callsite-inventory.ts +1 -1
  27. package/gen-ts/ai-gateway-key-lookup.ts +1 -1
  28. package/gen-ts/ai-policy-snapshot.ts +1 -1
  29. package/gen-ts/ai-runtime-binding.ts +1 -1
  30. package/gen-ts/app-integrations-declaration.ts +3 -3
  31. package/gen-ts/contract-release.ts +6 -6
  32. package/gen-ts/data-dependency.ts +2 -2
  33. package/gen-ts/data-source.ts +1 -1
  34. package/gen-ts/deployment-environment.ts +1 -1
  35. package/gen-ts/deployment-status-response.ts +1 -1
  36. package/gen-ts/integration-error-details.ts +2 -2
  37. package/gen-ts/integration-execute-input-rules.ts +1 -1
  38. package/gen-ts/integration-execute-request.ts +2 -0
  39. package/gen-ts/kit-bundle-manifest.ts +3 -3
  40. package/gen-ts/kit-lock.ts +5 -5
  41. package/gen-ts/security-scan-input.ts +3 -3
  42. package/gen-ts/security-verdict.ts +2 -2
  43. package/gen-ts/transform-report.ts +11 -11
  44. package/gen-ts/well-defined-app-manifest.ts +4 -4
  45. package/package.json +2 -2
  46. package/schema/ai-callsite-inventory.schema.json +1 -1
  47. package/schema/ai-gateway-key-lookup.schema.json +1 -1
  48. package/schema/ai-policy-snapshot.schema.json +1 -1
  49. package/schema/ai-runtime-binding.schema.json +1 -1
  50. package/schema/app-integrations-declaration.schema.json +8 -7
  51. package/schema/data-dependency.schema.json +2 -2
  52. package/schema/data-source.schema.json +1 -1
  53. package/schema/deployment-environment.schema.json +1 -1
  54. package/schema/deployment-status-response.schema.json +1 -1
  55. package/schema/error-category.enum.json +9 -9
  56. package/schema/integration-error-details.schema.json +2 -2
  57. package/schema/integration-execute-request.schema.json +3 -1
  58. package/schema/kit-bundle-manifest.schema.json +6 -6
  59. package/schema/kit-lock.schema.json +6 -6
  60. package/schema/security-scan-input.schema.json +3 -3
  61. package/schema/security-verdict.schema.json +2 -2
  62. package/schema/transform-report.schema.json +11 -11
  63. package/schema/well-defined-app-manifest.schema.json +5 -5
@@ -2,12 +2,12 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/app-integrations-declaration.schema.json",
4
4
  "title": "AppIntegrationsDeclaration",
5
- "description": "Committed `.harbour/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (six operations). Each operation carries a fixed identity mode — slack.channel.history=user, gmail.thread.list=user, gmail.message.read=user, gmail.message.send=user, warehouse.view.read=app — except slack.message.post, whose mode the app DECLARES: `app` posts as the company's Slack app (the one audited bot identity, under the IT-approved per-app display name when the connection declares `presentation`), `user` posts as the signed-in person after their own consent. The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each slack.message.post call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack and Gmail operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads plus one send); its single resource is the fixed `inbox` alias. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.",
5
+ "description": "Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (six operations). Each operation carries a fixed identity mode — slack.channel.history=user, gmail.thread.list=user, gmail.message.read=user, gmail.message.send=user, warehouse.view.read=app — except slack.message.post, whose mode the app DECLARES: `app` posts as the company's Slack app (the one audited bot identity, under the IT-approved per-app display name when the connection declares `presentation`), `user` posts as the signed-in person after their own consent. The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each slack.message.post call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack and Gmail operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads plus one send); its single resource is the fixed `inbox` alias. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["schema", "connections"],
9
9
  "properties": {
10
- "schema": { "type": "string", "const": "harbour.app-integrations/2.0" },
10
+ "schema": { "type": "string", "const": "isomorph.app-integrations/2.0" },
11
11
  "connections": {
12
12
  "type": "object",
13
13
  "minProperties": 1,
@@ -56,8 +56,8 @@
56
56
  },
57
57
  "ColumnName": {
58
58
  "type": "string",
59
- "pattern": "^[A-Za-z_][A-Za-z0-9_]{0,62}$",
60
- "description": "A plain column identifier of a warehouse view."
59
+ "pattern": "^(?:\\*|[A-Za-z_][A-Za-z0-9_]{0,62})$",
60
+ "description": "A plain warehouse column identifier, or `*` as the sole selection when IT exposed all current and future columns."
61
61
  },
62
62
  "ResourceNames": {
63
63
  "type": "array",
@@ -74,7 +74,8 @@
74
74
  "type": "array",
75
75
  "minItems": 1,
76
76
  "maxItems": 32,
77
- "items": { "$ref": "#/definitions/ColumnName" }
77
+ "items": { "$ref": "#/definitions/ColumnName" },
78
+ "not": { "allOf": [{ "contains": { "const": "*" } }, { "minItems": 2 }] }
78
79
  }
79
80
  }
80
81
  },
@@ -147,7 +148,7 @@
147
148
  },
148
149
  "examples": [
149
150
  {
150
- "schema": "harbour.app-integrations/2.0",
151
+ "schema": "isomorph.app-integrations/2.0",
151
152
  "connections": {
152
153
  "company-slack": {
153
154
  "kind": "saas",
@@ -177,7 +178,7 @@
177
178
  }
178
179
  },
179
180
  {
180
- "schema": "harbour.app-integrations/2.0",
181
+ "schema": "isomorph.app-integrations/2.0",
181
182
  "connections": {
182
183
  "company-slack": {
183
184
  "kind": "saas",
@@ -30,7 +30,7 @@
30
30
  "DataDependencyKind": {
31
31
  "type": "string",
32
32
  "enum": ["database", "api", "app_owned_external"],
33
- "description": "database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside Harbour."
33
+ "description": "database = a SQL/warehouse connection; api = an HTTP(S) service; app_owned_external = infrastructure the app owns outside Isomorph."
34
34
  },
35
35
  "DataDependencyIdentifiers": {
36
36
  "type": "object",
@@ -65,7 +65,7 @@
65
65
  "DataDependencyClassification": {
66
66
  "type": "string",
67
67
  "enum": ["matched", "out_of_scope", "unknown", "inventory", "app_owned_external"],
68
- "description": "matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside Harbour's remit."
68
+ "description": "matched = resolved to a registered source; out_of_scope = resolved but not requestable; unknown = unresolvable; inventory = registered but unused; app_owned_external = app-owned, outside Isomorph's remit."
69
69
  },
70
70
  "DataDependencyOrigin": {
71
71
  "type": "string",
@@ -126,7 +126,7 @@
126
126
  "DataSourceProvisioningMode": {
127
127
  "type": "string",
128
128
  "enum": ["byo", "harbour_managed"],
129
- "description": "byo = admin brought existing infrastructure; harbour_managed = Harbour provisioned it."
129
+ "description": "byo = admin brought existing infrastructure; harbour_managed = Isomorph provisioned it."
130
130
  },
131
131
  "DataSourceStatus": {
132
132
  "type": "string",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/deployment-environment.schema.json",
4
4
  "title": "DeploymentEnvironment",
5
- "description": "Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through Harbour's human-merge promotion flow.",
5
+ "description": "Public environment accepted by the preview deployment-control-plane APIs. The MVP accepts only preview; production remains reachable only through Isomorph's human-merge promotion flow.",
6
6
  "type": "string",
7
7
  "enum": ["preview"],
8
8
  "examples": ["preview"]
@@ -122,7 +122,7 @@
122
122
  "type": "object",
123
123
  "additionalProperties": false,
124
124
  "required": ["account", "region"],
125
- "description": "The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means harbour-managed — the same convention the record itself uses — so every pre-destination version simply omits it. Deliberately only account and region: the record's roleArn/externalId are how the pipeline gets into the account, not where the deploy landed, and no status consumer needs them.",
125
+ "description": "The customer account and region this version deploys into, stamped on the version record at admission for customer-account (BYOC) tenants. Absent means Isomorph-managed — the same convention the record itself uses — so every pre-destination version simply omits it. Deliberately only account and region: the record's roleArn/externalId are how the pipeline gets into the account, not where the deploy landed, and no status consumer needs them.",
126
126
  "properties": {
127
127
  "account": {
128
128
  "type": "string",
@@ -13,16 +13,16 @@
13
13
  },
14
14
  "x-registry": [
15
15
  { "id": "intake.no-entrypoint", "retryable": false, "description": "No detectable app entrypoint in the repo." },
16
- { "id": "intake.unsupported-runtime", "retryable": false, "description": "Detected runtime has no Harbour build recipe." },
16
+ { "id": "intake.unsupported-runtime", "retryable": false, "description": "Detected runtime has no Isomorph build recipe." },
17
17
  { "id": "intake.attestation-missing", "retryable": false, "description": "Required auth attestation absent." },
18
18
  { "id": "intake.multi-app-repo", "retryable": false, "description": "Repo contains more than one deployable app." },
19
- { "id": "intake.source-invalid", "retryable": false, "description": "The submitted source tree fails its own clean install, build, import, boot, schema-presence, or pristine-lineage checks before Harbour transformation begins." },
19
+ { "id": "intake.source-invalid", "retryable": false, "description": "The submitted source tree fails its own clean install, build, import, boot, schema-presence, or pristine-lineage checks before Isomorph transformation begins." },
20
20
  { "id": "secrets.unresolvable", "retryable": false, "retired": true, "description": "RETIRED 2026-08-08 and no longer emittable: the secret-materializer stack, its reconciler and the secret-reference playbook were all removed, so nothing can reach this state. Kept rather than deleted because historical failure records still carry it and a dropped id would decode to nothing. Do not emit in new code." },
21
21
  { "id": "secrets.reference-unresolvable", "retryable": false, "description": "A governance secret reference supplied on the deploy request could not be resolved to a stored value — the secret does not exist, the read was denied, or the secretref:// URI is malformed. Not retryable: no amount of waiting produces the value, a human must set it (or fix the reference) before the deploy can proceed." },
22
22
  { "id": "secrets.placeholder-unresolved", "retryable": false, "description": "The built workspace still contains a ${HARBOUR_REDACTED_<KEY>} substitution placeholder after transformation, meaning the transform never converted it into a runtime secret lookup and the artifact would ship a literal placeholder where a secret belongs. Not retryable: the workspace is already built, so the same input yields the same placeholder until the transform is corrected." },
23
23
  { "id": "secrets.leaked-in-artifact", "retryable": false, "description": "Artifact secret scan found a plaintext secret in the built image (belt-and-suspenders)." },
24
24
  { "id": "storage.sqlite-misclassified", "retryable": false, "description": "SQLite usage not resolvable to a managed binding." },
25
- { "id": "storage.unsupported-engine", "retryable": false, "family": true, "description": "Storage engine with no Harbour mapping; concrete token names the engine, e.g. storage.unsupported-engine.mongodb." },
25
+ { "id": "storage.unsupported-engine", "retryable": false, "family": true, "description": "Storage engine with no Isomorph mapping; concrete token names the engine, e.g. storage.unsupported-engine.mongodb." },
26
26
  { "id": "storage.mapping-drift", "retryable": false, "description": "Declared storage binding diverged from detected usage." },
27
27
  { "id": "storage.unavailable", "retryable": true, "description": "The platform's shared application database could not be reached while preparing or provisioning the deploy — e.g. the Aurora cluster dial timing out during a scale-from-zero cold start. Says nothing about the app, so it IS retryable: the same deploy submitted again is expected to succeed once the database is awake. Previously surfaced as uncategorized.deploy (errorType wrapError)." },
28
28
  { "id": "ai.plan-blocked", "retryable": false, "description": "The governance control plane's AI PLAN verdict was BLOCKED: the app makes AI calls that cannot be governed as the tenant is configured today — no provider connected or enabled, no credential, no budget, an SDK or provider the gateway cannot intercept, or a scan that could not cover the whole app. The analyzer's maker message carries the plain-English reason and the governance reason codes. NOT retryable: the same deploy re-earns the same verdict until a person changes the tenant's AI configuration or the app. Previously surfaced as uncategorized.deploy (errorType wrapError)." },
@@ -30,16 +30,16 @@
30
30
  { "id": "transform.attempts-exhausted", "retryable": false, "description": "The bounded transformation attempt count was exhausted before a passing candidate was found." },
31
31
  { "id": "transform.non-retryable", "retryable": false, "retired": true, "description": "RETIRED 2026-09-06. Historical agent declines used a prose-derived suffix in this family. New reports must select one of the fixed structured categories below." },
32
32
  { "id": "transform.validation-failed", "retryable": true, "description": "Transform candidate failed validation with iterable feedback; re-enters TRANSFORMING while deadline remains." },
33
- { "id": "auth.validation-seed-unsupported", "retryable": false, "description": "The application requires authenticated validation setup that Harbour cannot express with its supported validation seed contract." },
34
- { "id": "auth.identity-entity-unresolvable", "retryable": false, "description": "The application identity model cannot deterministically resolve the trusted Harbour subject to one application entity." },
35
- { "id": "dependency.python-runtime-unsupported", "retryable": false, "description": "The application requires a Python minor version for which Harbour has no approved resolver and runtime image." },
33
+ { "id": "auth.validation-seed-unsupported", "retryable": false, "description": "The application requires authenticated validation setup that Isomorph cannot express with its supported validation seed contract." },
34
+ { "id": "auth.identity-entity-unresolvable", "retryable": false, "description": "The application identity model cannot deterministically resolve the trusted Isomorph subject to one application entity." },
35
+ { "id": "dependency.python-runtime-unsupported", "retryable": false, "description": "The application requires a Python minor version for which Isomorph has no approved resolver and runtime image." },
36
36
  { "id": "dependency.resolver-unavailable", "retryable": true, "description": "The approved dependency resolver image or restricted registry lane was unavailable." },
37
37
  { "id": "dependency.resolution-failed", "retryable": false, "description": "The application dependency manifest could not be resolved by its approved package manager." },
38
38
  { "id": "dependency.lockfile-stale", "retryable": false, "description": "The final dependency manifest and lockfile disagree after dependency resolution." },
39
- { "id": "aurora.bundle-invalid", "retryable": false, "description": "The candidate's Harbour-managed Aurora migration bundle is missing, malformed, or inconsistent." },
40
- { "id": "capability.unsupported", "retryable": false, "description": "A required application capability has no supported equivalent under the Harbour platform contract." },
39
+ { "id": "aurora.bundle-invalid", "retryable": false, "description": "The candidate's Isomorph-managed Aurora migration bundle is missing, malformed, or inconsistent." },
40
+ { "id": "capability.unsupported", "retryable": false, "description": "A required application capability has no supported equivalent under the Isomorph platform contract." },
41
41
  { "id": "frontend.env-inlined-unfixable", "retryable": false, "description": "Client code inlined build-time env/self-URLs in a way transformation cannot rewrite." },
42
- { "id": "build.recipe-failed", "retryable": false, "description": "The Harbour build recipe failed for the detected runtime." },
42
+ { "id": "build.recipe-failed", "retryable": false, "description": "The Isomorph build recipe failed for the detected runtime." },
43
43
  { "id": "build.image-too-large", "retryable": false, "description": "Built image exceeded the size limit." },
44
44
  { "id": "browser.probe-failed", "retryable": true, "description": "The app built and produced its declared outputs, but the browser probe found it does not serve them — typically assets emitted at the root instead of under the app base path. Retryable because it is fed back to the transform agent, which is the component that can fix it; the merged job retries in-loop and the state machine retries the job. Distinct from build.recipe-failed, which means the build itself did not succeed: here it did." },
45
45
  { "id": "browser.probe-unavailable", "retryable": false, "description": "The browser probe could not reach a verdict — Chromium crashed or disconnected, or it wrote no result document. Says nothing about the app, so it is not fed back to the agent. Replaces the uncategorized.browser-probe token the merged job emitted while this entry did not exist." },
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/integration-error-details.schema.json",
4
4
  "title": "IntegrationErrorDetails",
5
- "description": "The `error` member of an integration failure response `{error, requestId}` on the execute/connect routes; the SDK maps it onto HarbourError(category, message, details). `category` is the app-SDK HarbourErrorCategory (not the deployment pipeline's dot-path error-category registry), with the HTTP status fixed per category: 401 AUTH_REQUIRED, 403 FORBIDDEN (denied/revoked/expired), 404 NOT_FOUND (unknown app/connection/resource), 409 CONFLICT (pending provisioning/consent/concurrent request), 400 or 413 VALIDATION_FAILED (invalid input / size overflow), 429 RATE_LIMITED (+ Retry-After header), 503 UNAVAILABLE. `details.code` is the closed stable reason set; `message` is human-facing and never carries provider error bodies, tokens or SQL.",
5
+ "description": "The `error` member of an integration failure response `{error, requestId}` on the execute/connect routes; the SDK maps it onto IsomorphError(category, message, details). `category` is the app-SDK IsomorphErrorCategory (not the deployment pipeline's dot-path error-category registry), with the HTTP status fixed per category: 401 AUTH_REQUIRED, 403 FORBIDDEN (denied/revoked/expired), 404 NOT_FOUND (unknown app/connection/resource), 409 CONFLICT (pending provisioning/consent/concurrent request), 400 or 413 VALIDATION_FAILED (invalid input / size overflow), 429 RATE_LIMITED (+ Retry-After header), 503 UNAVAILABLE. `details.code` is the closed stable reason set; `message` is human-facing and never carries provider error bodies, tokens or SQL.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["category", "message", "details"],
@@ -28,7 +28,7 @@
28
28
  "IntegrationErrorCategory": {
29
29
  "type": "string",
30
30
  "enum": ["AUTH_REQUIRED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "VALIDATION_FAILED", "RATE_LIMITED", "UNAVAILABLE"],
31
- "description": "App-SDK HarbourErrorCategory values an integration route may emit; INTERNAL is reserved for the transport."
31
+ "description": "App-SDK IsomorphErrorCategory values an integration route may emit; INTERNAL is reserved for the transport."
32
32
  },
33
33
  "IntegrationErrorCode": {
34
34
  "type": "string",
@@ -26,7 +26,9 @@
26
26
  "type": "array",
27
27
  "minItems": 1,
28
28
  "maxItems": 32,
29
- "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/ColumnName" }
29
+ "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/ColumnName" },
30
+ "not": { "allOf": [{ "contains": { "const": "*" } }, { "minItems": 2 }] },
31
+ "description": "Explicit columns, or `*` alone when the app's approved resource grant allows all current and future columns."
30
32
  }
31
33
  }
32
34
  },
@@ -7,14 +7,14 @@
7
7
  "additionalProperties": false,
8
8
  "required": ["schema", "kitVersion", "sdk", "images", "brief", "declarationSchema"],
9
9
  "properties": {
10
- "schema": { "type": "string", "const": "harbour.kit-bundle/1.0" },
10
+ "schema": { "type": "string", "const": "isomorph.kit-bundle/1.0" },
11
11
  "kitVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$", "description": "The CLI package version that published this bundle." },
12
12
  "sdk": {
13
13
  "type": "object",
14
14
  "additionalProperties": false,
15
15
  "required": ["package", "tarballSha256"],
16
16
  "properties": {
17
- "package": { "type": "string", "const": "@harbour/app-sdk" },
17
+ "package": { "type": "string", "const": "@isomorph.ai/app-sdk" },
18
18
  "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$", "description": "The SDK package version the tarball was packed from (informational; compatibility is decided by tarballSha256)." },
19
19
  "tarballSha256": { "$ref": "#/definitions/HexSha256", "description": "SHA-256 of the SDK tarball baked into this bundle; the CodeBuild gate compares it with the pipeline's own tarball." },
20
20
  "url": { "type": "string", "pattern": "^https://[^\\s{}]+$", "maxLength": 2048, "description": "Where the CLI downloads the SDK tarball from when it is not shipped inline; the bytes are verified against tarballSha256 before install. The publisher may name the location by content address (for example an OCI blob whose path ends in sha256:<tarballSha256>)." }
@@ -51,7 +51,7 @@
51
51
  }
52
52
  }
53
53
  },
54
- "declarationSchema": { "type": "string", "const": "harbour.app-integrations/2.0" }
54
+ "declarationSchema": { "type": "string", "const": "isomorph.app-integrations/2.0" }
55
55
  },
56
56
  "definitions": {
57
57
  "HexSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
@@ -73,10 +73,10 @@
73
73
  },
74
74
  "examples": [
75
75
  {
76
- "schema": "harbour.kit-bundle/1.0",
76
+ "schema": "isomorph.kit-bundle/1.0",
77
77
  "kitVersion": "0.2.0",
78
78
  "sdk": {
79
- "package": "@harbour/app-sdk",
79
+ "package": "@isomorph.ai/app-sdk",
80
80
  "version": "1.0.0",
81
81
  "tarballSha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
82
82
  "url": "https://public.ecr.aws/v2/y6t4p3i8/harbour-kit-bundle/blobs/sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
@@ -86,7 +86,7 @@
86
86
  "sessionFixture": "123456789012.dkr.ecr.us-east-1.amazonaws.com/harbour/session-fixture@sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"
87
87
  },
88
88
  "brief": { "fingerprint": "unknown" },
89
- "declarationSchema": "harbour.app-integrations/2.0"
89
+ "declarationSchema": "isomorph.app-integrations/2.0"
90
90
  }
91
91
  ]
92
92
  }
@@ -2,12 +2,12 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/kit-lock.schema.json",
4
4
  "title": "KitLock",
5
- "description": "Committed `.harbour/kit.lock.json`: which app and tenant a kit-built app belongs to and the exact bundle it was developed against. The data-plane vendorAppSDK gate reads bundle.sdk.tarballSha256 and fails with kit_bundle_incompatible (naming both digests) when it differs from the baked tarball; apps without a kit.lock keep the existing path.",
5
+ "description": "Committed `.isomorph/kit.lock.json`: which app and tenant a kit-built app belongs to and the exact bundle it was developed against. The data-plane vendorAppSDK gate reads bundle.sdk.tarballSha256 and fails with kit_bundle_incompatible (naming both digests) when it differs from the baked tarball; apps without a kit.lock keep the existing path.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["schema", "appId", "tenantId", "bundle", "createdAt", "updatedAt"],
9
9
  "properties": {
10
- "schema": { "type": "string", "const": "harbour.kit-lock/1.0" },
10
+ "schema": { "type": "string", "const": "isomorph.kit-lock/1.0" },
11
11
  "appId": { "type": "string", "pattern": "^app-[0-9a-f]{8,}$" },
12
12
  "tenantId": { "type": "string", "minLength": 1, "maxLength": 128 },
13
13
  "bundle": { "$ref": "kit-bundle-manifest.schema.json" },
@@ -16,19 +16,19 @@
16
16
  },
17
17
  "examples": [
18
18
  {
19
- "schema": "harbour.kit-lock/1.0",
19
+ "schema": "isomorph.kit-lock/1.0",
20
20
  "appId": "app-1f2e3d4c",
21
21
  "tenantId": "fourier",
22
22
  "bundle": {
23
- "schema": "harbour.kit-bundle/1.0",
23
+ "schema": "isomorph.kit-bundle/1.0",
24
24
  "kitVersion": "0.2.0",
25
- "sdk": { "package": "@harbour/app-sdk", "tarballSha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" },
25
+ "sdk": { "package": "@isomorph.ai/app-sdk", "tarballSha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" },
26
26
  "images": {
27
27
  "appGateway": "123456789012.dkr.ecr.us-east-1.amazonaws.com/harbour/app-gateway@sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
28
28
  "sessionFixture": "123456789012.dkr.ecr.us-east-1.amazonaws.com/harbour/session-fixture@sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"
29
29
  },
30
30
  "brief": { "fingerprint": "unknown" },
31
- "declarationSchema": "harbour.app-integrations/2.0"
31
+ "declarationSchema": "isomorph.app-integrations/2.0"
32
32
  },
33
33
  "createdAt": "2026-09-09T08:00:00Z",
34
34
  "updatedAt": "2026-09-09T08:00:00Z"
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/security-scan-input.schema.json",
4
4
  "title": "SecurityScanInput",
5
- "description": "Input to the Harbour Security Assurance machine (Security Assurance LLD §2). SOURCE (M1) scans an ingested commit; ARTIFACT (M2) scans built outputs — a container image digest, a deployable bundle, and/or synthesized infrastructure — named directly by the caller. `commit` is the identity being scanned; `org/app/env` locate the snapshot (the control-state table has no commit GSI, so a bare commit is not resolvable); `branch` is caller-supplied provenance. When phase is ARTIFACT at least one of `imageDigest`, `bundleRef`, or `infraRefs` must be present.",
5
+ "description": "Input to the Isomorph Security Assurance machine (Security Assurance LLD §2). SOURCE (M1) scans an ingested commit; ARTIFACT (M2) scans built outputs — a container image digest, a deployable bundle, and/or synthesized infrastructure — named directly by the caller. `commit` is the identity being scanned; `org/app/env` locate the snapshot (the control-state table has no commit GSI, so a bare commit is not resolvable); `branch` is caller-supplied provenance. When phase is ARTIFACT at least one of `imageDigest`, `bundleRef`, or `infraRefs` must be present.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["phase", "org", "app", "env", "repo", "commit", "branch"],
@@ -23,12 +23,12 @@
23
23
  "org": {
24
24
  "type": "string",
25
25
  "minLength": 1,
26
- "description": "Harbour organization id, e.g. fourier."
26
+ "description": "Isomorph organization id, e.g. fourier."
27
27
  },
28
28
  "app": {
29
29
  "type": "string",
30
30
  "minLength": 1,
31
- "description": "Harbour app id within the org, e.g. focuslist."
31
+ "description": "Isomorph app id within the org, e.g. focuslist."
32
32
  },
33
33
  "env": {
34
34
  "type": "string",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/security-verdict.schema.json",
4
4
  "title": "SecurityVerdict",
5
- "description": "Decision produced by the Harbour Security Assurance machine (Security Assurance LLD §2). `outcome: BLOCKED` surfaces to callers as the registered non-retryable `gate.security-scan` error category; `reason` is present exactly when BLOCKED. The S3 evidence object named by `evidenceRef` is the full record — in-payload findings may be truncated.",
5
+ "description": "Decision produced by the Isomorph Security Assurance machine (Security Assurance LLD §2). `outcome: BLOCKED` surfaces to callers as the registered non-retryable `gate.security-scan` error category; `reason` is present exactly when BLOCKED. The S3 evidence object named by `evidenceRef` is the full record — in-payload findings may be truncated.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["outcome", "profile", "evidence", "evidenceRef", "provenance"],
@@ -20,7 +20,7 @@
20
20
  "reason": {
21
21
  "type": "string",
22
22
  "minLength": 1,
23
- "description": "Human-readable cause, present when outcome is BLOCKED; becomes the Fail-state cause of HarbourSecurityBlocked."
23
+ "description": "Human-readable cause, present when outcome is BLOCKED; becomes the cause carried by the Security Assurance state machine's `HarbourSecurityBlocked` fail state."
24
24
  },
25
25
  "evidence": {
26
26
  "type": "object",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/transform-report.schema.json",
4
4
  "title": "TransformReport",
5
- "description": "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. A deployable report must also carry preservation_plan: the agent's own grounded smoke tests (one to three happy_path user journeys plus a boundary_check per behaviour its playbooks or edits could regress) that the validation cell executes after transformation, and an uncovered list naming every boundary it could not test and why. It may also carry validation_fixtures: null when no external fixture is needed, or a bounded generic HTTP/WebSocket fixture declaration for that one run; the deployment plane reads the workspace fixture sidecar, so the report's copy is optional. An unsupported report carries only application.unsupported and no plan or fixtures.",
5
+ "description": "Structured output an agent must return from one Isomorph 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. A deployable report must also carry preservation_plan: the agent's own grounded smoke tests (one to three happy_path user journeys plus a boundary_check per behaviour its playbooks or edits could regress) that the validation cell executes after transformation, and an uncovered list naming every boundary it could not test and why. It may also carry validation_fixtures: null when no external fixture is needed, or a bounded generic HTTP/WebSocket fixture declaration for that one run; the deployment plane reads the workspace fixture sidecar, so the report's copy is optional. An unsupported report carries only application.unsupported and no plan or fixtures.",
6
6
  "x-go-embed": true,
7
7
  "type": "object",
8
8
  "additionalProperties": false,
@@ -25,7 +25,7 @@
25
25
  "properties": {
26
26
  "deployable": { "type": "boolean" },
27
27
  "needsTransformation": {
28
- "description": "Whether the attempt changed the tree. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
28
+ "description": "Whether the attempt changed the tree. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
29
29
  "type": "boolean"
30
30
  },
31
31
  "blockers": {
@@ -34,7 +34,7 @@
34
34
  "items": { "type": "string", "minLength": 1, "maxLength": 1024 }
35
35
  },
36
36
  "surfaces": {
37
- "description": "Paths the attempt touched. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
37
+ "description": "Paths the attempt touched. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
38
38
  "type": "array",
39
39
  "minItems": 1,
40
40
  "maxItems": 1024,
@@ -64,26 +64,26 @@
64
64
  "properties": {
65
65
  "mode": { "type": "string", "enum": ["none", "sql"] },
66
66
  "changeType": {
67
- "description": "Classification of the changed paths. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
67
+ "description": "Classification of the changed paths. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
68
68
  "type": "string",
69
69
  "enum": ["none", "code_only", "schema_only", "code_and_schema"]
70
70
  },
71
71
  "requiresCodeChanges": {
72
- "description": "Whether any changed path sits outside the database boundary. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
72
+ "description": "Whether any changed path sits outside the database boundary. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
73
73
  "type": "boolean"
74
74
  },
75
75
  "requiresSchemaMigration": {
76
- "description": "Whether the Aurora bundle grew past its seeded prefix. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
76
+ "description": "Whether the Aurora bundle grew past its seeded prefix. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
77
77
  "type": "boolean"
78
78
  },
79
79
  "migrationPaths": {
80
- "description": "Migration files in the Aurora bundle. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
80
+ "description": "Migration files in the Aurora bundle. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
81
81
  "type": "array",
82
82
  "maxItems": 128,
83
83
  "items": { "type": "string", "minLength": 1, "maxLength": 512 }
84
84
  },
85
85
  "changedFiles": {
86
- "description": "Changed paths on the database boundary. Optional: Harbour derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
86
+ "description": "Changed paths on the database boundary. Optional: Isomorph derives this from the transformed workspace, so a deployable report may omit it and one that still carries it stays valid.",
87
87
  "type": "array",
88
88
  "maxItems": 512,
89
89
  "items": { "type": "string", "minLength": 1, "maxLength": 512 }
@@ -132,7 +132,7 @@
132
132
  "kind": { "type": "string", "enum": ["happy_path", "boundary_check"] },
133
133
  "name": { "type": "string", "minLength": 1, "maxLength": 120 },
134
134
  "boundaries": {
135
- "description": "Transformation boundaries this test claims to cover. Optional: Harbour derives them from the test's own evidence paths, so a deployable report may omit them and one that still carries them stays valid.",
135
+ "description": "Transformation boundaries this test claims to cover. Optional: Isomorph derives them from the test's own evidence paths, so a deployable report may omit them and one that still carries them stays valid.",
136
136
  "type": "array",
137
137
  "minItems": 1,
138
138
  "maxItems": 8,
@@ -215,7 +215,7 @@
215
215
  "required": ["reason"],
216
216
  "properties": {
217
217
  "boundary": {
218
- "description": "Optional: Harbour derives the uncovered boundaries from the changed paths and the covered set, so a deployable report may omit this and one that still carries it stays valid.",
218
+ "description": "Optional: Isomorph derives the uncovered boundaries from the changed paths and the covered set, so a deployable report may omit this and one that still carries it stays valid.",
219
219
  "type": "string",
220
220
  "enum": ["application", "routing", "database", "authentication", "runtime_dependency", "files", "provider", "background_work"]
221
221
  },
@@ -383,7 +383,7 @@
383
383
  ]
384
384
  },
385
385
  "validationSeed": {
386
- "description": "Build-only PostgreSQL bootstrap for authenticated browser validation. Use null when the application does not require a pre-existing database identity. The SQL file runs only in Harbour's throwaway validation database after migrations and before candidate boot. Harbour supplies the fixed probe subject and lowercased email as transaction-local settings.",
386
+ "description": "Build-only PostgreSQL bootstrap for authenticated browser validation. Use null when the application does not require a pre-existing database identity. The SQL file runs only in Isomorph's throwaway validation database after migrations and before candidate boot. Isomorph supplies the fixed probe subject and lowercased email as transaction-local settings.",
387
387
  "anyOf": [
388
388
  {
389
389
  "type": "object",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/well-defined-app-manifest.schema.json",
4
4
  "title": "WellDefinedAppManifest",
5
- "description": "Versioned provisioning input emitted by Harbour Transform. It describes runtime wiring and workload lifecycle only; PostgreSQL grants and RLS remain the database authorization authority.",
5
+ "description": "Versioned provisioning input emitted by Isomorph Transform. It describes runtime wiring and workload lifecycle only; PostgreSQL grants and RLS remain the database authorization authority.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["version", "architecture", "workloads", "bindings"],
@@ -15,7 +15,7 @@
15
15
  "sdkMajor": {
16
16
  "type": "integer",
17
17
  "const": 1,
18
- "description": "Required only when transformed browser code uses @harbour/app-sdk."
18
+ "description": "Required only when transformed browser code uses @isomorph.ai/app-sdk."
19
19
  },
20
20
  "workloads": {
21
21
  "type": "array",
@@ -37,11 +37,11 @@
37
37
  "maxItems": 5,
38
38
  "uniqueItems": true,
39
39
  "items": { "$ref": "#/definitions/Capability" },
40
- "description": "Optional declaration of the Harbour browser capabilities the application uses. Same closed set as the app-capabilities document; this is the declaration, not a source scan."
40
+ "description": "Optional declaration of the Isomorph browser capabilities the application uses. Same closed set as the app-capabilities document; this is the declaration, not a source scan."
41
41
  },
42
42
  "routeAuth": {
43
43
  "$ref": "#/definitions/RouteAuth",
44
- "description": "Optional method/path authentication policy. Omitted means every route requires Harbour SSO, the same default the policy states explicitly."
44
+ "description": "Optional method/path authentication policy. Omitted means every route requires Isomorph SSO, the same default the policy states explicitly."
45
45
  }
46
46
  },
47
47
  "definitions": {
@@ -53,7 +53,7 @@
53
53
  "type": "object",
54
54
  "additionalProperties": false,
55
55
  "required": ["default", "public"],
56
- "description": "Harbour SSO is required by default; the public list is the only way a route escapes it, and each entry names the methods and the application-authorized mode so the artifact contract's route_auth can be built from this document alone.",
56
+ "description": "Isomorph SSO is required by default; the public list is the only way a route escapes it, and each entry names the methods and the application-authorized mode so the artifact contract's route_auth can be built from this document alone.",
57
57
  "properties": {
58
58
  "default": {
59
59
  "type": "string",