@aifabrix/builder 2.60.0 → 2.61.2

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 (112) hide show
  1. package/README.md +14 -11
  2. package/docs/README.md +80 -0
  3. package/docs/builder-help/evidence-patterns.json +155 -0
  4. package/docs/builder-help/golden-examples/crm-company.json +30 -0
  5. package/docs/builder-help/golden-examples/crm-deal.json +29 -0
  6. package/docs/builder-help/golden-examples/document-storage-keyed-get.json +85 -0
  7. package/docs/builder-help/golden-examples/document-storage.json +30 -0
  8. package/docs/builder-help/golden-examples/meeting-transcript.json +29 -0
  9. package/docs/builder-help/golden-examples/repository-template.json +29 -0
  10. package/docs/builder-help/golden-examples/service-ticket.json +29 -0
  11. package/docs/builder-help/platform-roles.json +98 -0
  12. package/docs/builder-help/resource-type-catalog.json +402 -0
  13. package/lib/api/configuration.api.js +131 -0
  14. package/lib/api/system-secrets.api.js +72 -0
  15. package/lib/app/run-docker-fallback.js +6 -1
  16. package/lib/app/run-helpers.js +2 -1
  17. package/lib/app/run-parameter-sync.js +142 -0
  18. package/lib/build/docker-build-args.js +5 -2
  19. package/lib/build/index.js +3 -2
  20. package/lib/build/standard-docker-build.js +2 -2
  21. package/lib/cli/setup-app.js +5 -0
  22. package/lib/cli/setup-environment.js +156 -0
  23. package/lib/commands/datasource-capability-upsert-cli.js +112 -0
  24. package/lib/commands/datasource-capability.js +4 -2
  25. package/lib/commands/env-secret-context.js +113 -0
  26. package/lib/commands/env-secret-list.js +200 -0
  27. package/lib/commands/env-secret-push-confirm.js +54 -0
  28. package/lib/commands/env-secret-push-run.js +227 -0
  29. package/lib/commands/env-secret-push.js +168 -0
  30. package/lib/commands/repair-datasource-apply.js +2 -0
  31. package/lib/commands/repair-datasource-keyed-document.js +122 -0
  32. package/lib/commands/repair-datasource-run.js +1 -0
  33. package/lib/commands/setup-modes.js +1 -8
  34. package/lib/commands/setup-prompts.js +2 -180
  35. package/lib/commands/verify-operations-skip-e2e.js +25 -1
  36. package/lib/commands/verify-operations-steps.js +13 -1
  37. package/lib/commands/wizard-config-normalizer.js +7 -4
  38. package/lib/commands/wizard-core.js +5 -157
  39. package/lib/commands/wizard-file-saving.js +163 -0
  40. package/lib/core/env-platform-expand.js +5 -1
  41. package/lib/core/secrets-env-content.js +5 -1
  42. package/lib/core/secrets-env-write.js +10 -3
  43. package/lib/core/secrets-load.js +4 -2
  44. package/lib/datasource/binary-documents-validator.js +190 -0
  45. package/lib/datasource/capability/run-capability-upsert.js +202 -0
  46. package/lib/datasource/capability/upsert-ingredients.js +291 -0
  47. package/lib/datasource/capability/upsert-operations.js +138 -0
  48. package/lib/datasource/capability/upsert-test-scaffold.js +189 -0
  49. package/lib/datasource/validate.js +12 -5
  50. package/lib/generator/index.js +3 -0
  51. package/lib/lifecycle/product-model.js +4 -3
  52. package/lib/lifecycle/report-display.js +3 -2
  53. package/lib/parameters/infra-parameter-catalog.js +1 -1
  54. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +1 -1
  55. package/lib/programmatic/builder-help-governance.js +1 -1
  56. package/lib/programmatic/builder-help.js +1 -1
  57. package/lib/role-assistant/test-runner-workhub-answers.js +4 -1
  58. package/lib/role-assistant/test-runner-workhub-missing-fields.js +42 -0
  59. package/lib/role-assistant/test-runner-workhub-wait-stop.js +94 -0
  60. package/lib/role-assistant/test-runner-workhub.js +28 -19
  61. package/lib/schema/application-schema.json +14 -2
  62. package/lib/schema/external-datasource.schema.json +23 -3
  63. package/lib/schema/infra.parameter.yaml +388 -38
  64. package/lib/utils/compose-generate-docker-compose.js +7 -12
  65. package/lib/utils/datasource-binary-evidence.js +92 -0
  66. package/lib/utils/datasource-test-run-capability-scope.js +44 -1
  67. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  68. package/lib/utils/datasource-test-run-display.js +8 -2
  69. package/lib/utils/datasource-test-run-issue-guidance.js +176 -0
  70. package/lib/utils/datasource-test-run-tty-log.js +2 -0
  71. package/lib/utils/env-copy.js +11 -10
  72. package/lib/utils/external-system-system-test-tty.js +3 -2
  73. package/lib/utils/image-tags.js +2 -2
  74. package/lib/utils/platform-kv-ref.js +1 -1
  75. package/lib/utils/prepare-local-data-mount.js +58 -0
  76. package/lib/utils/secrets-helpers.js +0 -1
  77. package/lib/utils/system-secret-mapping.js +125 -0
  78. package/lib/utils/test-log-writer.js +2 -1
  79. package/lib/validation/external-manifest-validator.js +5 -0
  80. package/lib/validation/openapi-contract-surface-validator.js +3 -1
  81. package/lib/validation/validate-external-file.js +5 -1
  82. package/package.json +4 -3
  83. package/templates/agent-kit/agent-kit.yaml +1 -1
  84. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +2 -1
  85. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +15 -0
  86. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -2
  87. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +6 -2
  88. package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +22 -0
  89. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +7 -1
  90. package/templates/agent-kit/skills/aifabrix-role-assistant/references/testing-playbook.md +117 -0
  91. package/templates/agent-kit/skills/shared/interaction.md +83 -0
  92. package/templates/agent-kit/skills/shared/status.md +3 -12
  93. package/templates/applications/builder-api/application.yaml +1 -1
  94. package/templates/applications/builder-api/env.template +5 -1
  95. package/templates/applications/dataplane/application.yaml +1 -1
  96. package/templates/applications/dataplane/env.template +10 -12
  97. package/templates/applications/keycloak/application.yaml +6 -1
  98. package/templates/applications/miso-controller/application.yaml +74 -2
  99. package/templates/applications/miso-controller/env.template +42 -3
  100. package/templates/applications/miso-controller/rbac.yaml +17 -0
  101. package/templates/external-system/external-datasource.yaml.hbs +7 -1
  102. package/templates/marketplace/main.json +4 -4
  103. package/templates/python/docker-compose.hbs +1 -1
  104. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +0 -41
  105. /package/{lib/programmatic/help-content → docs/builder-help/content}/channel-onboarding.md +0 -0
  106. /package/{lib/programmatic/help-content → docs/builder-help/content}/cip-overview.md +0 -0
  107. /package/{lib/programmatic/help-content → docs/builder-help/content}/connected-system-ui.md +0 -0
  108. /package/{lib/programmatic/help-content → docs/builder-help/content}/dimensions-guide.md +0 -0
  109. /package/{lib/programmatic/help-content → docs/builder-help/content}/enterprise-sync-fabrix.md +0 -0
  110. /package/{lib/programmatic/help-content → docs/builder-help/content}/overview.md +0 -0
  111. /package/{lib/programmatic/help-content → docs/builder-help/content}/subscription-guide.md +0 -0
  112. /package/{lib/programmatic/help-content → docs/builder-help/content}/workflow.md +0 -0
@@ -44,7 +44,7 @@ API_KEY_BYPASS_ROLES=full-access
44
44
 
45
45
  # API Configuration
46
46
  API_V1_STR=/api/v1
47
- VERSION=2.0.74
47
+ VERSION=2.0.79
48
48
  # Minimum supported aifabrix-builder CLI semver (advertised on /health and /api/v1/health; empty = no gate)
49
49
  # MIN_BUILDER_CLI_VERSION=2.45.0
50
50
  MIN_BUILDER_CLI_VERSION=2.45.5
@@ -137,21 +137,18 @@ ABAC_POLICY_PARSE_CACHE_MAX_ENTRIES=2048
137
137
  # AUTHENTICATION CONFIGURATION
138
138
  # =============================================================================
139
139
 
140
- # MISO secret runtime (583.0): every process calls miso-client init_secrets() once.
141
- # Unset/local: MISO_AUTH_MODE=local — the SDK keeps this .env/dotenv credential flow.
142
- # Azure: deployment supplies MISO_AUTH_MODE=azure-managed-identity, MISO_CONTROLLER_URL,
143
- # MISO_BOOTSTRAP_AUDIENCE (and optional AZURE_CLIENT_ID); Miso-managed secrets
144
- # (DATABASE_URL, REDIS_URL, ENCRYPTION_KEY, ...) come from the Controller broker,
145
- # never from this file, and no MISO_CLIENTSECRET is required or returned.
146
- # Rotation: changed names are reread from the SDK; DB/Redis pools are disposed and
147
- # the process reports secretRotationRestartRequired until restarted. Invalidation
148
- # (denial/expiry) stops new secret-dependent work and makes health unhealthy.
140
+ # MISO governed configuration runtime (583.0): client credentials are active by default.
141
+ # The SDK uses the per-application credentials below to load its bootstrap snapshot and
142
+ # refreshes it automatically within two minutes. Changed names invoke application refresh
143
+ # handlers; a handler may still recreate an internal resource such as a DB or Redis client.
144
+ # Override with MISO_AUTH_MODE=local only for an explicit .env/dotenv development flow.
145
+ # Invalidation (denial/expiry) stops new secret-dependent work and makes health unhealthy.
149
146
  # Health: /health, /api/v1/health and /api/v1/health/platform return HTTP 503 with
150
147
  # reasonCode misoTokenUnavailable | misoTokenRejected | misoControllerUnreachable |
151
148
  # misoValidationTimeout whenever the Controller does not accept the live client
152
149
  # token — in LOCAL_MODE too. These endpoints measure usable application health,
153
150
  # not process liveness.
154
- MISO_AUTH_MODE=local
151
+ MISO_AUTH_MODE=client-credentials
155
152
  # MISO Application Client Credentials (per application)
156
153
  # Backend-only: never expose MISO_CLIENTSECRET to the Vite frontend (use VITE_* in app-ui).
157
154
  MISO_CLIENTID=kv://dataplane-client-idKeyVault
@@ -167,7 +164,8 @@ KEYCLOAK_REALM=aifabrix
167
164
  # =============================================================================
168
165
  # Public: browser redirects and CORS (includes /controller front-door path from miso-controller application.yaml).
169
166
  MISO_WEB_SERVER_URL=url://miso-controller-public
170
- # Internal: server-to-controller API calls (Docker: service:port; local: host:port — no front-door path).
167
+ # Private service-to-service controller origin. The SDK permits HTTP only for a local/private
168
+ # target; public or remote controller origins still require HTTPS.
171
169
  MISO_CONTROLLER_URL=url://miso-controller-internal
172
170
  # Browser logout page on miso-controller (path relative to MISO_WEB_SERVER_URL; not dataplane /login).
173
171
  MISO_LOGOUT_URL=/logout
@@ -9,7 +9,12 @@ app:
9
9
  # Image Configuration
10
10
  image:
11
11
  name: aifabrix/keycloak
12
- tag: '26.7.3-aifabrix.1'
12
+ # `latest`, like every other app here. The Keycloak version lives in app.version above,
13
+ # which is what `aifabrix push --tag 'latest,{version}'` expands, so nothing is lost by
14
+ # not repeating it here. Pinning it made `aifabrix run` look for keycloak-dev1:<version>
15
+ # while `aifabrix build` only ever produces :latest, so dev-build-kc failed with
16
+ # "Docker image not found" on an image it had just built.
17
+ tag: latest
13
18
  registry: aifabrixacr.azurecr.io
14
19
  registryMode: external
15
20
 
@@ -4,7 +4,7 @@ app:
4
4
  displayName: 'Miso Controller'
5
5
  description: 'Miso is the AI Fabrix in-tenant controller and portal layer for securely operating enterprise AI apps inside a customer’s Azure tenant. It provides Entra ID SSO, RBAC, audit logs, environment/app configuration via schemas, and safe secret handling via Key Vault references—ensuring governance, traceability, and predictable UX across portal, SDK, and CLI.'
6
6
  type: webapp
7
- version: '2.0.83'
7
+ version: '2.0.89'
8
8
  # Image Configuration
9
9
  # Set tag to match your build (e.g. aifabrix build miso-controller -t 1.0.0 then tag: 1.0.0)
10
10
  # Registry is required so the controller can pull the image (avoids "docker: not found" on the controller host).
@@ -84,12 +84,68 @@ repository:
84
84
  # are stack-level, not per environment: there is no `environments:` section.
85
85
  # env.template consumes these names as {NAME}.
86
86
  platforms:
87
+ # Production is matched first and by its literal name, because its host is not the suffixed
88
+ # pattern the other platforms follow: `platform.aifabrix.dev`, not `platform-pro.aifabrix.dev`.
89
+ - resource: aifabrix-int-pro
90
+ name: aifabrix
91
+ platform: pro
92
+ configuration:
93
+ - name: LOCATION
94
+ value: 'swedencentral'
95
+ - name: MORI_BASE_URL
96
+ value: 'https://platform.aifabrix.dev/mori'
97
+
98
+ # Local Docker runs. No resource group is supplied, so `matchLocalPlatform` takes the FIRST entry
99
+ # declaring the local platform (`dev`) -- this one -- and the literal `aifabrix-local` can never
100
+ # match a real group, so Azure deployments fall through to the entries below.
101
+ #
102
+ # It MUST sit above `aifabrix-int-{platform}`: that entry also resolves to `dev`, so without this
103
+ # one a local stack took `https://platform-dev.aifabrix.dev/mori` -- a host that does not exist on
104
+ # a developer machine. Measured on dev01 2026-09-28: every Mori call failed with `socket hang up`,
105
+ # and `LicenseValidationService.pickupLicenseFromMori` maps that transport failure to
106
+ # `LicenseInvalidError`, which surfaces as **HTTP 403** on
107
+ # `POST /api/ide/onboarding/license/pickup`. A connection failure reported as Forbidden sent the
108
+ # investigation after api-key permissions for days (mori 48.0 `reproduce-license-pickup-403`).
109
+ #
110
+ # Service-to-service traffic has no reason to leave the cluster through the public edge, and the
111
+ # public host is not even resolvable from inside the container. Verified from the miso-controller
112
+ # container: `http://mori-controller:3004/api/v1/health` answers 200 while both
113
+ # `platform-dev.aifabrix.dev` and `dev01.aifabrix.dev` fail to connect.
114
+ #
115
+ # The value is the declarative `url://` form rather than a literal host, so the Builder resolves
116
+ # it from the platform topology the same way Mori's own env.template resolves
117
+ # `url://miso-controller-internal`. A literal would be a second place to edit whenever the local
118
+ # service address changes, and the whole point of `url://` is that there is one.
119
+ #
120
+ # Verified on dev01 that this is the reachable address and that the `/mori` prefix it carries is
121
+ # served: from the miso-controller container both `http://mori-controller:3004/api/v1/health` and
122
+ # `http://mori-controller:3004/mori/api/v1/health` answer 200. `moriApiBase()` appends `/api/v1`.
123
+ #
124
+ # NOT `kv://mori-controller-web-server-url`, which is what the entries below deliberately moved
125
+ # away from: that reads the application RECORD, and on aifabrix-ce-16 the record still held
126
+ # `http://localhost:3004`. `url://` is resolved from the topology at resolve time, not from a
127
+ # record an Azure deployment never overwrites.
128
+ - resource: aifabrix-local
129
+ name: aifabrix
130
+ platform: dev
131
+ configuration:
132
+ - name: LOCATION
133
+ value: 'swedencentral'
134
+ - name: MORI_BASE_URL
135
+ value: 'url://mori-controller-internal'
136
+
87
137
  - resource: aifabrix-int-{platform}
88
138
  name: aifabrix
89
- options: [dev, tst, pro]
139
+ options: [dev, tst]
90
140
  configuration:
91
141
  - name: LOCATION
92
142
  value: 'swedencentral'
143
+ # Mori the installation talks to. Previously `kv://mori-controller-web-server-url`, which
144
+ # resolved to whatever the *application record* held — on aifabrix-ce-16 that was
145
+ # `http://localhost:3004`, because an Azure deployment never overwrites a stale URL, so every
146
+ # consumer of it was pointed at a loopback address that does not exist in the cluster.
147
+ - name: MORI_BASE_URL
148
+ value: 'https://platform-{platform}.aifabrix.dev/mori'
93
149
 
94
150
  - resource: aifabrix-ce-*
95
151
  name: '*'
@@ -98,6 +154,22 @@ platforms:
98
154
  configuration:
99
155
  - name: LOCATION
100
156
  value: 'swedencentral'
157
+ # The App Service hostname, not the Front Door one, because only this is derivable.
158
+ #
159
+ # The Front Door endpoint carries an Azure-generated suffix (`fzahchbachcfbgaj`) that no
160
+ # template can spell: `{platform}`, `{platform.name}` and `{resourceGroup}` are the only
161
+ # tokens, and none of them yields it. The previous literal was aifabrix-ce-16's endpoint and
162
+ # was therefore wrong for every other `aifabrix-ce-*` installation -- the next one built would
163
+ # have pointed its Miso at ce-16's Mori.
164
+ #
165
+ # The web app is named `{resourceGroup}-miso-mori-controller` by the installer, so its default
166
+ # hostname IS derivable and is correct for every installation in the group. Verified on
167
+ # aifabrix-ce-16 2026-09-27: that host answers /mori/health with 200. This is also the better
168
+ # address for Miso->Mori traffic, which is service-to-service and has no reason to leave the
169
+ # cluster through the public edge. When the named platform hosts exist
170
+ # (`platform-dev.aifabrix.dev/mori`) this entry can follow the pattern used above.
171
+ - name: MORI_BASE_URL
172
+ value: 'https://{resourceGroup}-miso-mori-controller.azurewebsites.net/mori'
101
173
 
102
174
  configuration:
103
175
  # -------------------------------------------------------------------------
@@ -193,16 +193,21 @@ WAIT_FOR_KEYCLOAK=true
193
193
  # For production: use public domain (e.g., https://miso.example.com)
194
194
  # url://public includes front-door path from application.yaml (e.g. /controller).
195
195
  MISO_WEB_SERVER_URL=url://public
196
+ # Private service-to-service controller origin; public/browser traffic uses MISO_WEB_SERVER_URL.
196
197
  MISO_CONTROLLER_URL=url://internal
197
198
  MISO_RELATIVE_PATH=url://vdir-public
198
- ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private
199
+ ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private,url://mori-controller-host-public
199
200
  # Opt-in: broker/entry/referer under /data keep …/data/auth/callback (do not append /miso). Default off.
200
201
  # AUTH_PRESERVE_DATAPLANE_VDIR=true
201
202
 
202
203
  # MISO Environment Configuration (miso, dev, tst, pro)
203
204
  MISO_ENVIRONMENT=miso
204
205
 
205
- # MISO Application Client Credentials (per application)
206
+ # Governed configuration uses per-application client credentials by default. The SDK loads
207
+ # its bootstrap snapshot and refreshes it automatically within two minutes; consumers decide
208
+ # whether a changed key also requires an internal client or resource to be recreated.
209
+ MISO_AUTH_MODE=client-credentials
210
+ # MISO Application Client Credentials (per application; never expose the secret to the browser)
206
211
  MISO_CLIENTID=kv://miso-controller-client-idKeyVault
207
212
  MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
208
213
 
@@ -378,8 +383,17 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=url://mori-controller-public/entra-graph-dele
378
383
  # registered and running for this developer.
379
384
  # MORI_API_KEY is per-installation and is minted by POST /marketplace/bootstrap; it is written
380
385
  # here by the controller after registration, not provisioned ahead of it.
381
- MORI_BASE_URL=kv://mori-controller-web-server-url
386
+ MORI_BASE_URL={MORI_BASE_URL}
382
387
  MORI_API_KEY=kv://mori-controller-api-keyKeyVault
388
+ # Ask Mori for a container-registry credential when the installation was given none.
389
+ # Off by default: the call has a 30s timeout inside credential resolution, so enabling it on an
390
+ # installation whose Mori cannot issue would stall every deployment that reaches that point.
391
+ # Declared here because it was previously read from process.env and set nowhere, so there was no
392
+ # supported way to turn the path on — an installation that pulls vendor images through a
393
+ # Mori-issued token had to have an app setting added by hand. Cross-tenant managed identity
394
+ # cannot grant registry access, so this is the only mechanism that works for a customer
395
+ # installation pulling from the vendor registry.
396
+ MORI_REGISTRY_CREDENTIALS=false
383
397
 
384
398
  # =============================================================================
385
399
  # LOGGING CONFIGURATION
@@ -412,3 +426,28 @@ OTEL_SERVICE_VERSION=
412
426
 
413
427
  # Mount Volume Configuration
414
428
  MOUNT_VOLUME=/mnt/data/
429
+
430
+ # Image registry this installation deploys from.
431
+ #
432
+ # `pipeline-validation-flow.helper.ts` resolves the deploy registry as ACR_LOGIN_SERVER first, then
433
+ # the controller record's `configuration.imageRegistry`. Azure installations get the record from the
434
+ # installer, so this stays EMPTY there and behaviour is unchanged. A local installation matches no
435
+ # platform (`allowLocalPlatform` is false for the controller) and has no record, so without this key
436
+ # every `aifabrix deploy` fails with "Image registry is not configured on the controller
437
+ # installation".
438
+ #
439
+ # EMPTY on purpose. The controller record is read AFTER this and overwrites it, so an Azure
440
+ # installation ignores whatever stands here; only a local installation consumes it.
441
+ #
442
+ # This briefly shipped as `aifabrixce16.azurecr.io` — one test installation's registry, committed
443
+ # into the product, so every developer who did not override it would have pushed and pulled
444
+ # against ce-16 without being told. A `{ACR_LOGIN_SERVER}` token was tried instead and is worse
445
+ # still: nothing resolves it without a resource group, so it breaks `aifabrix build` outright
446
+ # ("no platform or environment configuration resolves it for environment dev").
447
+ #
448
+ # Empty is the honest third answer. An Azure installation is unaffected, and a local
449
+ # `aifabrix deploy` fails with "Image registry is not configured on the controller installation",
450
+ # which names the missing thing. Its proper home is the Builder run tooling, which already knows
451
+ # the answer (`aifabrix dev print-registry`) and should inject it per developer rather than have
452
+ # Miso ship one installation's registry to everybody.
453
+ ACR_LOGIN_SERVER=
@@ -176,6 +176,23 @@ permissions:
176
176
  roles: ['aifabrix-platform-admin', 'aifabrix-deployment-admin']
177
177
  description: 'Remove applications from environments'
178
178
 
179
+ # External-system catalog (aligned with src/examples/permissions.csv)
180
+ - name: 'external-system:read'
181
+ roles:
182
+ [
183
+ 'aifabrix-platform-admin',
184
+ 'aifabrix-security-admin',
185
+ 'aifabrix-deployment-admin',
186
+ 'aifabrix-compliance-admin',
187
+ 'aifabrix-developer',
188
+ 'aifabrix-observer'
189
+ ]
190
+ description: 'Read external systems'
191
+
192
+ - name: 'external-systems:domain-manager'
193
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
194
+ description: 'Manage external-system catalog promotion and role-derived dimension governance'
195
+
179
196
  # Pipeline & Deployment
180
197
  - name: 'applications:deploy'
181
198
  roles: ['aifabrix-platform-admin', 'aifabrix-deployment-admin', 'aifabrix-developer']
@@ -122,7 +122,13 @@ openapi:
122
122
  # documentStorage:
123
123
  # enabled: true
124
124
  # binaryOperationRef: get
125
- # embeddingField: content
125
+ # responseType: binary
126
+ # ingestAfterSync: true
127
+ # Keyed retrieval (no list): for a vendor PDF, image or octet-stream response,
128
+ # keep only get in capabilities and end its CIP steps with output.mode: documents.
129
+ # Fetch: { source: openapi, openapiRef: get, responseType: binary }
130
+ # Map response metadata from raw.headers.FileName and raw.params.DocumentId.
131
+ # The wizard and repair infer this shape from the vendor OpenAPI response media type.
126
132
  {{/if}}
127
133
  {{#if (eq schemaEntityType "vectorStore")}}
128
134
  # vectorStore: vector index settings (model id, dimensions, etc. per schema). Uncomment and set to match your embedding deployment.
@@ -5,7 +5,7 @@
5
5
  "_generator": {
6
6
  "name": "bicep",
7
7
  "version": "0.47.16.16243",
8
- "templateHash": "6752412774681258733"
8
+ "templateHash": "8811550299172477333"
9
9
  }
10
10
  },
11
11
  "parameters": {
@@ -1047,7 +1047,7 @@
1047
1047
  "_generator": {
1048
1048
  "name": "bicep",
1049
1049
  "version": "0.47.16.16243",
1050
- "templateHash": "11131379543865133238"
1050
+ "templateHash": "9369439869727192513"
1051
1051
  }
1052
1052
  },
1053
1053
  "parameters": {
@@ -1099,7 +1099,7 @@
1099
1099
  {
1100
1100
  "type": "Microsoft.KeyVault/vaults/secrets",
1101
1101
  "apiVersion": "2023-07-01",
1102
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'azureopenai-endpoint')]",
1102
+ "name": "[format('{0}/{1}', parameters('keyVaultName'), 'dev-dataplane-azure-openai-endpoint')]",
1103
1103
  "properties": {
1104
1104
  "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts', variables('accountName')), '2023-05-01').endpoint]"
1105
1105
  },
@@ -1110,7 +1110,7 @@
1110
1110
  {
1111
1111
  "type": "Microsoft.KeyVault/vaults/secrets",
1112
1112
  "apiVersion": "2023-07-01",
1113
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'azureopenai-apikey')]",
1113
+ "name": "[format('{0}/{1}', parameters('keyVaultName'), 'dev-dataplane-azure-openai-api-key')]",
1114
1114
  "properties": {
1115
1115
  "value": "[listKeys(resourceId('Microsoft.CognitiveServices/accounts', variables('accountName')), '2023-05-01').key1]"
1116
1116
  },
@@ -327,4 +327,4 @@ volumes:
327
327
 
328
328
  networks:
329
329
  {{networkName}}:
330
- external: true
330
+ external: true
@@ -1,41 +0,0 @@
1
- # Phase and result interaction
2
-
3
- Use structured questions. Do not start the next phase from chat prose alone.
4
-
5
- ## After success
6
-
7
- Offer the next eligible phase. Proceed only on `next-yes`.
8
-
9
- Shared option ids: `next-yes` · `next-no` · `next-stop`.
10
-
11
- | Completed | Next offer |
12
- | --- | --- |
13
- | aifabrix-plan PLAN_READY | connected-system validate |
14
- | connected-system READY | connected-system build |
15
- | connected-system BUILT | connected-system publish |
16
- | connected-system PASS or PASS_WITH_SKIPS | archive (separate) and/or prove validate |
17
- | prove READY / BUILT / UPDATED | prove next phase |
18
- | prove PASS or PASS_WITH_SKIPS | iterate validate/build |
19
-
20
- Archive is a distinct user decision (`archive-yes` / `archive-no`). Never archive as a side effect of PASS.
21
-
22
- ## On gaps
23
-
24
- - NEEDS_DECISIONS: AskQuestion challenge rows. No `cust-next`.
25
- - BLOCKED / FAIL / NEEDS_FIXES / ABORTED: do not offer the next phase as if success.
26
-
27
- A phase gate is per-gate, not overall. Offer the next phase only when the **Delivery** row
28
- supports it; a passing package gate beside `Delivery: NEEDS_FIXES` is not success and the
29
- offer must name what is still open.
30
-
31
- ## Phase detection (connected-system and prove)
32
-
33
- 1. Explicit phase from the user
34
- 2. Ask, offering the routes in [status.md](../../shared/status.md)
35
-
36
- There is no third step. Package and plan state decide what you *recommend*, never what you
37
- run: a bare invocation reports status and stops ([status.md](../../shared/status.md)).
38
- Inferring "the safe next eligible phase" is what makes a skill start working before the
39
- user has said what they want.
40
-
41
- Never silently run the following phase after success.