composable-data-stack 0.14.0__tar.gz → 0.15.0__tar.gz

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 (173) hide show
  1. {composable_data_stack-0.14.0/composable_data_stack.egg-info → composable_data_stack-0.15.0}/PKG-INFO +22 -3
  2. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/README.md +19 -1
  3. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/getter.py +624 -13
  4. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/image_updates.py +12 -6
  5. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/k8s_renderer.py +639 -2
  6. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/k8s_runner.py +1 -1
  7. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/k8s_security.py +96 -3
  8. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/main.py +144 -30
  9. composable_data_stack-0.15.0/cli/maturity.py +271 -0
  10. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/planner.py +220 -15
  11. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/renderer.py +223 -10
  12. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/module.schema.json +147 -3
  13. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/profile.schema.json +11 -1
  14. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/rule-schema.json +5 -0
  15. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/rule-set.json +10 -7
  16. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/secrets.py +4 -1
  17. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/security.py +122 -29
  18. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/security_common.py +22 -0
  19. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/up_runner.py +38 -4
  20. composable_data_stack-0.15.0/cli/utils.py +85 -0
  21. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/validator.py +513 -11
  22. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0/composable_data_stack.egg-info}/PKG-INFO +22 -3
  23. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/composable_data_stack.egg-info/SOURCES.txt +29 -1
  24. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/composable_data_stack.egg-info/requires.txt +2 -1
  25. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/pyproject.toml +74 -2
  26. composable_data_stack-0.15.0/tests/test_agent_policy.py +49 -0
  27. composable_data_stack-0.15.0/tests/test_airflow_module.py +97 -0
  28. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_audit_trivyignore.py +39 -0
  29. composable_data_stack-0.15.0/tests/test_cds_runtime.py +592 -0
  30. composable_data_stack-0.15.0/tests/test_cds_runtime_backends.py +153 -0
  31. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_cds_workflow.py +7 -6
  32. composable_data_stack-0.15.0/tests/test_contract_host_resolution.py +672 -0
  33. composable_data_stack-0.15.0/tests/test_dagster_entrypoint_backend_guard.py +442 -0
  34. composable_data_stack-0.15.0/tests/test_garage_module.py +342 -0
  35. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_getter.py +527 -0
  36. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_getter_extra.py +121 -0
  37. composable_data_stack-0.15.0/tests/test_gitops_fluxcd_module.py +302 -0
  38. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_image_digest_check.py +2 -2
  39. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_image_updates.py +70 -0
  40. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_k3d_e2e_profile.py +15 -0
  41. composable_data_stack-0.15.0/tests/test_k8s_e2e_workflow.py +66 -0
  42. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_k8s_renderer.py +657 -0
  43. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_k8s_runner.py +18 -0
  44. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_k8s_security.py +156 -0
  45. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_keycloak_postgres_wiring.py +50 -0
  46. composable_data_stack-0.15.0/tests/test_local_dagster_postgres_superset_dbt_profile.py +92 -0
  47. composable_data_stack-0.15.0/tests/test_local_haven_reference_profile.py +83 -0
  48. composable_data_stack-0.15.0/tests/test_local_kubernetes_example_profile.py +81 -0
  49. composable_data_stack-0.15.0/tests/test_loki_module.py +153 -0
  50. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_main.py +143 -2
  51. composable_data_stack-0.15.0/tests/test_marquez_lineage_sink_host.py +140 -0
  52. composable_data_stack-0.15.0/tests/test_marquez_module.py +113 -0
  53. composable_data_stack-0.15.0/tests/test_maturity.py +363 -0
  54. composable_data_stack-0.15.0/tests/test_module_contract_schema.py +92 -0
  55. composable_data_stack-0.15.0/tests/test_object_storage_backup_module.py +323 -0
  56. composable_data_stack-0.15.0/tests/test_object_storage_backup_runtime.py +519 -0
  57. composable_data_stack-0.15.0/tests/test_otel_collector_module.py +252 -0
  58. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_planner.py +144 -6
  59. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_planner_extra.py +80 -0
  60. composable_data_stack-0.15.0/tests/test_postgres_backup_restore_runtime.py +495 -0
  61. composable_data_stack-0.15.0/tests/test_production_kubernetes_example_profile.py +97 -0
  62. composable_data_stack-0.15.0/tests/test_prompts_lint.py +407 -0
  63. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_publish_images_workflow.py +48 -0
  64. composable_data_stack-0.15.0/tests/test_redact_secrets.py +103 -0
  65. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_renderer.py +254 -0
  66. composable_data_stack-0.15.0/tests/test_restic_backup_restore_runtime.py +558 -0
  67. composable_data_stack-0.15.0/tests/test_restic_backup_wiring.py +295 -0
  68. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_runtime_policy.py +56 -0
  69. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_secrets.py +20 -0
  70. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_security.py +215 -1
  71. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_standalone_module_profile.py +5 -1
  72. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_superset_hardening.py +8 -2
  73. composable_data_stack-0.15.0/tests/test_superset_oidc_wiring.py +266 -0
  74. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_team_profile.py +16 -0
  75. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_trivyignore.py +3 -5
  76. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_up_runner.py +110 -2
  77. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_validator_extra.py +498 -0
  78. composable_data_stack-0.15.0/tests/test_workdir_cds_runtime.py +154 -0
  79. composable_data_stack-0.14.0/cli/utils.py +0 -35
  80. composable_data_stack-0.14.0/tests/test_dagster_entrypoint_backend_guard.py +0 -210
  81. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/LICENSE +0 -0
  82. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/__init__.py +0 -0
  83. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/audit_log.py +0 -0
  84. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/composer.py +0 -0
  85. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/confinement.py +0 -0
  86. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/constants.py +0 -0
  87. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/diagnostics.py +0 -0
  88. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/graph.py +0 -0
  89. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/image_digest_check.py +0 -0
  90. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/image_verification.py +0 -0
  91. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/loader.py +0 -0
  92. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/overlay.py +0 -0
  93. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/preflight.py +0 -0
  94. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/report.py +0 -0
  95. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resolver.py +0 -0
  96. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/__init__.py +0 -0
  97. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/compatibility-registry.json +0 -0
  98. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/compatibility-registry.schema.json +0 -0
  99. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/resources/contract.schema.json +0 -0
  100. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/secret_leak.py +0 -0
  101. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/state.py +0 -0
  102. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/cli/update_check.py +0 -0
  103. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/composable_data_stack.egg-info/dependency_links.txt +0 -0
  104. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/composable_data_stack.egg-info/entry_points.txt +0 -0
  105. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/composable_data_stack.egg-info/top_level.txt +0 -0
  106. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/setup.cfg +0 -0
  107. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_ai_profile_review.py +0 -0
  108. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_audit_log.py +0 -0
  109. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_build_cra_release_evidence_manifest.py +0 -0
  110. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_bump_changelog.py +0 -0
  111. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_certificates.py +0 -0
  112. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_check_cra_release_gate.py +0 -0
  113. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_check_roadmap_freshness.py +0 -0
  114. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_completion.py +0 -0
  115. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_compose_runtime_smoke.py +0 -0
  116. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_compose_to_module.py +0 -0
  117. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_composer.py +0 -0
  118. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_composer_extra.py +0 -0
  119. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_cra_traceability.py +0 -0
  120. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_dagster_config_generation.py +0 -0
  121. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_dagster_definitions_uri.py +0 -0
  122. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_dagster_hardening.py +0 -0
  123. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_dbt_hardening.py +0 -0
  124. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_dlt_postgres_wiring.py +0 -0
  125. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_duckdb_hardening.py +0 -0
  126. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_environment_classification.py +0 -0
  127. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_environment_cli.py +0 -0
  128. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_generate_release_inventory.py +0 -0
  129. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_graph.py +0 -0
  130. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_image_locks.py +0 -0
  131. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_image_security_scan_workflow.py +0 -0
  132. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_image_verification.py +0 -0
  133. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_k3d_exposure.py +0 -0
  134. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_loader.py +0 -0
  135. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_main_extra.py +0 -0
  136. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_main_extra2.py +0 -0
  137. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_main_extra3.py +0 -0
  138. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_markdown_mermaid_blocks.py +0 -0
  139. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_module_isolation.py +0 -0
  140. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_modules_no_committed_secrets.py +0 -0
  141. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_mvp_proof_workflow.py +0 -0
  142. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_overlay.py +0 -0
  143. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_preflight.py +0 -0
  144. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_preflight_extra.py +0 -0
  145. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_preflight_rootless.py +0 -0
  146. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_python_version_alignment.py +0 -0
  147. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_release_notes_support.py +0 -0
  148. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_release_version_check.py +0 -0
  149. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_release_workflow.py +0 -0
  150. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_render_example_profile.py +0 -0
  151. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_report.py +0 -0
  152. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_resolve_profile_path.py +0 -0
  153. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_resolver.py +0 -0
  154. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_reverse_proxy_contract.py +0 -0
  155. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_reverse_proxy_routes.py +0 -0
  156. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_runtime_confinement.py +0 -0
  157. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_secret_file_permissions.py +0 -0
  158. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_secret_output_scanning.py +0 -0
  159. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_shipped_profiles.py +0 -0
  160. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_smoke_example_profile.py +0 -0
  161. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_state.py +0 -0
  162. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_tender_analytics.py +0 -0
  163. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_tender_dashboard.py +0 -0
  164. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_test_runner_timeout.py +0 -0
  165. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_update_check.py +0 -0
  166. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_update_check_extra.py +0 -0
  167. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_upstream_image_hardening.py +0 -0
  168. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_utils.py +0 -0
  169. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_validate_cli_sbom.py +0 -0
  170. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_validator.py +0 -0
  171. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_vault_init_db.py +0 -0
  172. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_vault_init_db_runtime.py +0 -0
  173. {composable_data_stack-0.14.0 → composable_data_stack-0.15.0}/tests/test_vendored_llm_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: composable-data-stack
3
- Version: 0.14.0
3
+ Version: 0.15.0
4
4
  Summary: CLI for validating and composing composable data stack profiles
5
5
  Author: Ronald Hensbergen
6
6
  License-Expression: Apache-2.0
@@ -28,11 +28,12 @@ Provides-Extra: completion
28
28
  Requires-Dist: argcomplete<4,>=3.0.0; extra == "completion"
29
29
  Provides-Extra: test
30
30
  Requires-Dist: jinja2>=3.0; extra == "test"
31
+ Requires-Dist: sqlalchemy>=2.0; extra == "test"
31
32
  Provides-Extra: dev
32
33
  Requires-Dist: coverage>=7.6; extra == "dev"
33
34
  Requires-Dist: bandit>=1.7; extra == "dev"
34
35
  Requires-Dist: pip-audit>=2.7; extra == "dev"
35
- Requires-Dist: ruff==0.17.1; extra == "dev"
36
+ Requires-Dist: ruff==0.17.3; extra == "dev"
36
37
  Dynamic: license-file
37
38
 
38
39
  # 🚀 Composable Data Stack (CDS)
@@ -825,12 +826,26 @@ Common errors from `cds validate`, `cds plan`, and `cds render`, and how to fix
825
826
  | `[E134] ... Production backups must be encrypted ...` / `... must be declared required: true` | A production profile has no `spec.backup.encryption.keyFrom`, or the referenced secret alias is declared `required: false` so the key can be missing at runtime. | Declare the encryption key alias with `required: true` so a missing key fails closed at startup. |
826
827
  | `[E135] ... Production backup policy "<class>" must declare restoreVerification` | A production backup policy has no `restoreVerification` block. | Add `restoreVerification.frequencyDays` to every production backup policy.|
827
828
  | `[E136] ... Reverse-proxy route host ...` (unknown target / no resolvable http-service endpoint / backend address not a rendered compose service / entrypoint not declared by the proxy / undeclared certificate alias / duplicate route host) | A `config.routes` entry on a reverse-proxy provider names a module that is missing, does not provide an `http-service` contract with host/port (or a port outside 1-65535), advertises a backend address that matches no rendered compose service (multi-service modules must advertise `serviceName`), names a `<module-id>.<contract-name>` contract the target does not provide, names an entrypoint the proxy's `config.entryPoints` does not declare, references an undeclared certificate alias, or duplicates the host of an earlier route on the same proxy (#581). | Fix the route's `target`/`certificate`/`host`/`entryPoints` (a bare module id routes to its first http-service contract; `<module-id>.<contract-name>` picks a specific one; entrypoints must match the proxy's declared `config.entryPoints` keys), or advertise the serving compose service via `serviceName` in the target's http-service provide entry. |
829
+ | `[E150] ... Provided contract ... advertises network host ...` | A module's provided `http-service`, `sql-database`, `cache-service`, `object-storage`, `lineage-sink`, `log-sink`, `metrics-sink`, or `trace-sink` contract advertises a network host (the `host` field, the `endpoint`'s or `connectionUri`'s hostname part, or a `serviceName` mapped through the renderer's service-naming rule; a scheme-less `host:port` value contributes its host part, #1036) that matches no service the render produced for that module -- no compose service on the compose target, no rendered Kubernetes Service on the helm target -- so consumers would resolve a hostname nothing answers (#1010, #1029, #1035). | Compose: instantiate the module with an id matching its compose service name, advertise the serving service via a `serviceName` field in the provide entry, or build the endpoint from `${service.dns}` or `${service.services.<name>}`. Helm: render the serving workload with a `service` block (or as a `StatefulSet`, which gets a governing Service), advertise the serving workload via a `serviceName` field, or build the endpoint from `${service.dns}`. |
830
+ | `[E151] ... Raw manifest ... must be an object with apiVersion, kind, and metadata.name` / `... must declare non-empty string apiVersion, kind, and metadata.name` | A raw manifest under a module's `implementation.kubernetes.manifests` is malformed -- a plan loaded from a file bypasses the module schema, so the Helm renderer fails closed instead of shipping a broken manifest (issue #767). | Fix the manifest shape in the module (or the saved plan): every entry needs string `apiVersion`/`kind` and a `metadata.name`. |
828
831
  | `[E103] ... config.image.tag is required ... when config.image.source is "registry"` | A module instance sets `config.image.source: registry` without also setting `config.image.tag`. | Set `config.image.tag` to a version, or switch back to `config.image.source: build`. |
829
832
  | `[E139] ... without an explicit host authentication advertisement` / `... host authentication method "trust"` | A `metadata.environment: production` profile runs a `sql-database` provider whose contract does not advertise a host authentication method, or advertises `trust` (issue #206). | Configure the provider's authentication explicitly (e.g. postgres `config.authentication.hostAuth: scram-sha-256`); trust authentication is prohibited in production profiles. |
833
+ | `[E140] ... configures webServer.mode "development"` | A production profile sets an HTTP-serving module's `config.webServer.mode` to `development`, selecting its built-in development web server (issue #216). | Set `config.webServer.mode` to `production` (or remove the override) so the service runs behind its production process manager; see `docs/serving-modes.md`. |
830
834
  | `[E137] ... accepts unauthenticated clients` | A production profile runs a `cache-service` provider that does not advertise `authentication: required` (no password credential configured). | Supply a cache password through a `secrets.<alias>` reference (e.g. keydb `config.passwordFrom`), declared `required: true` in `spec.secrets.values`. |
831
835
  | `[E138] ... Credential field ... must reference a secret alias` / `... is empty` / `... uses a ${CDS_*} profile input` / `... contains a plaintext value` | A credential-named config field of a production database/cache provider is not a `secrets.<alias>` reference, or its alias is not declared `required: true` (issue #206). | Supply the credential through a secret reference declared `required: true` so a missing value fails closed at startup. |
832
836
  | `[W105] ... legacy md5 host authentication` | A production `sql-database` provider advertises `md5`, which validates but is a deprecated password method. | Prefer `scram-sha-256` for production profiles. |
837
+ | `[E148] ... RBAC rule ... must be a mapping with non-empty "apiGroups", "resources", and "verbs" lists` / `... The "serviceAccount" block ... must be a mapping ...` | A module's `implementation.kubernetes.serviceAccount` block (or one of its `rbac` rules) is malformed -- a plan loaded from a file bypasses the module schema, so the Helm renderer fails closed instead of shipping a broken Role (#75). | Fix the `serviceAccount`/`rbac` shape in the module (or the saved plan). |
838
+ | `[E149] ... The "networkPolicy"/... block ... must be a mapping with optional "ingress"/"egress" lists ...` | A module's custom NetworkPolicy allow rules are malformed (plan-file bypass of the module schema) (#75). | Fix the `networkPolicy` shape; each rule must be a mapping. |
839
+ | `[W128] ... carries no numeric port and provider module ... advertises no service ports ...` | A contract binding carries no port evidence, so its generated NetworkPolicy egress rule allows all ports to the provider (#75). | Declare the port in the contract so the rule stays port-scoped. |
833
840
  | `[W097] ... config.image.tag is "latest" with config.image.source "registry"` | `config.image.tag: latest` under `source: registry` still validates, but drifts silently between deploys instead of pinning a reproducible version. | Pin an explicit tag from `publish-images.yml`'s output (or `tests/fixtures/signed-images.json`) instead of `latest`. |
841
+ | `[E127] ... Unknown confinement key ...` / `... must be 'default', 'unconfined' or 'file:<path>' ...` / `... Invalid SELinux label(s) ...` | A `security.runtime.confinement` block (or a module instance's confinement) is malformed: an unsupported key, an invalid `seccomp`/`apparmor`/`selinux` value, or a `file:` seccomp profile path that is missing or resolves outside the profile directory. | Use `seccomp: default`/`unconfined`/`file:<relative path inside the profile directory>`, `apparmor: runtime/default`/`unconfined`/`<host profile name>`, and `selinux: disable` or a `label: value` list; see `docs/runtime-confinement.md`. |
842
+ | `[W071] ... has kind "docker-compose" but no "compose" definition` | A module implementation declares the `docker-compose` kind without an `implementation.compose` block, so the renderer skips the module. | Add the `implementation.compose` block (services, volumes) to the module's `module.yaml`, or set a supported implementation `kind`. |
843
+ | `[W072] ... Container "<name>" in Kubernetes workload "<module>/<workload>" has no resource requests or limits` | Rendering the Helm target: a container or init container listed in a Kubernetes workload has no matching entry under the workload's `resources`. | Add a `resources.<container>` entry with `requests` and `limits` to the workload in the module's Kubernetes implementation (see `docs/kubernetes.md`). |
844
+ | `[W090] ... Invalid .env line format: "<line>" (expected KEY=VALUE)` | A line in the `.env` file is neither blank, a `#` comment, nor in `KEY=VALUE` form, so it is ignored. | Fix the line to `KEY=VALUE` form, comment it out with `#`, or remove it. |
845
+ | `[W098] ... Applied plaintext endpoint exposure waiver for production profile (modules: ...)` | A production profile's `spec.security.waivers.plaintextEndpointExposure` waived the CDS-SEC-074 plaintext-endpoint findings; CDS reports the waiver so it stays visible in security output. | Confirm the waiver is still justified and its `reason` is accurate; see `docs/security-rules.md` (Warnings). |
846
+ | `[W099] ... plaintextEndpointExposure is set but has no effect for profile class ...` | `spec.security.waivers.plaintextEndpointExposure` is declared on a non-prod profile, where CDS-SEC-074 and its waiver only apply to prod-class profiles. | Remove the waiver from the non-prod profile, or move it to the prod profile (overlay) it is meant for. |
847
+ | `[W103] ... Applied runtime policy waiver for production profile (checks: ...)` | A production profile's `spec.security.waivers.runtimePolicy` suppressed CDS-SEC-090 violations; CDS reports the waiver so it stays visible in security output. | Confirm the waiver is still justified and its `reason` is accurate; see `docs/security-rules.md` (Warnings). |
848
+ | `[W104] ... runtimePolicy is set but has no effect for profile class ...` | `spec.security.waivers.runtimePolicy` is declared on a non-prod profile, where CDS-SEC-090 and its waiver only apply to prod-class profiles. | Remove the waiver from the non-prod profile, or move it to the prod profile (overlay) it is meant for. |
834
849
 
835
850
  All diagnostics print with their error code and YAML path (e.g. `spec.modules[1].config`), so search the profile file for that path to find the exact line to fix.
836
851
 
@@ -971,6 +986,8 @@ Please read these first:
971
986
  - [CONTRIBUTING.md](CONTRIBUTING.md)
972
987
  - [docs/maintainer-merge-policy.md](docs/maintainer-merge-policy.md)
973
988
  - [SECURITY.md](SECURITY.md) — how to report a vulnerability
989
+ - [ACCESSIBILITY.md](ACCESSIBILITY.md) — our accessibility commitment and how
990
+ to report a barrier
974
991
  - [LEGAL.md](LEGAL.md) — license, code of conduct, security, support, and
975
992
  regulatory-compliance documentation index
976
993
  - [CHANGELOG.md](CHANGELOG.md)
@@ -986,10 +1003,12 @@ Development helper tools are located in the gitignored `tools/` directory. See
986
1003
  - [Quickstart](README.md#-quickstart) — get running in 5 minutes
987
1004
  - [CLI Reference](docs/cli-reference.md) — full command/flag table and `[profile]` resolution rules
988
1005
  - [How CDS Works](docs/how-it-works.md) — C4 + sequence diagrams of the validate → plan → render engine
989
- - [Kubernetes Target](docs/kubernetes.md): Helm rendering and isolated local k3s workflow
1006
+ - [Kubernetes Target](docs/kubernetes.md): Helm rendering, Docker Compose migration guide, and isolated local k3s workflow — with ready-made example profiles (`profiles/local-kubernetes-example`, `profiles/production-kubernetes-example` with its `prod` overlay)
990
1007
  - [From Docker Compose to CDS Profile](docs/from-docker-to-cds-profile.md) — complete transformation guide
991
1008
  - [Architecture](docs/architecture.md) — design and core concepts
992
1009
  - [Modules](docs/modules.md) — how to structure reusable components
1010
+ - [Workload Runtime API](docs/runtime-api.md) — `cds-runtime`: named database connections for Python workloads
1011
+ - [Production Hardening Checklist](docs/production-hardening-checklist.md) — control-to-owner mapping and the operator verification procedure for a production profile
993
1012
  - [Roadmap](docs/roadmap.md) — planned features and milestones
994
1013
 
995
1014
  ---
@@ -788,12 +788,26 @@ Common errors from `cds validate`, `cds plan`, and `cds render`, and how to fix
788
788
  | `[E134] ... Production backups must be encrypted ...` / `... must be declared required: true` | A production profile has no `spec.backup.encryption.keyFrom`, or the referenced secret alias is declared `required: false` so the key can be missing at runtime. | Declare the encryption key alias with `required: true` so a missing key fails closed at startup. |
789
789
  | `[E135] ... Production backup policy "<class>" must declare restoreVerification` | A production backup policy has no `restoreVerification` block. | Add `restoreVerification.frequencyDays` to every production backup policy.|
790
790
  | `[E136] ... Reverse-proxy route host ...` (unknown target / no resolvable http-service endpoint / backend address not a rendered compose service / entrypoint not declared by the proxy / undeclared certificate alias / duplicate route host) | A `config.routes` entry on a reverse-proxy provider names a module that is missing, does not provide an `http-service` contract with host/port (or a port outside 1-65535), advertises a backend address that matches no rendered compose service (multi-service modules must advertise `serviceName`), names a `<module-id>.<contract-name>` contract the target does not provide, names an entrypoint the proxy's `config.entryPoints` does not declare, references an undeclared certificate alias, or duplicates the host of an earlier route on the same proxy (#581). | Fix the route's `target`/`certificate`/`host`/`entryPoints` (a bare module id routes to its first http-service contract; `<module-id>.<contract-name>` picks a specific one; entrypoints must match the proxy's declared `config.entryPoints` keys), or advertise the serving compose service via `serviceName` in the target's http-service provide entry. |
791
+ | `[E150] ... Provided contract ... advertises network host ...` | A module's provided `http-service`, `sql-database`, `cache-service`, `object-storage`, `lineage-sink`, `log-sink`, `metrics-sink`, or `trace-sink` contract advertises a network host (the `host` field, the `endpoint`'s or `connectionUri`'s hostname part, or a `serviceName` mapped through the renderer's service-naming rule; a scheme-less `host:port` value contributes its host part, #1036) that matches no service the render produced for that module -- no compose service on the compose target, no rendered Kubernetes Service on the helm target -- so consumers would resolve a hostname nothing answers (#1010, #1029, #1035). | Compose: instantiate the module with an id matching its compose service name, advertise the serving service via a `serviceName` field in the provide entry, or build the endpoint from `${service.dns}` or `${service.services.<name>}`. Helm: render the serving workload with a `service` block (or as a `StatefulSet`, which gets a governing Service), advertise the serving workload via a `serviceName` field, or build the endpoint from `${service.dns}`. |
792
+ | `[E151] ... Raw manifest ... must be an object with apiVersion, kind, and metadata.name` / `... must declare non-empty string apiVersion, kind, and metadata.name` | A raw manifest under a module's `implementation.kubernetes.manifests` is malformed -- a plan loaded from a file bypasses the module schema, so the Helm renderer fails closed instead of shipping a broken manifest (issue #767). | Fix the manifest shape in the module (or the saved plan): every entry needs string `apiVersion`/`kind` and a `metadata.name`. |
791
793
  | `[E103] ... config.image.tag is required ... when config.image.source is "registry"` | A module instance sets `config.image.source: registry` without also setting `config.image.tag`. | Set `config.image.tag` to a version, or switch back to `config.image.source: build`. |
792
794
  | `[E139] ... without an explicit host authentication advertisement` / `... host authentication method "trust"` | A `metadata.environment: production` profile runs a `sql-database` provider whose contract does not advertise a host authentication method, or advertises `trust` (issue #206). | Configure the provider's authentication explicitly (e.g. postgres `config.authentication.hostAuth: scram-sha-256`); trust authentication is prohibited in production profiles. |
795
+ | `[E140] ... configures webServer.mode "development"` | A production profile sets an HTTP-serving module's `config.webServer.mode` to `development`, selecting its built-in development web server (issue #216). | Set `config.webServer.mode` to `production` (or remove the override) so the service runs behind its production process manager; see `docs/serving-modes.md`. |
793
796
  | `[E137] ... accepts unauthenticated clients` | A production profile runs a `cache-service` provider that does not advertise `authentication: required` (no password credential configured). | Supply a cache password through a `secrets.<alias>` reference (e.g. keydb `config.passwordFrom`), declared `required: true` in `spec.secrets.values`. |
794
797
  | `[E138] ... Credential field ... must reference a secret alias` / `... is empty` / `... uses a ${CDS_*} profile input` / `... contains a plaintext value` | A credential-named config field of a production database/cache provider is not a `secrets.<alias>` reference, or its alias is not declared `required: true` (issue #206). | Supply the credential through a secret reference declared `required: true` so a missing value fails closed at startup. |
795
798
  | `[W105] ... legacy md5 host authentication` | A production `sql-database` provider advertises `md5`, which validates but is a deprecated password method. | Prefer `scram-sha-256` for production profiles. |
799
+ | `[E148] ... RBAC rule ... must be a mapping with non-empty "apiGroups", "resources", and "verbs" lists` / `... The "serviceAccount" block ... must be a mapping ...` | A module's `implementation.kubernetes.serviceAccount` block (or one of its `rbac` rules) is malformed -- a plan loaded from a file bypasses the module schema, so the Helm renderer fails closed instead of shipping a broken Role (#75). | Fix the `serviceAccount`/`rbac` shape in the module (or the saved plan). |
800
+ | `[E149] ... The "networkPolicy"/... block ... must be a mapping with optional "ingress"/"egress" lists ...` | A module's custom NetworkPolicy allow rules are malformed (plan-file bypass of the module schema) (#75). | Fix the `networkPolicy` shape; each rule must be a mapping. |
801
+ | `[W128] ... carries no numeric port and provider module ... advertises no service ports ...` | A contract binding carries no port evidence, so its generated NetworkPolicy egress rule allows all ports to the provider (#75). | Declare the port in the contract so the rule stays port-scoped. |
796
802
  | `[W097] ... config.image.tag is "latest" with config.image.source "registry"` | `config.image.tag: latest` under `source: registry` still validates, but drifts silently between deploys instead of pinning a reproducible version. | Pin an explicit tag from `publish-images.yml`'s output (or `tests/fixtures/signed-images.json`) instead of `latest`. |
803
+ | `[E127] ... Unknown confinement key ...` / `... must be 'default', 'unconfined' or 'file:<path>' ...` / `... Invalid SELinux label(s) ...` | A `security.runtime.confinement` block (or a module instance's confinement) is malformed: an unsupported key, an invalid `seccomp`/`apparmor`/`selinux` value, or a `file:` seccomp profile path that is missing or resolves outside the profile directory. | Use `seccomp: default`/`unconfined`/`file:<relative path inside the profile directory>`, `apparmor: runtime/default`/`unconfined`/`<host profile name>`, and `selinux: disable` or a `label: value` list; see `docs/runtime-confinement.md`. |
804
+ | `[W071] ... has kind "docker-compose" but no "compose" definition` | A module implementation declares the `docker-compose` kind without an `implementation.compose` block, so the renderer skips the module. | Add the `implementation.compose` block (services, volumes) to the module's `module.yaml`, or set a supported implementation `kind`. |
805
+ | `[W072] ... Container "<name>" in Kubernetes workload "<module>/<workload>" has no resource requests or limits` | Rendering the Helm target: a container or init container listed in a Kubernetes workload has no matching entry under the workload's `resources`. | Add a `resources.<container>` entry with `requests` and `limits` to the workload in the module's Kubernetes implementation (see `docs/kubernetes.md`). |
806
+ | `[W090] ... Invalid .env line format: "<line>" (expected KEY=VALUE)` | A line in the `.env` file is neither blank, a `#` comment, nor in `KEY=VALUE` form, so it is ignored. | Fix the line to `KEY=VALUE` form, comment it out with `#`, or remove it. |
807
+ | `[W098] ... Applied plaintext endpoint exposure waiver for production profile (modules: ...)` | A production profile's `spec.security.waivers.plaintextEndpointExposure` waived the CDS-SEC-074 plaintext-endpoint findings; CDS reports the waiver so it stays visible in security output. | Confirm the waiver is still justified and its `reason` is accurate; see `docs/security-rules.md` (Warnings). |
808
+ | `[W099] ... plaintextEndpointExposure is set but has no effect for profile class ...` | `spec.security.waivers.plaintextEndpointExposure` is declared on a non-prod profile, where CDS-SEC-074 and its waiver only apply to prod-class profiles. | Remove the waiver from the non-prod profile, or move it to the prod profile (overlay) it is meant for. |
809
+ | `[W103] ... Applied runtime policy waiver for production profile (checks: ...)` | A production profile's `spec.security.waivers.runtimePolicy` suppressed CDS-SEC-090 violations; CDS reports the waiver so it stays visible in security output. | Confirm the waiver is still justified and its `reason` is accurate; see `docs/security-rules.md` (Warnings). |
810
+ | `[W104] ... runtimePolicy is set but has no effect for profile class ...` | `spec.security.waivers.runtimePolicy` is declared on a non-prod profile, where CDS-SEC-090 and its waiver only apply to prod-class profiles. | Remove the waiver from the non-prod profile, or move it to the prod profile (overlay) it is meant for. |
797
811
 
798
812
  All diagnostics print with their error code and YAML path (e.g. `spec.modules[1].config`), so search the profile file for that path to find the exact line to fix.
799
813
 
@@ -934,6 +948,8 @@ Please read these first:
934
948
  - [CONTRIBUTING.md](CONTRIBUTING.md)
935
949
  - [docs/maintainer-merge-policy.md](docs/maintainer-merge-policy.md)
936
950
  - [SECURITY.md](SECURITY.md) — how to report a vulnerability
951
+ - [ACCESSIBILITY.md](ACCESSIBILITY.md) — our accessibility commitment and how
952
+ to report a barrier
937
953
  - [LEGAL.md](LEGAL.md) — license, code of conduct, security, support, and
938
954
  regulatory-compliance documentation index
939
955
  - [CHANGELOG.md](CHANGELOG.md)
@@ -949,10 +965,12 @@ Development helper tools are located in the gitignored `tools/` directory. See
949
965
  - [Quickstart](README.md#-quickstart) — get running in 5 minutes
950
966
  - [CLI Reference](docs/cli-reference.md) — full command/flag table and `[profile]` resolution rules
951
967
  - [How CDS Works](docs/how-it-works.md) — C4 + sequence diagrams of the validate → plan → render engine
952
- - [Kubernetes Target](docs/kubernetes.md): Helm rendering and isolated local k3s workflow
968
+ - [Kubernetes Target](docs/kubernetes.md): Helm rendering, Docker Compose migration guide, and isolated local k3s workflow — with ready-made example profiles (`profiles/local-kubernetes-example`, `profiles/production-kubernetes-example` with its `prod` overlay)
953
969
  - [From Docker Compose to CDS Profile](docs/from-docker-to-cds-profile.md) — complete transformation guide
954
970
  - [Architecture](docs/architecture.md) — design and core concepts
955
971
  - [Modules](docs/modules.md) — how to structure reusable components
972
+ - [Workload Runtime API](docs/runtime-api.md) — `cds-runtime`: named database connections for Python workloads
973
+ - [Production Hardening Checklist](docs/production-hardening-checklist.md) — control-to-owner mapping and the operator verification procedure for a production profile
956
974
  - [Roadmap](docs/roadmap.md) — planned features and milestones
957
975
 
958
976
  ---