nthlayer-generate 1.0.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 (343) hide show
  1. nthlayer_generate-1.0.0/PKG-INFO +392 -0
  2. nthlayer_generate-1.0.0/README.md +346 -0
  3. nthlayer_generate-1.0.0/pyproject.toml +138 -0
  4. nthlayer_generate-1.0.0/setup.cfg +4 -0
  5. nthlayer_generate-1.0.0/src/nthlayer_generate/__init__.py +5 -0
  6. nthlayer_generate-1.0.0/src/nthlayer_generate/alertmanager/__init__.py +24 -0
  7. nthlayer_generate-1.0.0/src/nthlayer_generate/alertmanager/config.py +265 -0
  8. nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/__init__.py +17 -0
  9. nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/loader.py +206 -0
  10. nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/models.py +190 -0
  11. nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/validator.py +258 -0
  12. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/__init__.py +52 -0
  13. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/alerts.py +374 -0
  14. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/apply.py +289 -0
  15. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/backstage.py +121 -0
  16. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dashboard.py +148 -0
  17. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dashboard_validate.py +219 -0
  18. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dependencies.py +151 -0
  19. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/docs.py +122 -0
  20. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/environments.py +473 -0
  21. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/__init__.py +114 -0
  22. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/json_fmt.py +71 -0
  23. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/junit.py +134 -0
  24. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/markdown.py +173 -0
  25. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/models.py +80 -0
  26. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/sarif.py +273 -0
  27. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate.py +97 -0
  28. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate_alerts.py +128 -0
  29. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate_loki.py +139 -0
  30. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/identity.py +586 -0
  31. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/init.py +490 -0
  32. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/lint.py +99 -0
  33. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/migrate.py +188 -0
  34. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/ownership.py +306 -0
  35. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/pagerduty.py +183 -0
  36. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/plan.py +254 -0
  37. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/recommend_metrics.py +395 -0
  38. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/recording_rules.py +126 -0
  39. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/setup.py +594 -0
  40. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/simulate.py +332 -0
  41. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/slo.py +429 -0
  42. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/templates.py +68 -0
  43. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/topology.py +232 -0
  44. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/ux.py +398 -0
  45. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate.py +132 -0
  46. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_metadata.py +184 -0
  47. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_slo.py +512 -0
  48. nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_spec.py +154 -0
  49. nthlayer_generate-1.0.0/src/nthlayer_generate/clients/__init__.py +6 -0
  50. nthlayer_generate-1.0.0/src/nthlayer_generate/clients/base.py +19 -0
  51. nthlayer_generate-1.0.0/src/nthlayer_generate/clients/cortex.py +9 -0
  52. nthlayer_generate-1.0.0/src/nthlayer_generate/clients/pagerduty.py +9 -0
  53. nthlayer_generate-1.0.0/src/nthlayer_generate/clients/slack.py +11 -0
  54. nthlayer_generate-1.0.0/src/nthlayer_generate/config/__init__.py +54 -0
  55. nthlayer_generate-1.0.0/src/nthlayer_generate/config/cli.py +545 -0
  56. nthlayer_generate-1.0.0/src/nthlayer_generate/config/integrations.py +367 -0
  57. nthlayer_generate-1.0.0/src/nthlayer_generate/config/loader.py +311 -0
  58. nthlayer_generate-1.0.0/src/nthlayer_generate/config/secrets/__init__.py +490 -0
  59. nthlayer_generate-1.0.0/src/nthlayer_generate/config/secrets/backends.py +430 -0
  60. nthlayer_generate-1.0.0/src/nthlayer_generate/config/settings.py +78 -0
  61. nthlayer_generate-1.0.0/src/nthlayer_generate/core/__init__.py +45 -0
  62. nthlayer_generate-1.0.0/src/nthlayer_generate/core/errors.py +54 -0
  63. nthlayer_generate-1.0.0/src/nthlayer_generate/core/tiers.py +32 -0
  64. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/__init__.py +55 -0
  65. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/builder_sdk.py +717 -0
  66. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/intents.py +711 -0
  67. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/manifest_builder.py +190 -0
  68. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/models.py +257 -0
  69. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/panel_spec.py +467 -0
  70. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/resolver.py +372 -0
  71. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/sdk_adapter.py +497 -0
  72. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/__init__.py +179 -0
  73. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/base.py +52 -0
  74. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/base_intent.py +341 -0
  75. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/consul_intent.py +92 -0
  76. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/elasticsearch_intent.py +170 -0
  77. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/etcd_intent.py +98 -0
  78. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/haproxy_intent.py +106 -0
  79. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/http_intent.py +127 -0
  80. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/kafka_intent.py +74 -0
  81. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/kubernetes.py +273 -0
  82. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/mongodb_intent.py +75 -0
  83. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/mysql_intent.py +93 -0
  84. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/nats_intent.py +91 -0
  85. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/nginx_intent.py +117 -0
  86. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/postgresql_intent.py +208 -0
  87. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/pulsar_intent.py +91 -0
  88. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/rabbitmq_intent.py +114 -0
  89. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/redis_intent.py +161 -0
  90. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/stream_intent.py +114 -0
  91. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/traefik_intent.py +95 -0
  92. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/worker_intent.py +114 -0
  93. nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/validator.py +214 -0
  94. nthlayer_generate-1.0.0/src/nthlayer_generate/demo.py +1243 -0
  95. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/__init__.py +40 -0
  96. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/discovery.py +484 -0
  97. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/models.py +24 -0
  98. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/__init__.py +48 -0
  99. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/backstage.py +466 -0
  100. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/base.py +135 -0
  101. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/consul.py +517 -0
  102. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/etcd.py +359 -0
  103. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/kubernetes.py +682 -0
  104. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/prometheus.py +371 -0
  105. nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/zookeeper.py +398 -0
  106. nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/__init__.py +19 -0
  107. nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/classifier.py +108 -0
  108. nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/client.py +268 -0
  109. nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/models.py +61 -0
  110. nthlayer_generate-1.0.0/src/nthlayer_generate/domain/__init__.py +3 -0
  111. nthlayer_generate-1.0.0/src/nthlayer_generate/domain/models.py +24 -0
  112. nthlayer_generate-1.0.0/src/nthlayer_generate/generators/__init__.py +23 -0
  113. nthlayer_generate-1.0.0/src/nthlayer_generate/generators/alerts.py +322 -0
  114. nthlayer_generate-1.0.0/src/nthlayer_generate/generators/backstage.py +304 -0
  115. nthlayer_generate-1.0.0/src/nthlayer_generate/generators/docs.py +619 -0
  116. nthlayer_generate-1.0.0/src/nthlayer_generate/generators/sloth.py +468 -0
  117. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/__init__.py +47 -0
  118. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/models.py +15 -0
  119. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/normalizer.py +23 -0
  120. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership.py +23 -0
  121. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/__init__.py +27 -0
  122. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/backstage.py +11 -0
  123. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/base.py +15 -0
  124. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/codeowners.py +161 -0
  125. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/declared.py +98 -0
  126. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/kubernetes.py +11 -0
  127. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/pagerduty.py +11 -0
  128. nthlayer_generate-1.0.0/src/nthlayer_generate/identity/resolver.py +11 -0
  129. nthlayer_generate-1.0.0/src/nthlayer_generate/integrations/__init__.py +10 -0
  130. nthlayer_generate-1.0.0/src/nthlayer_generate/integrations/pagerduty.py +338 -0
  131. nthlayer_generate-1.0.0/src/nthlayer_generate/logging.py +33 -0
  132. nthlayer_generate-1.0.0/src/nthlayer_generate/loki/__init__.py +27 -0
  133. nthlayer_generate-1.0.0/src/nthlayer_generate/loki/generator.py +405 -0
  134. nthlayer_generate-1.0.0/src/nthlayer_generate/loki/models.py +83 -0
  135. nthlayer_generate-1.0.0/src/nthlayer_generate/loki/templates.py +883 -0
  136. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/__init__.py +31 -0
  137. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/discovery.py +145 -0
  138. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/models.py +143 -0
  139. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/recommender.py +256 -0
  140. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/__init__.py +61 -0
  141. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/go.py +72 -0
  142. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/jvm.py +114 -0
  143. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/nodejs.py +73 -0
  144. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/python.py +63 -0
  145. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/__init__.py +10 -0
  146. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/aliases.py +140 -0
  147. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/otel_semconv.py +108 -0
  148. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/__init__.py +14 -0
  149. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/api.py +130 -0
  150. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/cache.py +103 -0
  151. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/database_client.py +109 -0
  152. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/gateway.py +138 -0
  153. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/grpc.py +120 -0
  154. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/queue_consumer.py +116 -0
  155. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/registry.py +113 -0
  156. nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/worker.py +101 -0
  157. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/__init__.py +23 -0
  158. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/engine.py +57 -0
  159. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/handlers.py +500 -0
  160. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/plan_builder.py +33 -0
  161. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/registry.py +63 -0
  162. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/results.py +67 -0
  163. nthlayer_generate-1.0.0/src/nthlayer_generate/orchestrator.py +239 -0
  164. nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/__init__.py +36 -0
  165. nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/defaults.py +279 -0
  166. nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/naming.py +124 -0
  167. nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/orchestration.py +310 -0
  168. nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/resources.py +689 -0
  169. nthlayer_generate-1.0.0/src/nthlayer_generate/policies/__init__.py +7 -0
  170. nthlayer_generate-1.0.0/src/nthlayer_generate/policies/engine.py +70 -0
  171. nthlayer_generate-1.0.0/src/nthlayer_generate/policies/models.py +66 -0
  172. nthlayer_generate-1.0.0/src/nthlayer_generate/policies/rules.py +144 -0
  173. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/__init__.py +16 -0
  174. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/__main__.py +4 -0
  175. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/base.py +23 -0
  176. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/cli.py +81 -0
  177. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/grafana.py +21 -0
  178. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/lock.py +19 -0
  179. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/mimir.py +19 -0
  180. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/pagerduty.py +17 -0
  181. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/prometheus.py +17 -0
  182. nthlayer_generate-1.0.0/src/nthlayer_generate/providers/registry.py +25 -0
  183. nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/__init__.py +23 -0
  184. nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/builder.py +365 -0
  185. nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/manifest_builder.py +634 -0
  186. nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/models.py +100 -0
  187. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/__init__.py +36 -0
  188. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/engine.py +577 -0
  189. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/graph.py +64 -0
  190. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/models.py +247 -0
  191. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/output.py +97 -0
  192. nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/what_if.py +93 -0
  193. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/__init__.py +53 -0
  194. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/alerts.py +444 -0
  195. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/calculator.py +300 -0
  196. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/ceiling.py +244 -0
  197. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/dependencies.py +365 -0
  198. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/models.py +24 -0
  199. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/parser.py +167 -0
  200. nthlayer_generate-1.0.0/src/nthlayer_generate/slos/pipeline.py +255 -0
  201. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/__init__.py +41 -0
  202. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/alerting.py +216 -0
  203. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/builtin_templates/__init__.py +1 -0
  204. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/contracts.py +181 -0
  205. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/custom_templates.py +104 -0
  206. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_alerts.py +198 -0
  207. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_detection.py +204 -0
  208. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_gates.py +149 -0
  209. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_merger.py +152 -0
  210. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environments.py +198 -0
  211. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/helpers.py +94 -0
  212. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/loader.py +570 -0
  213. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/manifest.py +827 -0
  214. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/models.py +168 -0
  215. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/opensrm_parser.py +670 -0
  216. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/parser.py +270 -0
  217. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/template.py +96 -0
  218. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/template_loader.py +94 -0
  219. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/templates.py +72 -0
  220. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/validator.py +263 -0
  221. nthlayer_generate-1.0.0/src/nthlayer_generate/specs/variable_substitution.py +116 -0
  222. nthlayer_generate-1.0.0/src/nthlayer_generate/topology/__init__.py +33 -0
  223. nthlayer_generate-1.0.0/src/nthlayer_generate/topology/enrichment.py +147 -0
  224. nthlayer_generate-1.0.0/src/nthlayer_generate/topology/models.py +108 -0
  225. nthlayer_generate-1.0.0/src/nthlayer_generate/topology/serializers.py +162 -0
  226. nthlayer_generate-1.0.0/src/nthlayer_generate/user_config.py +107 -0
  227. nthlayer_generate-1.0.0/src/nthlayer_generate/validation/__init__.py +75 -0
  228. nthlayer_generate-1.0.0/src/nthlayer_generate/validation/conftest.py +505 -0
  229. nthlayer_generate-1.0.0/src/nthlayer_generate/validation/metadata.py +660 -0
  230. nthlayer_generate-1.0.0/src/nthlayer_generate/validation/promql.py +342 -0
  231. nthlayer_generate-1.0.0/src/nthlayer_generate/validation/promruval.py +293 -0
  232. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/PKG-INFO +392 -0
  233. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/SOURCES.txt +341 -0
  234. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/dependency_links.txt +1 -0
  235. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/entry_points.txt +3 -0
  236. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/requires.txt +46 -0
  237. nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/top_level.txt +1 -0
  238. nthlayer_generate-1.0.0/tests/test_alert_pipeline.py +369 -0
  239. nthlayer_generate-1.0.0/tests/test_alerting_config.py +408 -0
  240. nthlayer_generate-1.0.0/tests/test_alertmanager.py +214 -0
  241. nthlayer_generate-1.0.0/tests/test_alerts.py +719 -0
  242. nthlayer_generate-1.0.0/tests/test_backstage_generator.py +476 -0
  243. nthlayer_generate-1.0.0/tests/test_budget_policy.py +188 -0
  244. nthlayer_generate-1.0.0/tests/test_cli_alerts.py +357 -0
  245. nthlayer_generate-1.0.0/tests/test_cli_apply.py +880 -0
  246. nthlayer_generate-1.0.0/tests/test_cli_dashboard.py +331 -0
  247. nthlayer_generate-1.0.0/tests/test_cli_dashboard_validate.py +554 -0
  248. nthlayer_generate-1.0.0/tests/test_cli_environments.py +545 -0
  249. nthlayer_generate-1.0.0/tests/test_cli_formatters.py +645 -0
  250. nthlayer_generate-1.0.0/tests/test_cli_generate.py +257 -0
  251. nthlayer_generate-1.0.0/tests/test_cli_generate_alerts.py +255 -0
  252. nthlayer_generate-1.0.0/tests/test_cli_generate_loki.py +413 -0
  253. nthlayer_generate-1.0.0/tests/test_cli_identity.py +316 -0
  254. nthlayer_generate-1.0.0/tests/test_cli_lint.py +244 -0
  255. nthlayer_generate-1.0.0/tests/test_cli_pagerduty.py +369 -0
  256. nthlayer_generate-1.0.0/tests/test_cli_plan.py +330 -0
  257. nthlayer_generate-1.0.0/tests/test_cli_setup.py +944 -0
  258. nthlayer_generate-1.0.0/tests/test_cli_slo.py +956 -0
  259. nthlayer_generate-1.0.0/tests/test_cli_templates.py +191 -0
  260. nthlayer_generate-1.0.0/tests/test_cli_ux.py +730 -0
  261. nthlayer_generate-1.0.0/tests/test_cli_validate.py +271 -0
  262. nthlayer_generate-1.0.0/tests/test_cli_validate_metadata.py +260 -0
  263. nthlayer_generate-1.0.0/tests/test_cli_validate_slo.py +261 -0
  264. nthlayer_generate-1.0.0/tests/test_cli_validate_spec.py +544 -0
  265. nthlayer_generate-1.0.0/tests/test_clients.py +69 -0
  266. nthlayer_generate-1.0.0/tests/test_config_cli.py +991 -0
  267. nthlayer_generate-1.0.0/tests/test_config_loader.py +691 -0
  268. nthlayer_generate-1.0.0/tests/test_config_secrets_backends.py +857 -0
  269. nthlayer_generate-1.0.0/tests/test_config_secrets_init.py +861 -0
  270. nthlayer_generate-1.0.0/tests/test_conftest_validation.py +360 -0
  271. nthlayer_generate-1.0.0/tests/test_contract_validation.py +777 -0
  272. nthlayer_generate-1.0.0/tests/test_core_errors.py +207 -0
  273. nthlayer_generate-1.0.0/tests/test_core_tiers.py +200 -0
  274. nthlayer_generate-1.0.0/tests/test_critical_models.py +111 -0
  275. nthlayer_generate-1.0.0/tests/test_custom_templates.py +307 -0
  276. nthlayer_generate-1.0.0/tests/test_dashboard_generation.py +292 -0
  277. nthlayer_generate-1.0.0/tests/test_dashboard_templates.py +355 -0
  278. nthlayer_generate-1.0.0/tests/test_dashboards_builder_sdk.py +1017 -0
  279. nthlayer_generate-1.0.0/tests/test_dashboards_models.py +825 -0
  280. nthlayer_generate-1.0.0/tests/test_dashboards_resolver.py +565 -0
  281. nthlayer_generate-1.0.0/tests/test_dashboards_validator.py +497 -0
  282. nthlayer_generate-1.0.0/tests/test_demo.py +1130 -0
  283. nthlayer_generate-1.0.0/tests/test_demo_app_auth.py +70 -0
  284. nthlayer_generate-1.0.0/tests/test_dependencies.py +267 -0
  285. nthlayer_generate-1.0.0/tests/test_deps_discovery.py +356 -0
  286. nthlayer_generate-1.0.0/tests/test_deps_provider_backstage.py +454 -0
  287. nthlayer_generate-1.0.0/tests/test_deps_provider_consul.py +657 -0
  288. nthlayer_generate-1.0.0/tests/test_deps_provider_etcd.py +692 -0
  289. nthlayer_generate-1.0.0/tests/test_deps_provider_kubernetes.py +538 -0
  290. nthlayer_generate-1.0.0/tests/test_deps_provider_zookeeper.py +640 -0
  291. nthlayer_generate-1.0.0/tests/test_discovery_client.py +896 -0
  292. nthlayer_generate-1.0.0/tests/test_docs_generator.py +422 -0
  293. nthlayer_generate-1.0.0/tests/test_domain_models.py +162 -0
  294. nthlayer_generate-1.0.0/tests/test_env_flag.py +195 -0
  295. nthlayer_generate-1.0.0/tests/test_environment_commands.py +467 -0
  296. nthlayer_generate-1.0.0/tests/test_generators_alerts.py +159 -0
  297. nthlayer_generate-1.0.0/tests/test_generators_backstage.py +133 -0
  298. nthlayer_generate-1.0.0/tests/test_generators_docs.py +129 -0
  299. nthlayer_generate-1.0.0/tests/test_generators_sloth.py +182 -0
  300. nthlayer_generate-1.0.0/tests/test_hybrid_dashboard_builder.py +243 -0
  301. nthlayer_generate-1.0.0/tests/test_identity.py +437 -0
  302. nthlayer_generate-1.0.0/tests/test_init.py +569 -0
  303. nthlayer_generate-1.0.0/tests/test_integrations_pagerduty.py +220 -0
  304. nthlayer_generate-1.0.0/tests/test_intent_templates.py +292 -0
  305. nthlayer_generate-1.0.0/tests/test_loki.py +257 -0
  306. nthlayer_generate-1.0.0/tests/test_metadata_validation.py +422 -0
  307. nthlayer_generate-1.0.0/tests/test_metrics_discovery.py +208 -0
  308. nthlayer_generate-1.0.0/tests/test_metrics_recommender.py +506 -0
  309. nthlayer_generate-1.0.0/tests/test_mimir_provider.py +184 -0
  310. nthlayer_generate-1.0.0/tests/test_multi_environment_integration.py +458 -0
  311. nthlayer_generate-1.0.0/tests/test_opensrm.py +2507 -0
  312. nthlayer_generate-1.0.0/tests/test_orchestrator.py +1077 -0
  313. nthlayer_generate-1.0.0/tests/test_ownership.py +506 -0
  314. nthlayer_generate-1.0.0/tests/test_pagerduty.py +192 -0
  315. nthlayer_generate-1.0.0/tests/test_pagerduty_module.py +259 -0
  316. nthlayer_generate-1.0.0/tests/test_pagerduty_orchestration.py +483 -0
  317. nthlayer_generate-1.0.0/tests/test_pagerduty_resources.py +736 -0
  318. nthlayer_generate-1.0.0/tests/test_policy_engine.py +249 -0
  319. nthlayer_generate-1.0.0/tests/test_policy_handler.py +184 -0
  320. nthlayer_generate-1.0.0/tests/test_policy_models.py +140 -0
  321. nthlayer_generate-1.0.0/tests/test_policy_rules.py +367 -0
  322. nthlayer_generate-1.0.0/tests/test_prometheus_provider.py +415 -0
  323. nthlayer_generate-1.0.0/tests/test_provider_grafana.py +88 -0
  324. nthlayer_generate-1.0.0/tests/test_provider_pagerduty.py +88 -0
  325. nthlayer_generate-1.0.0/tests/test_providers_lock.py +187 -0
  326. nthlayer_generate-1.0.0/tests/test_recording_rules.py +428 -0
  327. nthlayer_generate-1.0.0/tests/test_sdk_adapter.py +730 -0
  328. nthlayer_generate-1.0.0/tests/test_simulate_cli.py +31 -0
  329. nthlayer_generate-1.0.0/tests/test_simulate_engine.py +133 -0
  330. nthlayer_generate-1.0.0/tests/test_simulate_graph.py +77 -0
  331. nthlayer_generate-1.0.0/tests/test_simulate_models.py +186 -0
  332. nthlayer_generate-1.0.0/tests/test_simulate_what_if.py +75 -0
  333. nthlayer_generate-1.0.0/tests/test_slo_alerts.py +518 -0
  334. nthlayer_generate-1.0.0/tests/test_slo_ceiling.py +522 -0
  335. nthlayer_generate-1.0.0/tests/test_slo_cli.py +317 -0
  336. nthlayer_generate-1.0.0/tests/test_slos.py +987 -0
  337. nthlayer_generate-1.0.0/tests/test_specs.py +384 -0
  338. nthlayer_generate-1.0.0/tests/test_sync_awesome_alerts.py +439 -0
  339. nthlayer_generate-1.0.0/tests/test_templates.py +332 -0
  340. nthlayer_generate-1.0.0/tests/test_topology.py +430 -0
  341. nthlayer_generate-1.0.0/tests/test_user_config.py +234 -0
  342. nthlayer_generate-1.0.0/tests/test_validation.py +193 -0
  343. nthlayer_generate-1.0.0/tests/test_validation_promruval.py +515 -0
@@ -0,0 +1,392 @@
1
+ Metadata-Version: 2.4
2
+ Name: nthlayer-generate
3
+ Version: 1.0.0
4
+ Summary: NthLayer - The Missing Layer of Reliability
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: nthlayer-common>=0.1.5
8
+ Requires-Dist: grafana-foundation-sdk>=0.0.11
9
+ Requires-Dist: pydantic<3.0.0,>=2.7.0
10
+ Requires-Dist: pydantic-settings<3.0.0,>=2.2.1
11
+ Requires-Dist: httpx<0.29.0,>=0.27.0
12
+ Requires-Dist: pagerduty<7.0.0,>=6.0.0
13
+ Requires-Dist: structlog<25.0.0,>=24.1.0
14
+ Requires-Dist: pyyaml<7.0.0,>=6.0.1
15
+ Requires-Dist: rich<15.0.0,>=13.7.0
16
+ Requires-Dist: rich-argparse<2.0.0,>=1.4.0
17
+ Requires-Dist: questionary<3.0.0,>=2.0.0
18
+ Requires-Dist: cachetools<7.0.0,>=5.3.0
19
+ Requires-Dist: opentelemetry-semantic-conventions>=0.60b1
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest<10.0.0,>=8.2.0; extra == "dev"
22
+ Requires-Dist: pytest-asyncio<2.0.0,>=0.23.0; extra == "dev"
23
+ Requires-Dist: pytest-cov<8.0.0,>=5.0.0; extra == "dev"
24
+ Requires-Dist: respx<0.23.0,>=0.21.0; extra == "dev"
25
+ Requires-Dist: ruff<0.15.0,>=0.4.0; extra == "dev"
26
+ Requires-Dist: mypy<1.20.0,>=1.10.0; extra == "dev"
27
+ Requires-Dist: types-requests>=2.31.0; extra == "dev"
28
+ Requires-Dist: types-python-dateutil>=2.8.19; extra == "dev"
29
+ Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
30
+ Requires-Dist: anyio<5.0.0,>=4.3.0; extra == "dev"
31
+ Requires-Dist: kubernetes<36.0.0,>=28.0.0; extra == "dev"
32
+ Provides-Extra: docs
33
+ Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
34
+ Requires-Dist: mkdocs-minify-plugin>=0.8.0; extra == "docs"
35
+ Provides-Extra: kubernetes
36
+ Requires-Dist: kubernetes<36.0.0,>=28.0.0; extra == "kubernetes"
37
+ Provides-Extra: zookeeper
38
+ Requires-Dist: kazoo<3.0.0,>=2.9.0; extra == "zookeeper"
39
+ Provides-Extra: etcd
40
+ Requires-Dist: etcd3<1.0.0,>=0.12.0; extra == "etcd"
41
+ Provides-Extra: service-discovery
42
+ Requires-Dist: kazoo<3.0.0,>=2.9.0; extra == "service-discovery"
43
+ Requires-Dist: etcd3<1.0.0,>=0.12.0; extra == "service-discovery"
44
+ Provides-Extra: aws
45
+ Requires-Dist: boto3<2.0.0,>=1.34.0; extra == "aws"
46
+
47
+ <div align="center">
48
+ <a href="https://github.com/rsionnach/nthlayer">
49
+ <img src="presentations/public/nthlayer_dark_banner.png" alt="NthLayer" width="400">
50
+ </a>
51
+ <br><br>
52
+ </div>
53
+
54
+ # NthLayer
55
+
56
+ **Reliability as code. Pure compiler.**
57
+
58
+ Define reliability requirements in a manifest. Generate dashboards, alerts, SLOs, and documentation β€” deterministically, every time.
59
+
60
+ [![Status: Alpha](https://img.shields.io/badge/Status-Alpha-orange?style=for-the-badge)](https://github.com/rsionnach/nthlayer)
61
+ [![PyPI](https://img.shields.io/pypi/v/nthlayer?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/nthlayer/)
62
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE.txt)
63
+ [![Alert Rules](https://img.shields.io/badge/Alert_Rules-593+-red?style=for-the-badge&logo=prometheus&logoColor=white)](https://github.com/samber/awesome-prometheus-alerts)
64
+
65
+ ## TL;DR
66
+
67
+ ```bash
68
+ pip install nthlayer
69
+ nthlayer init
70
+ nthlayer apply service.yaml
71
+ ```
72
+
73
+ ---
74
+
75
+ ## ⚠️ The Problem
76
+
77
+ Reliability decisions happen too late. Teams set SLOs in isolation, deploy without checking error budgets, and discover missing metrics during incidents. Dashboards are inconsistent. Alerts are copy-pasted. Nobody validates whether a 99.99% target is even achievable given dependencies.
78
+
79
+ ## πŸ’‘ The Solution
80
+
81
+ NthLayer is a **pure compiler** for reliability infrastructure. Write a manifest, get artifacts:
82
+
83
+ ```
84
+ service.yaml β†’ validate β†’ apply
85
+ β”‚ β”‚
86
+ β”‚ └── Grafana dashboards, Prometheus alerts,
87
+ β”‚ recording rules, SLOs, PagerDuty config,
88
+ β”‚ Backstage entities, service docs
89
+ β”‚
90
+ └── SLO feasible? Dependencies support it? Metrics exist?
91
+ Policies pass? Ceiling valid?
92
+ ```
93
+
94
+ NthLayer generates. The [nthlayer-workers](https://github.com/rsionnach/nthlayer-workers) runtime (Tier 2) enforces, observes, and responds at runtime, with state held in [nthlayer-core](https://github.com/rsionnach/nthlayer-core) (Tier 1) and operator interaction via [nthlayer-bench](https://github.com/rsionnach/nthlayer-bench) (Tier 3).
95
+
96
+ ---
97
+
98
+ ## ⚑ Core Features
99
+
100
+ ### Artifact Generation
101
+
102
+ Generate dashboards, alerts, and SLOs from a single spec.
103
+
104
+ ```bash
105
+ $ nthlayer apply service.yaml
106
+
107
+ Generated:
108
+ β†’ dashboard.json (Grafana)
109
+ β†’ alerts.yaml (Prometheus)
110
+ β†’ recording-rules.yaml (Prometheus)
111
+ β†’ slos.yaml (OpenSLO)
112
+ β†’ backstage.json (Backstage entity)
113
+ ```
114
+
115
+ ### Dependency-Aware SLO Validation
116
+
117
+ Your SLO ceiling is your weakest dependency chain. NthLayer calculates it.
118
+
119
+ ```bash
120
+ $ nthlayer validate-slo payment-api
121
+
122
+ Target: 99.99% availability
123
+ Dependencies:
124
+ β†’ postgresql (99.95%)
125
+ β†’ redis (99.99%)
126
+ β†’ user-service (99.9%)
127
+
128
+ Serial availability: 99.84%
129
+ βœ— INFEASIBLE: Target exceeds dependency ceiling by 0.15%
130
+
131
+ Recommendation: Reduce target to 99.8% or improve user-service SLO
132
+ ```
133
+
134
+ ### Metric Recommendations
135
+
136
+ Enforce OpenTelemetry conventions. Know what's missing before production.
137
+
138
+ ```bash
139
+ $ nthlayer recommend-metrics payment-api
140
+
141
+ Required (SLO-critical):
142
+ βœ“ http.server.request.duration FOUND
143
+ βœ— http.server.active_requests MISSING
144
+
145
+ Run with --show-code for instrumentation examples.
146
+ ```
147
+
148
+ ### Monte Carlo SLO Simulation
149
+
150
+ Model failure scenarios before they happen.
151
+
152
+ ```bash
153
+ $ nthlayer simulate service.yaml --scenarios 10000
154
+
155
+ Monte Carlo Simulation (10,000 runs)
156
+ SLO: availability β‰₯ 99.9%
157
+ Result: 94.2% of scenarios meet target
158
+ P50 availability: 99.95%
159
+ P99 availability: 99.82%
160
+ Risk: 5.8% chance of SLO breach in 30d window
161
+ ```
162
+
163
+ ### Topology Export
164
+
165
+ Export dependency graphs for correlation engines.
166
+
167
+ ```bash
168
+ $ nthlayer topology export service.yaml --format json
169
+ $ nthlayer topology export service.yaml --format mermaid
170
+ $ nthlayer topology export service.yaml --format dot
171
+ ```
172
+
173
+ ### Policy Validation
174
+
175
+ Enforce organizational standards at build time.
176
+
177
+ ```bash
178
+ $ nthlayer validate service.yaml --policies policies.yaml
179
+
180
+ βœ“ required_fields: ownership.runbook present
181
+ βœ— tier_constraint: critical services require deployment gates
182
+ βœ“ dependency_rule: all critical deps have SLOs
183
+ ```
184
+
185
+ ---
186
+
187
+ ## πŸš€ Quick Start
188
+
189
+ ```bash
190
+ # Install
191
+ pip install nthlayer
192
+
193
+ # Create a service spec
194
+ nthlayer init
195
+
196
+ # Validate and generate
197
+ nthlayer apply service.yaml
198
+ ```
199
+
200
+ ### Minimal `service.yaml`
201
+
202
+ ```yaml
203
+ name: payment-api
204
+ tier: critical
205
+ type: api
206
+ team: payments
207
+
208
+ dependencies:
209
+ - postgresql
210
+ - redis
211
+ ```
212
+
213
+ NthLayer also supports the [OpenSRM format](https://rsionnach.github.io/nthlayer/concepts/opensrm/) (`apiVersion: opensrm/v1`) for contracts, deployment gates, and more. See [full spec reference](https://rsionnach.github.io/nthlayer/reference/service-yaml/) for all options.
214
+
215
+ ---
216
+
217
+ ## πŸ”„ CI/CD Integration
218
+
219
+ ```yaml
220
+ # GitHub Actions
221
+ - name: Validate reliability
222
+ run: |
223
+ nthlayer validate service.yaml
224
+ nthlayer validate-slo service.yaml
225
+ nthlayer apply service.yaml --output-dir generated/
226
+ ```
227
+
228
+ For runtime enforcement (deployment gates, drift detection, error budget checks), use [`nthlayer-workers`](https://github.com/rsionnach/nthlayer-workers) β€” the runtime tier:
229
+
230
+ ```yaml
231
+ - name: Gate deployment
232
+ run: |
233
+ nthlayer-workers gate --service payment-api
234
+ ```
235
+
236
+ The runtime tier reads SLOs and dependency declarations from the same OpenSRM manifests this generator consumes. Verdicts and assessments flow through [`nthlayer-core`](https://github.com/rsionnach/nthlayer-core)'s HTTP API.
237
+
238
+ Works with: **GitHub Actions**, **GitLab CI**, **ArgoCD**, **Tekton**, **Jenkins**
239
+
240
+ ---
241
+
242
+ ## 🎯 How It's Different
243
+
244
+ | Traditional Approach | NthLayer |
245
+ |---------------------|----------|
246
+ | Set SLOs in isolation | Validate against dependency chains |
247
+ | Manual dashboard creation | Generate from spec |
248
+ | Copy-paste alerts | 593+ alert templates, auto-selected |
249
+ | Discover missing metrics in incidents | Enforce before deployment |
250
+ | "Is this ready?" = opinion | "Is this ready?" = deterministic check |
251
+
252
+ ---
253
+
254
+ ## πŸ“š Documentation
255
+
256
+ **[Full Documentation](https://rsionnach.github.io/nthlayer/)** - Comprehensive guides and reference.
257
+
258
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/rsionnach/nthlayer)
259
+
260
+ | Guide | Description |
261
+ |-------|-------------|
262
+ | [Quick Start](https://rsionnach.github.io/nthlayer/getting-started/quick-start/) | Get running in 5 minutes |
263
+ | [Dependency Discovery](https://rsionnach.github.io/nthlayer/features/dependencies/) | Automatic dependency mapping |
264
+ | [CI/CD Integration](https://rsionnach.github.io/nthlayer/guides/cicd/) | Pipeline setup |
265
+ | [CLI Reference](https://rsionnach.github.io/nthlayer/reference/cli/) | All commands |
266
+
267
+ ---
268
+
269
+ ## πŸ—ΊοΈ Roadmap
270
+
271
+ ### Generate (this repo)
272
+ - [x] Artifact generation (dashboards, alerts, SLOs, recording rules, Loki alerts)
273
+ - [x] Dependency-aware SLO validation
274
+ - [x] Metric recommendations (OpenTelemetry conventions)
275
+ - [x] Monte Carlo SLO simulation
276
+ - [x] Policy validation (build-time)
277
+ - [x] Topology export (JSON, Mermaid, DOT)
278
+ - [x] OpenSRM manifest format (`opensrm/v1`)
279
+ - [x] Identity resolution & ownership
280
+ - [x] Backstage entity generation
281
+ - [x] Service documentation generation
282
+ - [x] CI/CD GitHub Action
283
+ - [ ] Agentic inference (`nthlayer infer`)
284
+ - [ ] MCP server integration
285
+ - [ ] Backstage plugin
286
+
287
+ ### Runtime tier ([nthlayer-workers](https://github.com/rsionnach/nthlayer-workers))
288
+
289
+ What was previously the standalone `nthlayer-observe` repo plus four agentic components is now consolidated into a single Tier-2 worker process with five modules:
290
+
291
+ - [x] **observe** β€” SLO collection, drift detection, dependency/topology discovery, deploy gate
292
+ - [x] **measure** β€” judgment SLO evaluation, governance ratchet, autonomy-level reduction
293
+ - [x] **correlate** β€” session-window event correlation, topology drift, contract divergence
294
+ - [x] **respond** β€” incident response coordinator (situation-shaped triggers, capture-at-write-time escalation)
295
+ - [x] **learn** β€” outcome resolution, calibration signals, retrospective generation
296
+
297
+ Backed by [nthlayer-core](https://github.com/rsionnach/nthlayer-core) (Tier 1: HTTP API, verdict store, case management, manifest catalogue) and operated via [nthlayer-bench](https://github.com/rsionnach/nthlayer-bench) (Tier 3: Textual TUI for SREs).
298
+
299
+ ---
300
+
301
+ ## Agentic Inference (Planned)
302
+
303
+ `nthlayer infer` will use a model to analyse a codebase and propose an OpenSRM manifest for it. The model examines the code, identifies services, infers appropriate SLO targets, and generates a draft `service.reliability.yaml` that NthLayer then validates and generates artifacts from.
304
+
305
+ This follows the **Zero Framework Cognition** boundary applied across the OpenSRM ecosystem: the model provides judgment (what SLOs does this service need?), and NthLayer provides transport (validate the manifest, generate the monitoring artifacts). Clean boundary between reasoning and deterministic transformation. Architectural context: [opensrm/docs/superpowers/](https://github.com/rsionnach/opensrm/tree/main/docs/superpowers).
306
+
307
+ ---
308
+
309
+ ## OpenSRM Ecosystem
310
+
311
+ NthLayer is one piece of a six-repo ecosystem. The architecture has three runtime tiers; this repo (`nthlayer-generate`) sits outside the runtime tiers as a build-time compiler, feeding manifests forward.
312
+
313
+ ```
314
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
315
+ β”‚ OpenSRM Manifest β”‚
316
+ β”‚ (the shared contract) β”‚
317
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
318
+ β”‚
319
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
320
+ β–Ό β–Ό
321
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
322
+ β”‚ nthlayer-generateβ”‚ β”‚ nthlayer-core β”‚
323
+ β”‚ (build-time) β”‚ β”‚ (Tier 1) β”‚
324
+ β”‚ β”‚ β”‚ HTTP API Β· β”‚
325
+ β”‚ specs β†’ Grafana, β”‚ β”‚ verdict store Β· β”‚
326
+ β”‚ Prometheus, SLOs,β”‚ β”‚ case mgmt Β· β”‚
327
+ β”‚ Backstage, docs β”‚ β”‚ manifests β”‚
328
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”˜
329
+ β”‚ β”‚ HTTP only
330
+ β”‚ deployed β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
331
+ β–Ό β”‚ β”‚
332
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
333
+ β”‚ Live infra β”‚ β”‚ nthlayer-workersβ”‚ β”‚ nthlayer-bench β”‚
334
+ β”‚ (Prometheus, β”‚ obs β”‚ (Tier 2) β”‚ β”‚ (Tier 3) β”‚
335
+ β”‚ Grafana, etc.) β”‚ ─────│ β”‚ β”‚ Textual TUI for β”‚
336
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ observeΒ·measure β”‚ β”‚ SREs: situation β”‚
337
+ β”‚ correlateΒ·respondβ”‚ β”‚ board, case β”‚
338
+ β”‚ Β·learn β”‚ β”‚ bench, approvals β”‚
339
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
340
+
341
+ Learning loop:
342
+ workers.learn retrospectives β†’ manifest updates β†’ nthlayer-generate
343
+ regenerates β†’ workers refine thresholds β†’ operators ratify in bench
344
+ ```
345
+
346
+ **How nthlayer-generate fits in:**
347
+
348
+ - Reads OpenSRM manifests and emits the monitoring infrastructure (Prometheus rules, Grafana dashboards, recording rules, Backstage entities, service docs) that the runtime tier and live observability stack rely on
349
+ - Pure compiler β€” deterministic, stateless, no LLM, no runtime side effects
350
+ - Verdicts and assessments produced by `nthlayer-workers` modules emit OTel side-effects (`gen_ai.decision.*`, `gen_ai.override.*`) that flow into Prometheus; this generator can be configured to produce dashboards for those metrics alongside service dashboards
351
+ - Exports service topology that `workers.correlate` uses for topology-aware signal correlation
352
+ - Post-incident retrospectives produced by `workers.learn` feed back into manifest updates that regenerate via this compiler β€” closing the loop
353
+
354
+ Each component works alone. Someone who just needs reliability-as-code adopts `nthlayer-generate` without needing the rest of the ecosystem.
355
+
356
+ | Repo | Role |
357
+ |---|---|
358
+ | [`opensrm`](https://github.com/rsionnach/opensrm) | The OpenSRM specification β€” the manifest format and language for declaring reliability |
359
+ | [`nthlayer`](https://github.com/rsionnach/nthlayer) | Project front door β€” documentation hub, GitHub Action delegating to this repo, docs site |
360
+ | [`nthlayer-common`](https://github.com/rsionnach/nthlayer-common) | Shared library: verdict model, manifest parser, LLM wrapper, error hierarchy, CoreAPIClient |
361
+ | [`nthlayer-generate`](https://github.com/rsionnach/nthlayer-generate) | The deterministic compiler (this repo) β€” specs to artefacts |
362
+ | [`nthlayer-core`](https://github.com/rsionnach/nthlayer-core) | **Tier 1** β€” HTTP API server, verdict store, case management, manifest catalogue (`pip install nthlayer`) |
363
+ | [`nthlayer-workers`](https://github.com/rsionnach/nthlayer-workers) | **Tier 2** β€” five worker modules: observe, measure, correlate, respond, learn |
364
+ | [`nthlayer-bench`](https://github.com/rsionnach/nthlayer-bench) | **Tier 3** β€” Textual TUI for SREs |
365
+
366
+ ---
367
+
368
+ ## 🀝 Contributing
369
+
370
+ ```bash
371
+ # Install uv (https://docs.astral.sh/uv/)
372
+ curl -LsSf https://astral.sh/uv/install.sh | sh
373
+
374
+ git clone https://github.com/rsionnach/nthlayer-generate.git
375
+ cd nthlayer-generate
376
+ make setup # Install deps, start services
377
+ make test # Run tests
378
+ ```
379
+
380
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
381
+
382
+ ---
383
+
384
+ ## πŸ“„ License
385
+
386
+ MIT - See [LICENSE.txt](LICENSE.txt)
387
+
388
+ ---
389
+
390
+ ## πŸ™ Acknowledgments
391
+
392
+ Built on [grafana-foundation-sdk](https://github.com/grafana/grafana-foundation-sdk), [awesome-prometheus-alerts](https://github.com/samber/awesome-prometheus-alerts), [pint](https://github.com/cloudflare/pint), and [OpenSLO](https://github.com/openslo/openslo). Inspired by [Sloth](https://github.com/slok/sloth) and [autograf](https://github.com/FUSAKLA/autograf).