@aifabrix/builder 2.58.0 → 2.60.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 (120) hide show
  1. package/lib/agent-kit/codex-app-server.js +44 -0
  2. package/lib/agent-kit/git-identity.js +180 -0
  3. package/lib/agent-kit/init.js +4 -17
  4. package/lib/agent-kit/session-report.js +15 -10
  5. package/lib/agent-kit/setup-auth.js +131 -0
  6. package/lib/agent-kit/setup-context.js +118 -0
  7. package/lib/agent-kit/setup-github.js +70 -0
  8. package/lib/agent-kit/setup-managed.js +79 -0
  9. package/lib/agent-kit/setup-process.js +42 -0
  10. package/lib/agent-kit/setup-session.js +53 -0
  11. package/lib/agent-kit/setup-state.js +52 -0
  12. package/lib/agent-kit/setup-workspace.js +113 -0
  13. package/lib/agent-kit/setup.js +87 -0
  14. package/lib/agent-kit/start.js +48 -3
  15. package/lib/agent-kit/tmux-sessions.js +20 -3
  16. package/lib/api/dev.api.js +1 -1
  17. package/lib/api/miso-health.api.js +26 -0
  18. package/lib/api/role-assistant-test-job.api.js +60 -0
  19. package/lib/api/types/dev.types.js +3 -3
  20. package/lib/api/work-search.api.js +13 -6
  21. package/lib/app/deploy.js +8 -103
  22. package/lib/app/show-display.js +1 -0
  23. package/lib/app/show-online.js +15 -0
  24. package/lib/build/standard-docker-build.js +4 -1
  25. package/lib/cli/index.js +4 -0
  26. package/lib/cli/setup-app.js +14 -1
  27. package/lib/cli/setup-dev-path-commands.js +4 -0
  28. package/lib/cli/setup-dev.js +7 -4
  29. package/lib/cli/setup-help.js +86 -0
  30. package/lib/cli/setup-onboarding.js +37 -0
  31. package/lib/cli/setup-utility-repair.js +7 -5
  32. package/lib/cli/setup-utility.js +24 -1
  33. package/lib/commands/agent-kit-help.js +21 -7
  34. package/lib/commands/agent-kit-sessions.js +126 -0
  35. package/lib/commands/agent-kit-setup.js +44 -0
  36. package/lib/commands/agent-kit.js +5 -79
  37. package/lib/commands/dev-init.js +21 -23
  38. package/lib/commands/dev-refresh.js +2 -2
  39. package/lib/commands/governance-verify-external.js +12 -5
  40. package/lib/commands/repair-datasource.js +9 -9
  41. package/lib/commands/repair.js +45 -8
  42. package/lib/commands/role-assistant.js +7 -0
  43. package/lib/commands/upload-qualification-client.js +56 -11
  44. package/lib/commands/upload-qualification-poll.js +51 -22
  45. package/lib/commands/wizard-dataplane.js +16 -52
  46. package/lib/core/env-platform-expand.js +93 -0
  47. package/lib/core/secrets-env-content.js +37 -3
  48. package/lib/datasource/datasource-validate-summary.js +8 -5
  49. package/lib/datasource/sync-defaults.js +53 -0
  50. package/lib/deployment/installation/azure-infra-stage.js +13 -1
  51. package/lib/deployment/installation/azure-preflight.js +13 -2
  52. package/lib/deployment/installation/azure-readiness.js +24 -2
  53. package/lib/deployment/installation/environment-auth.js +60 -20
  54. package/lib/deployment/installation/environment-stage.js +9 -5
  55. package/lib/deployment/installation/infra-catalog.js +10 -7
  56. package/lib/deployment/installation/infra-manifest.js +5 -0
  57. package/lib/deployment/installation/registry-auth-mode.js +33 -10
  58. package/lib/deployment/marketplace-environment.js +26 -1
  59. package/lib/generator/builders.js +17 -0
  60. package/lib/generator/helpers.js +23 -2
  61. package/lib/generator/index.js +33 -18
  62. package/lib/integration-definition/apply.js +2 -2
  63. package/lib/internal/fs-real-sync.js +4 -1
  64. package/lib/programmatic/bearer-auth.js +3 -62
  65. package/lib/programmatic/builder-api-startup.js +51 -0
  66. package/lib/programmatic/builder-miso-runtime.js +167 -0
  67. package/lib/programmatic/openapi-descriptions.js +3 -3
  68. package/lib/programmatic/openapi-schema-descriptions-core.js +3 -3
  69. package/lib/programmatic/openapi-spec.js +2 -1
  70. package/lib/programmatic/route-handler-map.js +3 -2
  71. package/lib/role-assistant/test-cases-search.js +3 -0
  72. package/lib/role-assistant/test-job-runner.js +125 -0
  73. package/lib/role-assistant/test-runner-search.js +44 -2
  74. package/lib/schema/application-schema.json +193 -2
  75. package/lib/schema/environment-deploy-request.schema.json +1 -1
  76. package/lib/schema/external-datasource.schema.json +20 -5
  77. package/lib/schema/infra-parameter.schema.json +140 -34
  78. package/lib/schema/infra.parameter.yaml +30 -29
  79. package/lib/schema/infrastructure-schema.json +133 -14
  80. package/lib/schema/installation-environment.schema.json +1 -1
  81. package/lib/schema/wizard-config.schema.json +1 -1
  82. package/lib/utils/compose-generate-docker-compose.js +12 -0
  83. package/lib/utils/config-paths.js +24 -29
  84. package/lib/utils/config-registry-preference.js +13 -6
  85. package/lib/utils/dev-init-ssh-merge.js +5 -4
  86. package/lib/utils/dev-user-groups.js +2 -1
  87. package/lib/utils/docker-build.js +29 -8
  88. package/lib/utils/docker-daemon-tls-ca.js +2 -2
  89. package/lib/utils/docker-manifest-public-port.js +36 -0
  90. package/lib/utils/error-formatters/validation-errors.js +25 -5
  91. package/lib/utils/help-builder.js +4 -3
  92. package/lib/utils/platform-resolution.js +226 -0
  93. package/lib/utils/resolve-docker-image-ref.js +8 -3
  94. package/lib/utils/token-manager.js +29 -36
  95. package/package.json +4 -3
  96. package/templates/README.md +2 -1
  97. package/templates/agent-kit/agent-kit.yaml +4 -1
  98. package/templates/agent-kit/instructions/AGENTKIT.md +40 -3
  99. package/templates/agent-kit/instructions/root.AGENTS.md +42 -1
  100. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +33 -1
  101. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/delivery-verdict.js +176 -0
  102. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -0
  103. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +10 -3
  104. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +22 -0
  105. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +21 -0
  106. package/templates/agent-kit/skills/shared/feedback.md +31 -0
  107. package/templates/agent-kit/skills/shared/hosts.md +35 -7
  108. package/templates/agent-kit/skills/shared/status.md +85 -0
  109. package/templates/agent-kit/workspace/BUILDER_IMPROVEMENT_FINDINGS.md +27 -0
  110. package/templates/agent-kit/workspace/README.md +14 -1
  111. package/templates/applications/builder-api/application.yaml +1 -1
  112. package/templates/applications/dataplane/application.yaml +30 -2
  113. package/templates/applications/dataplane/env.template +37 -4
  114. package/templates/applications/miso-controller/application.yaml +24 -1
  115. package/templates/applications/miso-controller/env.template +22 -35
  116. package/templates/external-system/external-datasource.yaml.hbs +7 -6
  117. package/templates/marketplace/main.json +281 -75
  118. package/templates/python/Dockerfile.hbs +2 -0
  119. package/templates/typescript/Dockerfile.hbs +2 -0
  120. package/templates/typescript/docker-compose.hbs +12 -0
@@ -8,8 +8,8 @@
8
8
 
9
9
  # HTTP port for the app
10
10
  PORT=${PORT}
11
- # dev | tst | pro
12
- ENVIRONMENT=dev
11
+ # dev | tst | pro. Resolved from the deployment environment; local Docker is dev.
12
+ ENVIRONMENT={ENVIRONMENT}
13
13
  # Enable debug mode
14
14
  DEBUG=false
15
15
  # Logging level: DEBUG, INFO, WARNING, ERROR, CRITICAL
@@ -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.70
47
+ VERSION=2.0.74
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
@@ -98,6 +98,15 @@ DB_3_PASSWORD=kv://databases-dataplane-3-passwordKeyVault
98
98
  # so Docker dataplane + miso-controller do not exhaust max_connections alongside make dev.
99
99
  # SAME_SERVER_POOL_BUDGET=24
100
100
 
101
+ # Transaction lifetime guardrails (587.0). Loaders run remote/AI/file work outside
102
+ # transactions; these are leak guards and telemetry, not the normal control path.
103
+ # idle_in_transaction_session_timeout applied to every Dataplane engine (seconds, 0 = off).
104
+ DB_IDLE_IN_TRANSACTION_TIMEOUT_SECONDS=60
105
+ # Warn (sanitized: loader/phase/duration/counts/correlation only) when one transaction exceeds this.
106
+ DB_SLOW_TRANSACTION_WARN_SECONDS=5
107
+ # Upper bound of rows per Evidence bulk load request (atomic below the bound; larger fails before mutation).
108
+ EVIDENCE_LOAD_MAX_ITEMS=500
109
+
101
110
  # =============================================================================
102
111
  # REDIS CONFIGURATION
103
112
  # =============================================================================
@@ -128,6 +137,21 @@ ABAC_POLICY_PARSE_CACHE_MAX_ENTRIES=2048
128
137
  # AUTHENTICATION CONFIGURATION
129
138
  # =============================================================================
130
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.
149
+ # Health: /health, /api/v1/health and /api/v1/health/platform return HTTP 503 with
150
+ # reasonCode misoTokenUnavailable | misoTokenRejected | misoControllerUnreachable |
151
+ # misoValidationTimeout whenever the Controller does not accept the live client
152
+ # token — in LOCAL_MODE too. These endpoints measure usable application health,
153
+ # not process liveness.
154
+ MISO_AUTH_MODE=local
131
155
  # MISO Application Client Credentials (per application)
132
156
  # Backend-only: never expose MISO_CLIENTSECRET to the Vite frontend (use VITE_* in app-ui).
133
157
  MISO_CLIENTID=kv://dataplane-client-idKeyVault
@@ -151,7 +175,7 @@ MISO_LOGOUT_URL=/logout
151
175
  # Environment key sent to miso-controller (e.g. environmentKey on RBAC/register) when not supplied in the payload.
152
176
  # Set MISO_PIPELINE_ENV_KEY=dev when the controller installation uses dev (e.g. MISO_CLIENTID=miso-controller-dev-dataplane).
153
177
  # If unset, derived from MISO_CLIENTID (e.g. dev from miso-controller-dev-dataplane).
154
- MISO_PIPELINE_ENV_KEY=
178
+ MISO_PIPELINE_ENV_KEY={PIPELINE_ENV_KEY}
155
179
 
156
180
  # LLM: chat/embed route through governed enterprise-llm only. Provider credentials
157
181
  # live on LLM provider external systems + dataplane secret store (not product .env).
@@ -334,3 +358,12 @@ TRUST_AI_EXPOSURE_GATE_ENABLED=false
334
358
  # when 346.rules / §17 revisions must invalidate existing certificates without matching rulesVersion.
335
359
  CERTIFICATION_DATASOURCE_SCHEMA_VERSION=
336
360
  CERTIFICATION_RULES_VERSION=
361
+
362
+ # =============================================================================
363
+ # DIMENSION ABAC ENFORCEMENT (589.0)
364
+ # =============================================================================
365
+ # false (default): Stage 1 dimension ABAC scope services do not enforce
366
+ # external-system/source assignment scope, client-principal system binding or
367
+ # subscription owner scope (RBAC permissions still apply).
368
+ # true: enforce the Dimension ABAC certification rules (2026-09-21).
369
+ DIMENSION_ABAC_ENFORCEMENT_ENABLED=false
@@ -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.81'
7
+ version: '2.0.83'
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).
@@ -75,6 +75,29 @@ repository:
75
75
  # - DATABASE_URL, REDIS_URL, KEYCLOAK_* → auto-generated during Azure install
76
76
  # - Other MISO_*, AZURE_*, kv:// → credentials and system parameters
77
77
  # - PORT, NODE_ENV, MISO_ENVIRONMENT → set by deployment target
78
+ # - LOCATION → resolved from the platform match below
79
+
80
+ # =============================================================================
81
+ # Platform Resolution (target Azure resource group decides)
82
+ # =============================================================================
83
+ # One controller per installation (MISO_ENVIRONMENT=miso), so the values that vary
84
+ # are stack-level, not per environment: there is no `environments:` section.
85
+ # env.template consumes these names as {NAME}.
86
+ platforms:
87
+ - resource: aifabrix-int-{platform}
88
+ name: aifabrix
89
+ options: [dev, tst, pro]
90
+ configuration:
91
+ - name: LOCATION
92
+ value: 'swedencentral'
93
+
94
+ - resource: aifabrix-ce-*
95
+ name: '*'
96
+ # The group carries no dev|tst|pro token, so the platform is declared.
97
+ platform: dev
98
+ configuration:
99
+ - name: LOCATION
100
+ value: 'swedencentral'
78
101
 
79
102
  configuration:
80
103
  # -------------------------------------------------------------------------
@@ -29,11 +29,6 @@
29
29
  #
30
30
  # =============================================================================
31
31
 
32
- # Skip automatic first-time bootstrap on controller startup (default: false).
33
- # Bootstrap = DB controller row, Keycloak realm/client, admin user, roles (empty DB only).
34
- # Keep false for normal dev — this is NOT the Azure tenant-activation UI wizard.
35
- # Set true only for tests that must not mutate Keycloak/DB on startup.
36
- SKIP_FIRST_TIME_SETUP=false
37
32
 
38
33
  # Force onboarding to run even when a controller row already exists (default: unset/false).
39
34
  # Prefer SQL/API one-shot: POST /api/v1/controller/force-onboarding (controller:admin) or set
@@ -46,11 +41,12 @@ SKIP_FIRST_TIME_SETUP=false
46
41
  ONBOARDING_CONTROLLER_KEY=miso-controller
47
42
 
48
43
  # Infrastructure/service name used by controller/onboarding flows
49
- INFRASTRUCTURE_NAME=aifabrix
44
+ INFRASTRUCTURE_NAME=${DEV_USERNAME}.${DEV_ROOT_DOMAIN}
50
45
 
51
46
  # Azure region (required for first-time onboarding: controller record / provisioning metadata).
52
47
  # Use the region you deploy to (e.g. westeurope, eastus, northeurope). Single env name: LOCATION.
53
- LOCATION=westeurope
48
+ # Resolved from the platform match; see `platforms` in application.yaml.
49
+ LOCATION={LOCATION}
54
50
 
55
51
  # Required for admin user creation during onboarding
56
52
  # Password for the initial administrator user (username: admin)
@@ -59,23 +55,20 @@ ONBOARDING_ADMIN_PASSWORD=kv://miso-controller-admin-passwordKeyVault
59
55
  # Optional admin email for onboarding (default: admin@aifabrix.ai)
60
56
  ONBOARDING_ADMIN_EMAIL=kv://miso-controller-admin-emailKeyVault
61
57
 
62
- # [customerOwned] Create development environment during onboarding (default: false)
63
- # Full platform: create miso, dev, tst, and pro during onboarding (default: false)
64
- # When true, supersedes ONBOARDING_CREATE_DEV_ENV for which extra environments are created
65
- # [saasDirect] Keep false in the customer container — extra environments belong to the
66
- # eSystems deploy path, not the customer wizard.
58
+ # Which environments onboarding creates (plan 240.0). This is the only onboarding environment
59
+ # variable: false or unset creates `dev`, true creates `dev`, `tst` and `pro`.
60
+ #
61
+ # `dev` is always created — every edition is entitled to it, and the installation registers its
62
+ # own applications into it. What `dev` *is* follows the licence rather than this flag: in the
63
+ # shared model it runs on the installation stack and needs no infrastructure of its own; in the
64
+ # dedicated model it waits at lifecycle `created` for an administrator.
65
+ #
66
+ # Replaces ONBOARDING_CREATE_DEV_ENV, ONBOARDING_CREATE_MISO_ENV and SKIP_FIRST_TIME_SETUP,
67
+ # which expressed one decision in four places and disagreed about its default. Whether the
68
+ # installation environment is deployed during onboarding now follows ONBOARDING_MODE: a hosted
69
+ # (saasDirect) installation deploys it, a customer-owned one leaves it to the activation wizard.
67
70
  ONBOARDING_FULL_PLATFORM=false
68
71
 
69
- # [customerOwned] When true, run Azure env deploy for onboarding envs (SDK modules). Default false —
70
- # Marketplace already provisions infra; TA owns customer env deploy.
71
- # [saasDirect] Keep false: eSystems already deployed the required runtime services.
72
- ONBOARDING_CREATE_MISO_ENV=false
73
-
74
- # [customerOwned] Set to true to create both miso and dev environments during onboarding
75
- # When false (default), only the miso environment is created (ignored when ONBOARDING_FULL_PLATFORM=true)
76
- # [saasDirect] Keep false in the customer container.
77
- ONBOARDING_CREATE_DEV_ENV=true
78
-
79
72
  # =============================================================================
80
73
  # APPLICATION ENVIRONMENT
81
74
  # =============================================================================
@@ -226,12 +219,7 @@ MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
226
219
  #
227
220
  # ENTRA_ID_CENTRAL_CALLBACK_URI — Web redirect on the vendor app; must point at
228
221
  # Mori (e.g. …/entra-id-concent/callback), not the SPA or controller.
229
- # ENTRA_CALLBACK_STATE_SECRET — Shared HMAC secret (min 16 chars) for OAuth state
230
- # between controller and Mori callback service; same value on Mori and controller.
231
- #
232
- # Delegated Graph (second redirect URI on the same vendor app): see section below.
233
- ENTRA_CALLBACK_STATE_SECRET=kv://entra-callback-state-secret
234
- ENTRA_ID_CENTRAL_CALLBACK_URI=https://dev01.aifabrix.dev/mori/entra-id-concent/callback
222
+ ENTRA_ID_CENTRAL_CALLBACK_URI=url://mori-controller-public/entra-id-concent/callback
235
223
  ENTRA_ID_CLIENT_ID=kv://entra-client-idKeyVault
236
224
  ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
237
225
 
@@ -285,7 +273,7 @@ SKIP_DB_REDEPLOY=true
285
273
  # database — DB/RBAC only, no Docker from controller; dashboard (default dev)
286
274
  #
287
275
  # Missing or invalid value defaults to azure (wizard + Azure credentials).
288
- # Bootstrap (SKIP_FIRST_TIME_SETUP=false) is separate from the activation wizard.
276
+ # First-time bootstrap is separate from the activation wizard.
289
277
  # NOTE: there is no `saas` value. eSystems-hosted SaaS runs DEPLOYMENT=azure with
290
278
  # ONBOARDING_MODE=saasDirect (see next section).
291
279
  DEPLOYMENT=database
@@ -375,7 +363,7 @@ MORI_LICENSE_ISSUER=mori-controller
375
363
  # =============================================================================
376
364
  # Must match a Web redirect URI on the vendor multi-tenant app and Mori’s route
377
365
  # …/entra-graph-delegated/callback. Shared pro Mori addon (CICD *-miso-rg):
378
- ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://dev01.aifabrix.dev/mori/entra-graph-delegated/callback
366
+ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=url://mori-controller-public/entra-graph-delegated/callback
379
367
 
380
368
  # Optional delegated Graph scopes for GET …/graph-auth-url (space- or comma-separated).
381
369
  # ENTRA_GRAPH_DELEGATED_SCOPES=https://graph.microsoft.com/Application.ReadWrite.All,https://graph.microsoft.com/Group.ReadWrite.All,https://graph.microsoft.com/Synchronization.ReadWrite.All,openid,profile,offline_access
@@ -386,12 +374,11 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://dev01.aifabrix.dev/mori/entra-graph-d
386
374
  # =============================================================================
387
375
  # MORI SERVICE CONFIGURATION
388
376
  # =============================================================================
389
- # Shared Mori (handoff poll + Entra callback). Local `url://mori-controller-public`
390
- # only works when a local Mori app is registered and running for this developer.
391
- # MORI_CALLBACK_API_KEY must be the same secret as Mori MORI_CONTROLLER_CALLBACK_API_KEY
392
- # (both resolve from kv://mori-callback-api-keyKeyVault — do not generate separate values).
377
+ # Shared Mori. Local `url://mori-controller-public` only works when a local Mori app is
378
+ # registered and running for this developer.
379
+ # MORI_API_KEY is per-installation and is minted by POST /marketplace/bootstrap; it is written
380
+ # here by the controller after registration, not provisioned ahead of it.
393
381
  MORI_BASE_URL=kv://mori-controller-web-server-url
394
- MORI_CALLBACK_API_KEY=kv://mori-callback-api-keyKeyVault
395
382
  MORI_API_KEY=kv://mori-controller-api-keyKeyVault
396
383
 
397
384
  # =============================================================================
@@ -98,7 +98,7 @@ openapi:
98
98
 
99
99
  # --- Optional sections: uncomment or delete as needed ---
100
100
  #
101
- # Query-time (v2.4): public list/get/filter are served from persisted Dataplane DB — not live external HTTP on every read (Plan 346 section 11).
101
+ # Query-time: public list/get/filter are served from persisted Dataplane DB — not live external HTTP on every read.
102
102
  # External APIs: sync jobs and create/update/delete execution paths. CIP fetch→map is for ingestion, writes, or orchestration — populate storage before expecting query APIs.
103
103
  #
104
104
  # CIP (Composable Integration Pipeline): fetch → [paginate] → [map] → [filter] → output
@@ -106,12 +106,13 @@ openapi:
106
106
  # execution.cip requires version "1.0" and operations.<name>.steps ($defs.cipDefinition). Custom operation keys must match the same pattern as capabilities[].
107
107
  #
108
108
  {{#if (eq schemaEntityType "recordStorage")}}
109
- # sync: external APIs run during sync (Plan 346 section 11). Minimal contract: mode/schedule/batchSize per schema. FK fields on a record should update atomically in one logical write.
109
+ # sync: external APIs run during synchronization. New automatic schedules default to calendar-month cadence in UTC.
110
+ # Omit schedule to retain manual-only synchronization. Set enabled: false for total synchronization disable; retained schedule and incremental settings are preserved.
110
111
  # sync:
111
- # pull:
112
- # enabled: true
113
- # schedule: "0 * * * *"
114
- # batchSize: 500
112
+ # enabled: true
113
+ # mode: pull
114
+ # schedule: "@monthly"
115
+ # batchSize: 500
115
116
  # validation: structural / pre-persistence checks; quality: post-mapping acceptance (e.g. rejectIf) — see schema when you enable them.
116
117
  # capabilities: standard names list, get, create, update, delete + custom names matching ^[a-z][a-zA-Z0-9]*$; must match execution.cip.operations / openapi.operations you implement.
117
118
  # capabilities: [list, get]