loom-kernel 1.7.0__tar.gz → 1.8.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 (1158) hide show
  1. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/ci-main.yml +1 -1
  2. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/ci-pr.yml +5 -5
  3. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/release.yml +2 -2
  4. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/CHANGELOG.md +68 -0
  5. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/PKG-INFO +1 -1
  6. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/a2a.md +50 -1
  7. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/mcp.md +10 -2
  8. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/tracing.md +25 -4
  9. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/pyproject.toml +16 -9
  10. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/sonar-project.properties +1 -10
  11. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/__init__.py +2 -2
  12. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_plan.py +12 -4
  13. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_capabilities.py +9 -7
  14. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/config.py +30 -14
  15. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +51 -5
  16. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +3 -3
  17. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/errors.py +3 -3
  18. loom_kernel-1.7.0/src/loom/ai/mcp_auth.py → loom_kernel-1.8.0/src/loom/ai/remote_auth.py +181 -45
  19. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_adapter.py +49 -0
  20. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_runtime_io.py +271 -8
  21. loom_kernel-1.7.0/tests/helpers/mcp_auth_plugin.py → loom_kernel-1.8.0/tests/helpers/remote_auth_plugin.py +10 -8
  22. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/spans.py +26 -2
  23. loom_kernel-1.8.0/tests/integration/ai/test_a2a_auth_wiring.py +207 -0
  24. loom_kernel-1.7.0/tests/integration/ai/test_mcp_auth_wiring.py → loom_kernel-1.8.0/tests/integration/ai/test_remote_auth_wiring.py +10 -10
  25. loom_kernel-1.8.0/tests/unit/ai/phases/test_remote_auth_plan.py +205 -0
  26. loom_kernel-1.7.0/tests/unit/ai/test_mcp_auth.py → loom_kernel-1.8.0/tests/unit/ai/test_remote_auth.py +183 -29
  27. loom_kernel-1.8.0/tests/unit/ai/test_remote_auth_settings.py +87 -0
  28. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_adapter.py +12 -0
  29. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +3 -3
  30. loom_kernel-1.8.0/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +625 -0
  31. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/uv.lock +1 -1
  32. loom_kernel-1.7.0/tests/unit/ai/phases/test_mcp_auth_plan.py +0 -111
  33. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/docs.yml +0 -0
  34. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.gitignore +0 -0
  35. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.pre-commit-config.yaml +0 -0
  36. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.readthedocs.yaml +0 -0
  37. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/LICENSE +0 -0
  38. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/Makefile +0 -0
  39. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/README.md +0 -0
  40. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/codecov.yml +0 -0
  41. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docker-compose.local.yaml +0 -0
  42. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/.gitkeep +0 -0
  43. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/custom.css +0 -0
  44. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/logo-transparent.png +0 -0
  45. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/logo.svg +0 -0
  46. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/artifacts.md +0 -0
  47. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/observability.md +0 -0
  48. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/overview.md +0 -0
  49. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/providers.md +0 -0
  50. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/adr/README.md +0 -0
  51. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/clean-architecture.md +0 -0
  52. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/overview.md +0 -0
  53. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/conf.py +0 -0
  54. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/examples.md +0 -0
  55. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/pipelines.md +0 -0
  56. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/testing.md +0 -0
  57. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/examples-repo/index.md +0 -0
  58. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/etl.md +0 -0
  59. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/rest.md +0 -0
  60. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/streaming.md +0 -0
  61. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/autocrud.md +0 -0
  62. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/celery.md +0 -0
  63. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/etl.md +0 -0
  64. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/fake-repo-examples.md +0 -0
  65. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/quickstart.md +0 -0
  66. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/use-case-dsl.md +0 -0
  67. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/index.rst +0 -0
  68. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/overview.md +0 -0
  69. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/ai.rst +0 -0
  70. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/core.rst +0 -0
  71. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/etl.rst +0 -0
  72. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/repository.rst +0 -0
  73. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/rest.rst +0 -0
  74. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/streaming.rst +0 -0
  75. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/testing.rst +0 -0
  76. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/index.rst +0 -0
  77. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/requirements.txt +0 -0
  78. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/autocrud.md +0 -0
  79. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/celery.md +0 -0
  80. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/examples.md +0 -0
  81. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/identity.md +0 -0
  82. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/sql.md +0 -0
  83. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/testing.md +0 -0
  84. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/use-case-dsl.md +0 -0
  85. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/bytewax.md +0 -0
  86. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/delivery.md +0 -0
  87. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/scripts/release/checkout_merged_release.py +0 -0
  88. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/__init__.py +0 -0
  89. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/__init__.py +0 -0
  90. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/_filters.py +0 -0
  91. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/_transport.py +0 -0
  92. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/__init__.py +0 -0
  93. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_binding.py +0 -0
  94. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_handlers.py +0 -0
  95. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_rpc.py +0 -0
  96. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/card.py +0 -0
  97. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/events.py +0 -0
  98. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/server.py +0 -0
  99. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/abc.py +0 -0
  100. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_compiler.py +0 -0
  101. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_symbols.py +0 -0
  102. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  103. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  104. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  105. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  106. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/__init__.py +0 -0
  107. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_envelope.py +0 -0
  108. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_schema.py +0 -0
  109. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_v1.py +0 -0
  110. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  111. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/describe.py +0 -0
  112. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/__init__.py +0 -0
  113. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  114. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  115. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  116. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  117. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  118. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  119. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  120. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  121. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  122. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  123. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  124. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
  125. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/__init__.py +0 -0
  126. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/endpoints.py +0 -0
  127. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/response.py +0 -0
  128. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/streaming.py +0 -0
  129. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/inference.py +0 -0
  130. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/registry.py +0 -0
  131. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/__init__.py +0 -0
  132. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_health.py +0 -0
  133. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
  134. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_limits.py +0 -0
  135. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_mcp.py +0 -0
  136. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/validate/__init__.py +0 -0
  137. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/validate/__main__.py +0 -0
  138. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/__init__.py +0 -0
  139. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/auto.py +0 -0
  140. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/bootstrap.py +0 -0
  141. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/config.py +0 -0
  142. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/constants.py +0 -0
  143. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/runner.py +0 -0
  144. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/service.py +0 -0
  145. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/async_bridge.py +0 -0
  146. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/__init__.py +0 -0
  147. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/core_model.py +0 -0
  148. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/protocol.py +0 -0
  149. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  150. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/__init__.py +0 -0
  151. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  152. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/kernel.py +0 -0
  153. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/__init__.py +0 -0
  154. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/__init__.py +0 -0
  155. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/backend.py +0 -0
  156. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/config.py +0 -0
  157. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/dependency.py +0 -0
  158. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/codec.py +0 -0
  159. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/decorators.py +0 -0
  160. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/dependency.py +0 -0
  161. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/gateway.py +0 -0
  162. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/keys.py +0 -0
  163. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/repository.py +0 -0
  164. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/serializer.py +0 -0
  165. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/__init__.py +0 -0
  166. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/adapter.py +0 -0
  167. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/base.py +0 -0
  168. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/field.py +0 -0
  169. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/introspection.py +0 -0
  170. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/compiler.py +0 -0
  171. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/__init__.py +0 -0
  172. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/_resolver_utils.py +0 -0
  173. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/binder.py +0 -0
  174. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/configurable.py +0 -0
  175. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/context.py +0 -0
  176. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/errors.py +0 -0
  177. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/keys.py +0 -0
  178. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/loader.py +0 -0
  179. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/model.py +0 -0
  180. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/observability.py +0 -0
  181. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/resolver.py +0 -0
  182. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/secrets.py +0 -0
  183. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/ssm.py +0 -0
  184. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/contracts/__init__.py +0 -0
  185. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/contracts/manifest.py +0 -0
  186. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/__init__.py +0 -0
  187. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/container.py +0 -0
  188. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/scope.py +0 -0
  189. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/__init__.py +0 -0
  190. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/_utils.py +0 -0
  191. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/base.py +0 -0
  192. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/interfaces.py +0 -0
  193. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/manifest.py +0 -0
  194. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/modules.py +0 -0
  195. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/__init__.py +0 -0
  196. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/compilable.py +0 -0
  197. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/compiler.py +0 -0
  198. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/events.py +0 -0
  199. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/executor.py +0 -0
  200. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/metrics.py +0 -0
  201. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/plan.py +0 -0
  202. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/__init__.py +0 -0
  203. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/codes.py +0 -0
  204. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/errors.py +0 -0
  205. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/__init__.py +0 -0
  206. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/eval.py +0 -0
  207. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/nodes.py +0 -0
  208. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/refs.py +0 -0
  209. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/__init__.py +0 -0
  210. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/context.py +0 -0
  211. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/identity.py +0 -0
  212. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/issuer.py +0 -0
  213. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/wire.py +0 -0
  214. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/__init__.py +0 -0
  215. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/base.py +0 -0
  216. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/describe.py +0 -0
  217. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/__init__.py +0 -0
  218. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/callback.py +0 -0
  219. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/context.py +0 -0
  220. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/handle.py +0 -0
  221. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/job.py +0 -0
  222. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/service.py +0 -0
  223. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/__init__.py +0 -0
  224. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/abc.py +0 -0
  225. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/config.py +0 -0
  226. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/registry.py +0 -0
  227. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/structlogger.py +0 -0
  228. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/__init__.py +0 -0
  229. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/base.py +0 -0
  230. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/enums.py +0 -0
  231. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/field.py +0 -0
  232. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/introspection.py +0 -0
  233. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/projection.py +0 -0
  234. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/relation.py +0 -0
  235. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/struct.py +0 -0
  236. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/timestamped.py +0 -0
  237. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/types.py +0 -0
  238. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/types_postgres.py +0 -0
  239. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/__init__.py +0 -0
  240. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/config.py +0 -0
  241. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/event.py +0 -0
  242. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/__init__.py +0 -0
  243. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/noop.py +0 -0
  244. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/otel.py +0 -0
  245. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/structlog.py +0 -0
  246. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/otel_ids.py +0 -0
  247. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/protocol.py +0 -0
  248. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/runtime.py +0 -0
  249. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/span.py +0 -0
  250. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/topology.py +0 -0
  251. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/plugins/__init__.py +0 -0
  252. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/plugins/entrypoints.py +0 -0
  253. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/__init__.py +0 -0
  254. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/loaders.py +0 -0
  255. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/runtime.py +0 -0
  256. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/__init__.py +0 -0
  257. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/__init__.py +0 -0
  258. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/query.py +0 -0
  259. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  260. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/repository.py +0 -0
  261. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  262. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
  263. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
  264. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  265. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/mutation.py +0 -0
  266. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/registration.py +0 -0
  267. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/registry.py +0 -0
  268. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  269. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  270. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  271. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  272. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  273. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  274. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  275. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  276. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  277. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  278. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  279. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  280. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  281. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  282. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  283. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  284. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  285. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  286. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  287. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  288. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/response/__init__.py +0 -0
  289. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/response/base.py +0 -0
  290. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/__init__.py +0 -0
  291. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/ref.py +0 -0
  292. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/resolver.py +0 -0
  293. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/runner.py +0 -0
  294. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/schema/__init__.py +0 -0
  295. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/schema/schema_mode.py +0 -0
  296. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/__init__.py +0 -0
  297. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/__init__.py +0 -0
  298. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/contracts.py +0 -0
  299. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/errors.py +0 -0
  300. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  301. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
  302. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  303. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
  304. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/config.py +0 -0
  305. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/roles.py +0 -0
  306. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/service.py +0 -0
  307. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/tracing/__init__.py +0 -0
  308. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/tracing/context.py +0 -0
  309. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/transport/__init__.py +0 -0
  310. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/transport/adapter.py +0 -0
  311. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/__init__.py +0 -0
  312. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/abc.py +0 -0
  313. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/context.py +0 -0
  314. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/__init__.py +0 -0
  315. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/_predicates.py +0 -0
  316. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/compute.py +0 -0
  317. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/constants.py +0 -0
  318. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/factory.py +0 -0
  319. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/field_ref.py +0 -0
  320. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/invoker.py +0 -0
  321. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/keys.py +0 -0
  322. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/markers.py +0 -0
  323. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/registry.py +0 -0
  324. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/rule.py +0 -0
  325. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/use_case.py +0 -0
  326. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/__init__.py +0 -0
  327. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/__init__.py +0 -0
  328. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_format_registry.py +0 -0
  329. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  330. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  331. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  332. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  333. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  334. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  335. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_merge.py +0 -0
  336. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_path_template.py +0 -0
  337. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_predicate.py +0 -0
  338. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  339. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  340. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  341. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_write_policy.py +0 -0
  342. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  343. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  344. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  345. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  346. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  347. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  348. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  349. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  350. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  351. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  352. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/provider.py +0 -0
  353. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  354. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  355. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  356. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  357. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  358. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  359. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_writer.py +0 -0
  360. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/provider.py +0 -0
  361. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  362. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  363. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  364. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  365. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  366. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  367. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_store.py +0 -0
  368. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/__init__.py +0 -0
  369. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_binding.py +0 -0
  370. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_compiler.py +0 -0
  371. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_errors.py +0 -0
  372. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_plan.py +0 -0
  373. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators.py +0 -0
  374. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  375. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators_step.py +0 -0
  376. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/__init__.py +0 -0
  377. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_format.py +0 -0
  378. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_read_options.py +0 -0
  379. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_utils.py +0 -0
  380. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_write_options.py +0 -0
  381. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  382. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  383. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  384. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  385. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  386. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  387. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from.py +0 -0
  388. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  389. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  390. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  391. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  392. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  393. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_client.py +0 -0
  394. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_file.py +0 -0
  395. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  396. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  397. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  398. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  399. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  400. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  401. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_into.py +0 -0
  402. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  403. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_table.py +0 -0
  404. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  405. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/__init__.py +0 -0
  406. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  407. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/_executor.py +0 -0
  408. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/__init__.py +0 -0
  409. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/_registry.py +0 -0
  410. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/__init__.py +0 -0
  411. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  412. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  413. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  414. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  415. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  416. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  417. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  418. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  419. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  420. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/targets/__init__.py +0 -0
  421. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  422. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/__init__.py +0 -0
  423. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_config.py +0 -0
  424. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_observer.py +0 -0
  425. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_records.py +0 -0
  426. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  427. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  428. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  429. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  430. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/__init__.py +0 -0
  431. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_builder.py +0 -0
  432. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_ops.py +0 -0
  433. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  434. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_runner.py +0 -0
  435. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_step.py +0 -0
  436. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  437. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  438. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/__init__.py +0 -0
  439. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_generics.py +0 -0
  440. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_params.py +0 -0
  441. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  442. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_process.py +0 -0
  443. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_sql.py +0 -0
  444. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step.py +0 -0
  445. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  446. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  447. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/__init__.py +0 -0
  448. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/_providers.py +0 -0
  449. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/_wiring.py +0 -0
  450. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/config_loader.py +0 -0
  451. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/core.py +0 -0
  452. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/errors.py +0 -0
  453. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/filtering.py +0 -0
  454. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runtime/__init__.py +0 -0
  455. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runtime/contracts.py +0 -0
  456. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/__init__.py +0 -0
  457. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/_contract.py +0 -0
  458. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/_schema.py +0 -0
  459. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/__init__.py +0 -0
  460. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_config.py +0 -0
  461. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_file_locator.py +0 -0
  462. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_locator.py +0 -0
  463. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/routing.py +0 -0
  464. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/__init__.py +0 -0
  465. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_result.py +0 -0
  466. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_runners.py +0 -0
  467. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_scenario.py +0 -0
  468. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_stubs.py +0 -0
  469. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/spark.py +0 -0
  470. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/__init__.py +0 -0
  471. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_async.py +0 -0
  472. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_config.py +0 -0
  473. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_ctx.py +0 -0
  474. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_meta.py +0 -0
  475. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_placeholders.py +0 -0
  476. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_summary.py +0 -0
  477. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/__init__.py +0 -0
  478. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_discovery.py +0 -0
  479. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  480. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_yaml.py +0 -0
  481. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/__init__.py +0 -0
  482. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_assemble.py +0 -0
  483. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_backfill.py +0 -0
  484. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  485. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_body.py +0 -0
  486. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_common.py +0 -0
  487. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_factory.py +0 -0
  488. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_hooks.py +0 -0
  489. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  490. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_run_name.py +0 -0
  491. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_runtime.py +0 -0
  492. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_signature.py +0 -0
  493. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_stages.py +0 -0
  494. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/__init__.py +0 -0
  495. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_model.py +0 -0
  496. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_s3.py +0 -0
  497. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_store.py +0 -0
  498. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/__init__.py +0 -0
  499. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_event.py +0 -0
  500. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_factory.py +0 -0
  501. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_port.py +0 -0
  502. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_slack.py +0 -0
  503. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/__init__.py +0 -0
  504. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_flow.py +0 -0
  505. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  506. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_manifest.py +0 -0
  507. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_task_run.py +0 -0
  508. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/__init__.py +0 -0
  509. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/adapter.py +0 -0
  510. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/kafka.py +0 -0
  511. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/lifecycle.py +0 -0
  512. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/middleware.py +0 -0
  513. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/py.typed +0 -0
  514. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/__init__.py +0 -0
  515. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/_body.py +0 -0
  516. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/adapter.py +0 -0
  517. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/__init__.py +0 -0
  518. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/abc.py +0 -0
  519. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/config.py +0 -0
  520. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/jwt.py +0 -0
  521. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/middleware.py +0 -0
  522. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/autocrud.py +0 -0
  523. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/compiler.py +0 -0
  524. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/constants.py +0 -0
  525. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/cors.py +0 -0
  526. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/errors.py +0 -0
  527. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/__init__.py +0 -0
  528. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/_errors.py +0 -0
  529. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  530. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/app.py +0 -0
  531. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/auto.py +0 -0
  532. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/openapi.py +0 -0
  533. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/response.py +0 -0
  534. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  535. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/sql.py +0 -0
  536. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/middleware.py +0 -0
  537. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/model.py +0 -0
  538. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/rest_adapter.py +0 -0
  539. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/__init__.py +0 -0
  540. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  541. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  542. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  543. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  544. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  545. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  546. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  547. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  548. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  549. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  550. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  551. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  552. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  553. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  554. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  555. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  556. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  557. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  558. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/runner.py +0 -0
  559. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/__init__.py +0 -0
  560. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  561. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  562. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_errors.py +0 -0
  563. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_plan.py +0 -0
  564. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  565. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
  566. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/__init__.py +0 -0
  567. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_errors.py +0 -0
  568. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_exceptions.py +0 -0
  569. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_message.py +0 -0
  570. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_tracing.py +0 -0
  571. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_typing.py +0 -0
  572. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/graph/__init__.py +0 -0
  573. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/graph/_flow.py +0 -0
  574. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/__init__.py +0 -0
  575. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_codec.py +0 -0
  576. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_config.py +0 -0
  577. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_errors.py +0 -0
  578. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  579. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_message.py +0 -0
  580. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_record.py +0 -0
  581. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_wire.py +0 -0
  582. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  583. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  584. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  585. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  586. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  587. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  588. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  589. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  590. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  591. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/__init__.py +0 -0
  592. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  593. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_config.py +0 -0
  594. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_event.py +0 -0
  595. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  596. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/__init__.py +0 -0
  597. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  598. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  599. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  600. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  601. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  602. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  603. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_fork.py +0 -0
  604. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  605. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  606. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  607. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_router.py +0 -0
  608. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_shape.py +0 -0
  609. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_sink.py +0 -0
  610. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_step.py +0 -0
  611. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  612. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/common.py +0 -0
  613. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/config.py +0 -0
  614. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_with.py +0 -0
  615. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/refs.py +0 -0
  616. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/testing.py +0 -0
  617. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/__init__.py +0 -0
  618. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/agents.py +0 -0
  619. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/golden.py +0 -0
  620. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/http_harness.py +0 -0
  621. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/in_memory.py +0 -0
  622. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/repository_harness.py +0 -0
  623. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/runner.py +0 -0
  624. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/__init__.py +0 -0
  625. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/conftest.py +0 -0
  626. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/__init__.py +0 -0
  627. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/__init__.py +0 -0
  628. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/test_contract_fake.py +0 -0
  629. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
  630. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/observability/__init__.py +0 -0
  631. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
  632. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/__init__.py +0 -0
  633. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/baselines/.gitkeep +0 -0
  634. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/outputs/.gitkeep +0 -0
  635. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/plans/.gitkeep +0 -0
  636. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/__init__.py +0 -0
  637. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/pydantic_ai_engine.py +0 -0
  638. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/__init__.py +0 -0
  639. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/__init__.py +0 -0
  640. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/conftest.py +0 -0
  641. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_a2a.py +0 -0
  642. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_agent_specs_source.py +0 -0
  643. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_a2a.py +0 -0
  644. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_client_factories.py +0 -0
  645. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_gate.py +0 -0
  646. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_capabilities.py +0 -0
  647. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_describe.py +0 -0
  648. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_endpoints.py +0 -0
  649. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_grant_wiring.py +0 -0
  650. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_health_probe.py +0 -0
  651. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_limits.py +0 -0
  652. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_live_provider.py +0 -0
  653. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
  654. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_provider_portability.py +0 -0
  655. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_runtime.py +0 -0
  656. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_streaming.py +0 -0
  657. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_transport.py +0 -0
  658. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
  659. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  660. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  661. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
  662. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/conftest.py +0 -0
  663. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/__init__.py +0 -0
  664. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/bootstrap/__init__.py +0 -0
  665. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
  666. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/__init__.py +0 -0
  667. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
  668. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  669. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  670. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  671. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/__init__.py +0 -0
  672. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  673. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  674. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
  675. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
  676. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/__init__.py +0 -0
  677. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  678. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  679. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/etl/__init__.py +0 -0
  680. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/etl/test_runner_integration.py +0 -0
  681. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/__init__.py +0 -0
  682. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/__init__.py +0 -0
  683. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
  684. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  685. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  686. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
  687. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/main.py +0 -0
  688. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/manifest.py +0 -0
  689. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/__init__.py +0 -0
  690. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
  691. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/model.py +0 -0
  692. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  693. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/interface.py +0 -0
  694. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/jobs.py +0 -0
  695. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/model.py +0 -0
  696. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/relations.py +0 -0
  697. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/repository.py +0 -0
  698. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  699. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
  700. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/model.py +0 -0
  701. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  702. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/schemas.py +0 -0
  703. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
  704. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/__init__.py +0 -0
  705. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/init/01_users_roles.sql +0 -0
  706. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/test_clickhouse_integration.py +0 -0
  707. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/__init__.py +0 -0
  708. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/__init__.py +0 -0
  709. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/conftest.py +0 -0
  710. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
  711. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
  712. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/test_into_table_integration.py +0 -0
  713. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/support/__init__.py +0 -0
  714. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
  715. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/__init__.py +0 -0
  716. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/__init__.py +0 -0
  717. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/conftest.py +0 -0
  718. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/__init__.py +0 -0
  719. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
  720. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
  721. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_binding.py +0 -0
  722. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
  723. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
  724. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
  725. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
  726. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
  727. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
  728. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
  729. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
  730. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
  731. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
  732. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
  733. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
  734. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
  735. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
  736. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
  737. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
  738. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
  739. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
  740. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
  741. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
  742. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
  743. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
  744. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
  745. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
  746. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
  747. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/__init__.py +0 -0
  748. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/conftest.py +0 -0
  749. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_capabilities.py +0 -0
  750. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_limits.py +0 -0
  751. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_model_role.py +0 -0
  752. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_output.py +0 -0
  753. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_validate_cli.py +0 -0
  754. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_a2a_base_url.py +0 -0
  755. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_a2a_card.py +0 -0
  756. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_compiler.py +0 -0
  757. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_compiler_offline.py +0 -0
  758. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_config.py +0 -0
  759. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_declarative_envelope.py +0 -0
  760. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_describe.py +0 -0
  761. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
  762. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_error_factories.py +0 -0
  763. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_fake_engine.py +0 -0
  764. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_loopback_plaintext.py +0 -0
  765. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_no_extras_import.py +0 -0
  766. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_public_surface.py +0 -0
  767. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_registry.py +0 -0
  768. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_schema_emission.py +0 -0
  769. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_secret_containment.py +0 -0
  770. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
  771. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
  772. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
  773. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
  774. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/__init__.py +0 -0
  775. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_auto.py +0 -0
  776. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
  777. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_config.py +0 -0
  778. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
  779. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_runner.py +0 -0
  780. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
  781. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/__init__.py +0 -0
  782. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/backend/__init__.py +0 -0
  783. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  784. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/__init__.py +0 -0
  785. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  786. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  787. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  788. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/__init__.py +0 -0
  789. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
  790. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_config_wiring.py +0 -0
  791. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_gateway_config.py +0 -0
  792. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/__init__.py +0 -0
  793. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_base.py +0 -0
  794. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_field.py +0 -0
  795. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_patch.py +0 -0
  796. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_introspection.py +0 -0
  797. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/__init__.py +0 -0
  798. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_binder.py +0 -0
  799. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_config.py +0 -0
  800. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_configurable.py +0 -0
  801. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_context.py +0 -0
  802. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_resolver_utils.py +0 -0
  803. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_secrets.py +0 -0
  804. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_ssm.py +0 -0
  805. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/di/__init__.py +0 -0
  806. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/di/test_container.py +0 -0
  807. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/discovery/__init__.py +0 -0
  808. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/discovery/test_manifest.py +0 -0
  809. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/__init__.py +0 -0
  810. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_caller_binding.py +0 -0
  811. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_compiler.py +0 -0
  812. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor.py +0 -0
  813. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
  814. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
  815. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_metrics.py +0 -0
  816. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_plan.py +0 -0
  817. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/errors/__init__.py +0 -0
  818. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/errors/test_errors.py +0 -0
  819. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/expr/__init__.py +0 -0
  820. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/expr/test_expr.py +0 -0
  821. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/__init__.py +0 -0
  822. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_context.py +0 -0
  823. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_identity.py +0 -0
  824. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_wire.py +0 -0
  825. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/introspection/__init__.py +0 -0
  826. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/introspection/test_describe.py +0 -0
  827. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/__init__.py +0 -0
  828. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/conftest.py +0 -0
  829. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_callback.py +0 -0
  830. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_context.py +0 -0
  831. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_handle.py +0 -0
  832. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_inline_service.py +0 -0
  833. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_job.py +0 -0
  834. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/__init__.py +0 -0
  835. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/test_config.py +0 -0
  836. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/test_registry.py +0 -0
  837. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/__init__.py +0 -0
  838. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_model.py +0 -0
  839. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_struct.py +0 -0
  840. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_timestamped.py +0 -0
  841. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/__init__.py +0 -0
  842. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_message_id_generator.py +0 -0
  843. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_observers.py +0 -0
  844. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
  845. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
  846. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_provider_modes.py +0 -0
  847. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_runtime.py +0 -0
  848. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
  849. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/__init__.py +0 -0
  850. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/test_entrypoints.py +0 -0
  851. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/test_import_containment.py +0 -0
  852. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/projection/__init__.py +0 -0
  853. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/projection/test_runtime.py +0 -0
  854. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/__init__.py +0 -0
  855. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/__init__.py +0 -0
  856. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/conftest.py +0 -0
  857. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/test_query.py +0 -0
  858. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  859. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
  860. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
  861. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
  862. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
  863. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
  864. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  865. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
  866. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  867. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  868. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/routing/__init__.py +0 -0
  869. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/routing/test_routing.py +0 -0
  870. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/__init__.py +0 -0
  871. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/_fakes.py +0 -0
  872. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/conftest.py +0 -0
  873. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
  874. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
  875. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_config.py +0 -0
  876. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_isolation.py +0 -0
  877. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_null_service.py +0 -0
  878. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_pagination_limits.py +0 -0
  879. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
  880. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_role_policy.py +0 -0
  881. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_async_bridge.py +0 -0
  882. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_compiler_contracts.py +0 -0
  883. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_runner_contracts.py +0 -0
  884. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/tracing/__init__.py +0 -0
  885. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/tracing/test_context.py +0 -0
  886. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/__init__.py +0 -0
  887. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
  888. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  889. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  890. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/__init__.py +0 -0
  891. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_compute.py +0 -0
  892. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_factory.py +0 -0
  893. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
  894. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_invoker.py +0 -0
  895. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_markers.py +0 -0
  896. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_rule.py +0 -0
  897. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_use_case.py +0 -0
  898. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/__init__.py +0 -0
  899. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/__init__.py +0 -0
  900. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
  901. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
  902. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
  903. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_path_template.py +0 -0
  904. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
  905. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  906. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  907. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  908. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  909. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  910. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  911. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  912. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  913. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  914. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
  915. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
  916. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
  917. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  918. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
  919. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
  920. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
  921. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  922. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  923. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  924. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  925. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
  926. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
  927. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  928. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
  929. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
  930. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  931. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  932. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  933. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
  934. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/client_step/__init__.py +0 -0
  935. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/client_step/test_client_step.py +0 -0
  936. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/__init__.py +0 -0
  937. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  938. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
  939. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  940. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  941. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors.py +0 -0
  942. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  943. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  944. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
  945. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  946. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  947. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  948. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  949. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_structural.py +0 -0
  950. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  951. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  952. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/conftest.py +0 -0
  953. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/__init__.py +0 -0
  954. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/__init__.py +0 -0
  955. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
  956. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
  957. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
  958. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
  959. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
  960. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
  961. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
  962. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
  963. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
  964. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/__init__.py +0 -0
  965. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
  966. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
  967. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_history_target.py +0 -0
  968. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_registry.py +0 -0
  969. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source.py +0 -0
  970. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source_json.py +0 -0
  971. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source_options.py +0 -0
  972. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_target.py +0 -0
  973. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_utils.py +0 -0
  974. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_variants.py +0 -0
  975. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_observer.py +0 -0
  976. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_records.py +0 -0
  977. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_store.py +0 -0
  978. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/__init__.py +0 -0
  979. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
  980. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
  981. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/conftest.py +0 -0
  982. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_builder.py +0 -0
  983. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_runner.py +0 -0
  984. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_step.py +0 -0
  985. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/__init__.py +0 -0
  986. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  987. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  988. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_step.py +0 -0
  989. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/__init__.py +0 -0
  990. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_contract.py +0 -0
  991. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_schema.py +0 -0
  992. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_table.py +0 -0
  993. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/__init__.py +0 -0
  994. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_merge.py +0 -0
  995. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_predicate.py +0 -0
  996. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  997. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  998. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/__init__.py +0 -0
  999. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
  1000. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  1001. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_locator.py +0 -0
  1002. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
  1003. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_route_build.py +0 -0
  1004. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  1005. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
  1006. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_config_loader.py +0 -0
  1007. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_executor.py +0 -0
  1008. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_executor_tracing.py +0 -0
  1009. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_format_registry.py +0 -0
  1010. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_module_contracts.py +0 -0
  1011. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
  1012. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
  1013. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_runner.py +0 -0
  1014. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_runner_errors.py +0 -0
  1015. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_spark_testing.py +0 -0
  1016. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/__init__.py +0 -0
  1017. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_runners.py +0 -0
  1018. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
  1019. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  1020. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/__init__.py +0 -0
  1021. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_backfill_flow.py +0 -0
  1022. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_config.py +0 -0
  1023. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_ctx.py +0 -0
  1024. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_etl_flow.py +0 -0
  1025. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_logging_bridge.py +0 -0
  1026. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_maintenance_flow.py +0 -0
  1027. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_manifest.py +0 -0
  1028. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_manifest_s3.py +0 -0
  1029. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_notify.py +0 -0
  1030. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_observer.py +0 -0
  1031. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_placeholders.py +0 -0
  1032. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_task_run_observer.py +0 -0
  1033. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_yaml_loader.py +0 -0
  1034. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/__init__.py +0 -0
  1035. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/test_adapter.py +0 -0
  1036. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/test_middleware.py +0 -0
  1037. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/release/test_checkout_merged_release.py +0 -0
  1038. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/release/test_release_workflow_contract.py +0 -0
  1039. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/__init__.py +0 -0
  1040. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/_fixture_app.py +0 -0
  1041. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_app_hardening.py +0 -0
  1042. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_auth_middleware.py +0 -0
  1043. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
  1044. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_autocrud.py +0 -0
  1045. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_cors.py +0 -0
  1046. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
  1047. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_fastapi_auto_persistence.py +0 -0
  1048. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_jwt_issuer.py +0 -0
  1049. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_jwt_middleware.py +0 -0
  1050. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_middleware.py +0 -0
  1051. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  1052. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_request_hardening.py +0 -0
  1053. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_response.py +0 -0
  1054. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_adapter.py +0 -0
  1055. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_compiler.py +0 -0
  1056. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_model.py +0 -0
  1057. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_route_rbac.py +0 -0
  1058. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_router_identity.py +0 -0
  1059. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_router_runtime.py +0 -0
  1060. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint.py +0 -0
  1061. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
  1062. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
  1063. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_serialization.py +0 -0
  1064. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/__init__.py +0 -0
  1065. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
  1066. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/cases.py +0 -0
  1067. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/conftest.py +0 -0
  1068. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
  1069. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
  1070. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
  1071. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
  1072. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
  1073. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
  1074. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
  1075. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runner.py +0 -0
  1076. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
  1077. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
  1078. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
  1079. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
  1080. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
  1081. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_storage.py +0 -0
  1082. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
  1083. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/__init__.py +0 -0
  1084. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/cases.py +0 -0
  1085. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
  1086. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_basics.py +0 -0
  1087. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
  1088. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_delivery.py +0 -0
  1089. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
  1090. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
  1091. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
  1092. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_router.py +0 -0
  1093. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_window.py +0 -0
  1094. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_with.py +0 -0
  1095. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/conftest.py +0 -0
  1096. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/__init__.py +0 -0
  1097. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/cases.py +0 -0
  1098. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
  1099. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_message.py +0 -0
  1100. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
  1101. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
  1102. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
  1103. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/__init__.py +0 -0
  1104. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
  1105. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
  1106. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/explode.py +0 -0
  1107. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
  1108. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/router.py +0 -0
  1109. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
  1110. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
  1111. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/conftest.py +0 -0
  1112. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
  1113. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
  1114. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/__init__.py +0 -0
  1115. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/cases.py +0 -0
  1116. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/conftest.py +0 -0
  1117. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/fakes.py +0 -0
  1118. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_client.py +0 -0
  1119. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_config.py +0 -0
  1120. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
  1121. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
  1122. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_message.py +0 -0
  1123. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
  1124. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
  1125. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
  1126. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
  1127. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
  1128. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
  1129. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
  1130. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/__init__.py +0 -0
  1131. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/conftest.py +0 -0
  1132. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
  1133. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
  1134. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
  1135. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_table_package.py +0 -0
  1136. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/__init__.py +0 -0
  1137. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/cases.py +0 -0
  1138. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/conftest.py +0 -0
  1139. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
  1140. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
  1141. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
  1142. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
  1143. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_registry.py +0 -0
  1144. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
  1145. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/support/__init__.py +0 -0
  1146. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/support/flow_cases.py +0 -0
  1147. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_expand_routes.py +0 -0
  1148. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_fork.py +0 -0
  1149. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_otel_observability.py +0 -0
  1150. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_routing.py +0 -0
  1151. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_testing_mongo.py +0 -0
  1152. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_with.py +0 -0
  1153. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/__init__.py +0 -0
  1154. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_golden.py +0 -0
  1155. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_http_harness.py +0 -0
  1156. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_identity_harness.py +0 -0
  1157. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_in_memory.py +0 -0
  1158. {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_runner.py +0 -0
@@ -31,7 +31,7 @@ jobs:
31
31
  pip install --only-binary :all: "uv==0.10.2"
32
32
 
33
33
  - name: Quality report (strict)
34
- uses: the-reacher-data/loom-actions/actions/python/quality-report@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
34
+ uses: the-reacher-data/loom-actions/actions/python/quality-report@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
35
35
  with:
36
36
  src-dir: src
37
37
  test-dir: tests
@@ -50,7 +50,7 @@ jobs:
50
50
  - name: Quality report (strict gate)
51
51
  id: quality
52
52
  continue-on-error: true
53
- uses: the-reacher-data/loom-actions/actions/python/quality-report@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
53
+ uses: the-reacher-data/loom-actions/actions/python/quality-report@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
54
54
  with:
55
55
  src-dir: src
56
56
  test-dir: tests
@@ -61,7 +61,7 @@ jobs:
61
61
 
62
62
  - name: Publish PR quality comment
63
63
  if: ${{ always() && steps.quality.outputs.report-file != '' }}
64
- uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
64
+ uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
65
65
  with:
66
66
  github-token: ${{ secrets.GITHUB_TOKEN }}
67
67
  tags: "<!-- loom-quality-report -->"
@@ -69,7 +69,7 @@ jobs:
69
69
 
70
70
  - name: Compute candidate prerelease version
71
71
  id: version
72
- uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
72
+ uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
73
73
  with:
74
74
  branch: ${{ github.head_ref }}
75
75
  prerelease: "true"
@@ -77,7 +77,7 @@ jobs:
77
77
  - name: Generate changelog preview
78
78
  id: changelog
79
79
  continue-on-error: true
80
- uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
80
+ uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
81
81
  with:
82
82
  mode: "pr"
83
83
  branch: ${{ github.event.pull_request.head.sha }}
@@ -88,7 +88,7 @@ jobs:
88
88
 
89
89
  - name: Publish PR changelog comment
90
90
  if: ${{ steps.changelog.outcome == 'success' && steps.changelog.outputs.output_path != '' }}
91
- uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
91
+ uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
92
92
  with:
93
93
  github-token: ${{ secrets.GITHUB_TOKEN }}
94
94
  tags: "<!-- changelog-preview -->,<!-- branch-source:${{ github.head_ref }} -->"
@@ -47,7 +47,7 @@ jobs:
47
47
 
48
48
  - name: Compute release version from merged branch
49
49
  id: version
50
- uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
50
+ uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
51
51
  with:
52
52
  branch: ${{ env.RELEASE_BRANCH }}
53
53
  prerelease: "false"
@@ -67,7 +67,7 @@ jobs:
67
67
  - name: Generate release changelog
68
68
  id: changelog
69
69
  if: ${{ steps.version.outputs.deploy == 'true' && github.event_name != 'workflow_dispatch' }}
70
- uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@e731576f4f9cf4ec2b36fddfc895d328c856d29f # v1
70
+ uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
71
71
  with:
72
72
  mode: "release"
73
73
  branch: ${{ env.RELEASE_BRANCH }}
@@ -1,3 +1,71 @@
1
+ # 🚀 Release 1.8.0 ([#147](https://github.com/the-reacher-data/loom-py/pull/147)) ([`1d9667e`](https://github.com/the-reacher-data/loom-py/commit/1d9667e3))
2
+
3
+
4
+ ## ✨ Features
5
+ ### ai
6
+ - **ai:** authenticate to remote A2A agents, and share one strategy registry ([#147](https://github.com/the-reacher-data/loom-py/pull/147))<br>
7
+ > `A2AAgentConfig.headers_ref` was declared, validated by the compiler and
8
+ > carried into the plan — then dropped, so an agent configured with
9
+ > credentials connected **unauthenticated, silently**. MCP at least refused.
10
+ >
11
+ > **BREAKING**: the entry-point group `loom.ai.mcp_auth` is renamed
12
+ > `loom.ai.remote_auth`, and `mcp_auth.py` becomes `remote_auth.py`. Anything
13
+ > registered under the old name stops being found. No deprecation cycle was
14
+ > run because the group shipped one release earlier with no consumers.
15
+ >
16
+ > One registry now serves both outbound transports: nothing about `bearer`,
17
+ > `oauth` or `static` is MCP-specific, since the contract is `httpx.Auth`.
18
+ > Sharing keys are scoped by transport, so an MCP server and an A2A agent of
19
+ > the same name remain two credentials. The credential is set on the client,
20
+ > so the card fetch — the *first* request of a session — carries it too.
21
+
22
+
23
+ ## 🐛 Fixes
24
+ ### ai
25
+ - **ai:** give a plugin the setting types its signature declares ([#150](https://github.com/the-reacher-data/loom-py/pull/150))<br>
26
+ > Auth settings arrive as strings, because each passes the inline-credential
27
+ > refusal, which admits no spaces. A strategy declaring `timeout: int` got
28
+ > `"30"`, and one declaring `verify: bool` got `"false"` — which is truthy, so
29
+ > a deployment asking to turn verification off got it turned on.
30
+ >
31
+ > A setting whose parameter declares `str`, `int`, `float` or `bool` is now
32
+ > converted to it; a custom type or an unannotated parameter is passed exactly
33
+ > as before, so no existing strategy changes behaviour.
34
+
35
+
36
+ ## 🧹 Chores
37
+ - **chore:** retire two expired Sonar suppressions and fix two lying test stubs ([#146](https://github.com/the-reacher-data/loom-py/pull/146))<br>
38
+ > Both suppressions carried a written expiry condition that the 1.7.0 split
39
+ > met; one pointed at a file that no longer exists. Two test stubs had
40
+ > silently stopped satisfying the protocols they stand in for.
41
+
42
+
43
+ # 🚀 Release 1.7.1 ([#143](https://github.com/the-reacher-data/loom-py/pull/143)) ([`0322dbb`](https://github.com/the-reacher-data/loom-py/commit/0322dbb2))
44
+
45
+
46
+ ## 🐛 Fixes
47
+ ### streaming
48
+ - **streaming:** emit a terminal span for outbound topic writes ([#143](https://github.com/the-reacher-data/loom-py/pull/143))<br>
49
+ > `TerminalReason.SINK_WRITE` has documented "written to a storage sink or an
50
+ > outbound topic" since 1.7.0, but the outbound half was never true: the Kafka
51
+ > sink partition had no observability runtime in reach, so a flow ending in
52
+ > `IntoTopic` produced a trace that stopped at its last node span.
53
+ >
54
+ > A message written to an outbound topic now emits one terminal span in its own
55
+ > trace, plus the same N+1 batch shape as the storage sink. Failed writes close
56
+ > failed and carry `terminal.failure_scope="batch"`, because the producer keeps
57
+ > one delivery error for a whole batch — without the marker a trace would claim
58
+ > that messages the broker acknowledged had failed. A batch diverted to a DLQ
59
+ > also closes failed: `send_batch_to_dlq` never flushes, so at span-close time
60
+ > the landing is unverified.
61
+ >
62
+ > The untraced path gained no branch: tracing is a wrapper returned only when
63
+ > bound, so a flow without observability runs exactly the code it ran before.
64
+ >
65
+ > Three of five death paths are now traced. Drop sinks and `Drain` still emit
66
+ > no terminal span.
67
+
68
+
1
69
  # 🚀 Release 1.7.0 ([#142](https://github.com/the-reacher-data/loom-py/pull/142)) ([`1a9240a`](https://github.com/the-reacher-data/loom-py/commit/1a9240a6))
2
70
 
3
71
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 1.7.0
3
+ Version: 1.8.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Typing :: Typed
@@ -36,7 +36,7 @@ ai:
36
36
  a2a_agents:
37
37
  oncall:
38
38
  url: https://oncall.partner.example.com/a2a/rota
39
- headers_ref: ONCALL_A2A_HEADERS
39
+ headers_ref: ${secrets:/loom/oncall/api-key} # stores e.g. X-API-Key=abc123
40
40
  ```
41
41
 
42
42
  At start-up the remote card is fetched and validated. An unreachable agent fails
@@ -57,6 +57,55 @@ The remote URL must be `https://`, with no credentials in its userinfo and no
57
57
  query string. Compilation refuses anything else, and the offending URL is
58
58
  redacted in the error message.
59
59
 
60
+ ### Authenticating to the remote agent
61
+
62
+ A remote agent declares its credential exactly as an MCP server does, and loom
63
+ resolves it through the same registry — see
64
+ [mcp.md § Authentication](mcp.md#authentication) for the full reference:
65
+
66
+ ```yaml
67
+ ai:
68
+ a2a_agents:
69
+ oncall:
70
+ url: https://oncall.partner.example.com/a2a/rota
71
+ headers_ref: ${secrets:/loom/oncall/api-key} # one Name=value pair
72
+ market:
73
+ url: https://market.partner.example.com/a2a
74
+ auth:
75
+ kind: bearer # Authorization: Bearer <token>
76
+ token_ref: ${secrets:/loom/market/token}
77
+ orders:
78
+ url: https://orders.internal.example.com/a2a
79
+ auth:
80
+ kind: agent-session # a strategy you register
81
+ session_url: https://orders.internal.example.com/auth/agent/session
82
+ bootstrap_ref: ${secrets:/agents/prod/agent-sales}
83
+ ```
84
+
85
+ The credential is set on the HTTP client, not on one request, so **every** call
86
+ carries it — including the card fetch, which is the *first* request of the
87
+ session. An agent that authenticates its card endpoint would otherwise fail
88
+ start-up before a skill was ever called.
89
+
90
+ `kind` names an entry point in the group `loom.ai.remote_auth`, the same group
91
+ MCP servers resolve against: the strategy contract is
92
+ [`httpx.Auth`](https://www.python-httpx.org/advanced/authentication/), which
93
+ knows nothing of either protocol, so a deployment registers its strategy once
94
+ and grants it to either transport. The one strategy an A2A agent cannot use is
95
+ `kind: oauth`, which delegates to the MCP client library's own flow; naming it
96
+ here is refused with `MCP_AUTH_STRATEGY_INVALID` rather than connecting without
97
+ the credential the deployment asked for.
98
+
99
+ What compilation guarantees is what it guarantees for an MCP server:
100
+ `headers_ref` and `auth` are **mutually exclusive** (`MCP_AUTH_CONFLICT`); a
101
+ `kind` nobody registers fails at compile time naming what is installed
102
+ (`MCP_AUTH_STRATEGY_UNKNOWN`); and no literal secret is accepted anywhere in the
103
+ block (`MCP_CREDENTIALS_INLINE`, and the rejection never repeats the value).
104
+
105
+ The authentication object is built **once per configured agent and shared by
106
+ every agent granted it**: the credential belongs to the deployment, so a
107
+ renewing strategy renews once rather than once per caller.
108
+
60
109
  ## Inbound — publishing your agent
61
110
 
62
111
  ```yaml
@@ -167,7 +167,7 @@ ai:
167
167
  bootstrap_ref: ${secrets:/agents/prod/agent-sales}
168
168
  ```
169
169
 
170
- `kind` names an entry point in the group `loom.ai.mcp_auth`; every other key in
170
+ `kind` names an entry point in the group `loom.ai.remote_auth`; every other key in
171
171
  the block is passed to it as a **keyword argument**. Loom registers three, all
172
172
  thin delegations to what the libraries already provide:
173
173
 
@@ -196,7 +196,7 @@ from **your own package**; loom does not change:
196
196
 
197
197
  ```toml
198
198
  # pyproject.toml of your own distribution
199
- [project.entry-points."loom.ai.mcp_auth"]
199
+ [project.entry-points."loom.ai.remote_auth"]
200
200
  agent-session = "my_package.auth:AgentSessionAuth"
201
201
  ```
202
202
 
@@ -254,6 +254,14 @@ server's read permissions to that prefix and log failed attempts per path.
254
254
  - A strategy that cannot be built from its settings fails at start-up with
255
255
  `MCP_AUTH_STRATEGY_INVALID`.
256
256
 
257
+ The group is `loom.ai.remote_auth`, not `loom.ai.mcp_auth`: one registry serves
258
+ the MCP servers of `ai.mcp_servers` **and** the remote agents of `ai.a2a_agents`
259
+ (see [a2a.md](a2a.md)), because the contract is `httpx.Auth` and knows neither
260
+ protocol. A strategy is registered once and granted to either. The one
261
+ exception is `kind: oauth`, which delegates to the MCP client library's own
262
+ flow: an A2A agent naming it is refused with `MCP_AUTH_STRATEGY_INVALID` rather
263
+ than connected without a credential.
264
+
257
265
  ### One instance per server
258
266
 
259
267
  The authentication object is built **once per server and shared by every agent
@@ -22,7 +22,7 @@ rather than emitting an unusable one.
22
22
  | --- | --- |
23
23
  | `transport:kafka_consume` | The consumer, from the inbound header — the message's birth |
24
24
  | `node:<flow>:<idx>` | Each node the message traverses |
25
- | `terminal:sink_write` | Written to a storage sink |
25
+ | `terminal:sink_write` | Written to a storage sink or an outbound Kafka topic |
26
26
  | `terminal:error_envelope` | Turned into an error envelope or routed to a DLQ |
27
27
  | `terminal:dropped_no_route` | Expanded or routed to zero rows |
28
28
 
@@ -112,6 +112,27 @@ broken.
112
112
  ratio, most batch spans are dropped along with most messages. What holds at
113
113
  every ratio is that an exported batch span links to exactly the participation
114
114
  spans that were also exported.
115
- - **`IntoTopic` outputs do not yet emit a terminal span.** A message written to
116
- an outbound topic ends its trace at its last node span. Storage sinks, error
117
- envelopes and no-route drops are covered.
115
+ - **Two death paths are still untraced.** `_DropSinkPartition` (an unrouted
116
+ branch or error kind) and `Drain` discard a message without a terminal span,
117
+ so `TerminalReason.DROPPED_NO_ROUTE` is not emitted on either. Three of the
118
+ five death paths — outbound topic, storage sink, error envelope — are traced.
119
+ - **A wire decode failure has no terminal span, and cannot have one.** A
120
+ `DecodeError` never became a message: it carries no `MessageMeta`, so there is
121
+ no trace id, no message id and no lineage to open a span in. Fabricating a
122
+ synthetic meta would invent a message that never existed.
123
+ - **A failed outbound batch fails every message in it.** The Kafka producer
124
+ keeps one pending delivery error and `flush()` raises it for the whole batch,
125
+ so a single rejected record closes all N terminal spans failed. Those spans
126
+ carry `terminal.failure_scope="batch"` to say the attribution is batch-wide,
127
+ not per record. Success carries no such attribute: `flush()` waited for every
128
+ record, so a successful death is per-message truth.
129
+ - **A batch diverted to a DLQ closes failed, with `terminal.dlq_topic` set.**
130
+ The diversion never flushes and swallows per-item failures, so at span-close
131
+ time the DLQ landing is unverified. The batch still commits, as it did before.
132
+ - **A delivery error can be attributed to the wrong batch.** The producer's
133
+ pending error is consumed by whichever `flush()` observes it, which may be the
134
+ next batch's. The terminal spans that close failed are then one batch late.
135
+ - **Epoch replay produces duplicate terminal spans.** Bytewax replays an epoch
136
+ from the last snapshot after a failure, so a message written twice records two
137
+ `terminal:sink_write` spans under one trace id. That is at-least-once delivery
138
+ being visible, not a tracing fault; deduplicate on `loom.batch_id`.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "loom-kernel"
3
- version = "1.7.0"
3
+ version = "1.8.0"
4
4
  description = "Loom Python project"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -138,13 +138,15 @@ celery = [
138
138
  [project.entry-points."loom.ai.engines"]
139
139
  pydantic-ai = "loom.ai.engines.pydantic_ai.provider:PydanticAIEngineProvider"
140
140
 
141
- # Authentication strategies for outbound MCP connections. A deployment plugs
142
- # in its own from its own package under the same group; loom ships only these
143
- # three thin delegations. See docs/ai/mcp.md.
144
- [project.entry-points."loom.ai.mcp_auth"]
145
- oauth = "loom.ai.mcp_auth:standard_oauth"
146
- bearer = "loom.ai.mcp_auth:bearer_token"
147
- static = "loom.ai.mcp_auth:static_headers"
141
+ # Authentication strategies for the remote endpoints loom calls out to: MCP
142
+ # servers and A2A agents alike, since the contract is httpx.Auth and knows
143
+ # nothing of either protocol. A deployment plugs in its own from its own
144
+ # package under the same group; loom ships only these three thin delegations.
145
+ # See docs/ai/mcp.md and docs/ai/a2a.md.
146
+ [project.entry-points."loom.ai.remote_auth"]
147
+ oauth = "loom.ai.remote_auth:standard_oauth"
148
+ bearer = "loom.ai.remote_auth:bearer_token"
149
+ static = "loom.ai.remote_auth:static_headers"
148
150
 
149
151
  [project.entry-points."loom.etl.backends"]
150
152
  polars = "loom.etl.backends.polars.provider:PolarsProvider"
@@ -267,6 +269,11 @@ extend-immutable-calls = [
267
269
 
268
270
  [tool.pyright]
269
271
  pythonVersion = "3.11"
272
+ # src only, deliberately. Checking tests as well surfaces 294 errors across
273
+ # eight rules — mostly stubs that no longer satisfy the protocol they stand in
274
+ # for. That is real signal and worth burning down, but it is a project, not a
275
+ # flag flip: turning it on without the cleanup would make the gate meaningless
276
+ # on its first run. Tracked in specs/feature/quality/typecheck_tests.md.
270
277
  include = [
271
278
  "src",
272
279
  ]
@@ -350,7 +357,7 @@ markers = [
350
357
 
351
358
  [tool.commitizen]
352
359
  name = "cz_conventional_commits"
353
- version = "1.7.0"
360
+ version = "1.8.0"
354
361
  tag_format = "v$version"
355
362
  version_files = [
356
363
  "pyproject.toml:project.version",
@@ -25,7 +25,7 @@ sonar.coverage.exclusions=tests/**,tests/**/*,**/.github/**,docs/**,docs/**/*
25
25
  # String(), DateTime(), Numeric()
26
26
  #
27
27
  # Renaming any of them would be a breaking public API change.
28
- sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40,e41,e42,e43,e44,e45,e46,e47,e48,e49,e50,e51
28
+ sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40,e41,e42,e43,e44,e45,e48,e49,e50,e51
29
29
 
30
30
  # Use-case DSL markers: Input, Load, LoadById, Exists — S100 (method) + S1542 (function)
31
31
  sonar.issue.ignore.multicriteria.e1.ruleKey=python:S100
@@ -209,15 +209,6 @@ sonar.issue.ignore.multicriteria.e45.resourceKey=**/etl/declarative/target/_hist
209
209
  # reasoning as IntoHistory above: an options object would hide the very names a
210
210
  # reader needs, and for a wiring function the parameter list IS the contract —
211
211
  # it is what tells you, at a glance, everything the runtime is handed.
212
- #
213
- # TEMPORARY for two of them: runtime.py and a2a/server.py are scheduled to be
214
- # split by responsibility (runtime/{_lifecycle,_mcp,_limits,_health}.py and the
215
- # a2a binding already extracted). Both signatures shrink with that split, so
216
- # e46 and e47 should be removed then rather than inherited.
217
- sonar.issue.ignore.multicriteria.e46.ruleKey=python:S107
218
- sonar.issue.ignore.multicriteria.e46.resourceKey=**/ai/runtime.py
219
- sonar.issue.ignore.multicriteria.e47.ruleKey=python:S107
220
- sonar.issue.ignore.multicriteria.e47.resourceKey=**/ai/a2a/server.py
221
212
  sonar.issue.ignore.multicriteria.e48.ruleKey=python:S107
222
213
  sonar.issue.ignore.multicriteria.e48.resourceKey=**/ai/fastapi/endpoints.py
223
214
  sonar.issue.ignore.multicriteria.e49.ruleKey=python:S107
@@ -20,10 +20,10 @@ from loom.ai.compiler._plan import (
20
20
  AgentPlan,
21
21
  CompiledA2ACapability,
22
22
  CompiledCapability,
23
- CompiledMcpAuth,
24
23
  CompiledMcpCapability,
25
24
  CompiledOutput,
26
25
  CompiledPythonCapability,
26
+ CompiledRemoteAuth,
27
27
  CompiledSkillsCapability,
28
28
  CompiledSqlCapability,
29
29
  CompiledUsecaseCapability,
@@ -38,10 +38,10 @@ __all__ = [
38
38
  "AgentPlan",
39
39
  "CompiledA2ACapability",
40
40
  "CompiledCapability",
41
- "CompiledMcpAuth",
42
41
  "CompiledMcpCapability",
43
42
  "CompiledOutput",
44
43
  "CompiledPythonCapability",
44
+ "CompiledRemoteAuth",
45
45
  "CompiledSkillsCapability",
46
46
  "CompiledSqlCapability",
47
47
  "CompiledUsecaseCapability",
@@ -81,8 +81,12 @@ class CompiledSqlCapability(LoomFrozenStruct, frozen=True, kw_only=True):
81
81
  max_result_bytes: int
82
82
 
83
83
 
84
- class CompiledMcpAuth(LoomFrozenStruct, frozen=True, kw_only=True):
85
- """Authentication strategy of one MCP server, resolved to a name and settings.
84
+ class CompiledRemoteAuth(LoomFrozenStruct, frozen=True, kw_only=True):
85
+ """Authentication strategy of one remote endpoint, resolved to name and settings.
86
+
87
+ One struct serves both outbound transports, MCP servers and A2A agents, as
88
+ the one registry that builds it does: the strategy contract is
89
+ ``httpx.Auth``, which knows nothing of either protocol.
86
90
 
87
91
  ``kind`` is separated from the rest of the ``auth`` block once, here, so the
88
92
  engine never re-reads configuration to find out which strategy to build.
@@ -90,7 +94,7 @@ class CompiledMcpAuth(LoomFrozenStruct, frozen=True, kw_only=True):
90
94
  plan is a frozen, hashable value.
91
95
 
92
96
  Attributes:
93
- kind: Strategy name registered in the ``loom.ai.mcp_auth`` group.
97
+ kind: Strategy name registered in the ``loom.ai.remote_auth`` group.
94
98
  settings: The rest of the ``auth`` block, passed to the strategy as
95
99
  keyword arguments in declaration order.
96
100
  """
@@ -125,7 +129,7 @@ class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
125
129
  server: str
126
130
  url: str
127
131
  headers_ref: str | None = None
128
- auth: CompiledMcpAuth | None = None
132
+ auth: CompiledRemoteAuth | None = None
129
133
  timeout_ms: int = 20000
130
134
  include: tuple[str, ...] = ()
131
135
  exclude: tuple[str, ...] = ()
@@ -176,6 +180,9 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
176
180
  agent: Configured agent name, carried for the self-description.
177
181
  url: Validated ``https://`` remote agent URL, free of credentials.
178
182
  headers_ref: Reference to deployment-resolved headers; never a secret.
183
+ Applied to every request the client makes, the card fetch included.
184
+ auth: Named authentication strategy, mutually exclusive with
185
+ ``headers_ref``; ``None`` when the agent needs no credential.
179
186
  include: Skill names or glob patterns to expose; empty means all.
180
187
  exclude: Skill names or glob patterns to omit, applied after ``include``.
181
188
  """
@@ -185,6 +192,7 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
185
192
  agent: str
186
193
  url: str
187
194
  headers_ref: str | None = None
195
+ auth: CompiledRemoteAuth | None = None
188
196
  include: tuple[str, ...] = ()
189
197
  exclude: tuple[str, ...] = ()
190
198
 
@@ -23,9 +23,9 @@ from loom.ai._filters import select_names
23
23
  from loom.ai.compiler._plan import (
24
24
  CompiledA2ACapability,
25
25
  CompiledCapability,
26
- CompiledMcpAuth,
27
26
  CompiledMcpCapability,
28
27
  CompiledPythonCapability,
28
+ CompiledRemoteAuth,
29
29
  CompiledSkillsCapability,
30
30
  CompiledSqlCapability,
31
31
  CompiledUsecaseCapability,
@@ -221,7 +221,7 @@ def _compile_mcp(capability: McpCapability, context: _Context) -> _HandlerResult
221
221
  server=capability.server,
222
222
  url=server.url,
223
223
  headers_ref=server.headers_ref,
224
- auth=_compile_mcp_auth(server.auth),
224
+ auth=_compile_auth(server.auth),
225
225
  timeout_ms=server.timeout_ms,
226
226
  include=capability.include,
227
227
  exclude=capability.exclude,
@@ -230,16 +230,17 @@ def _compile_mcp(capability: McpCapability, context: _Context) -> _HandlerResult
230
230
  )
231
231
 
232
232
 
233
- def _compile_mcp_auth(auth: Mapping[str, str] | None) -> CompiledMcpAuth | None:
233
+ def _compile_auth(auth: Mapping[str, str] | None) -> CompiledRemoteAuth | None:
234
234
  """Split a validated ``auth`` block into the strategy name and its settings.
235
235
 
236
- Configuration already refused a block whose ``kind`` names no registered
237
- strategy, so the split is the only work left: ``kind`` selects the entry
238
- point and everything else becomes its keyword arguments.
236
+ Shared by the ``mcp`` and ``a2a`` grants: both endpoints declare the same
237
+ block. Configuration already refused a block whose ``kind`` names no
238
+ registered strategy, so the split is the only work left: ``kind`` selects
239
+ the entry point and everything else becomes its keyword arguments.
239
240
  """
240
241
  if auth is None:
241
242
  return None
242
- return CompiledMcpAuth(
243
+ return CompiledRemoteAuth(
243
244
  kind=auth["kind"],
244
245
  settings=tuple((key, value) for key, value in auth.items() if key != "kind"),
245
246
  )
@@ -254,6 +255,7 @@ def _compile_a2a(capability: A2ACapability, context: _Context) -> _HandlerResult
254
255
  agent=capability.agent,
255
256
  url=agent.url,
256
257
  headers_ref=agent.headers_ref,
258
+ auth=_compile_auth(agent.auth),
257
259
  include=capability.include,
258
260
  exclude=capability.exclude,
259
261
  ),
@@ -34,7 +34,7 @@ from loom.ai.errors import (
34
34
  policy_out_of_range,
35
35
  )
36
36
  from loom.ai.inference import InferenceTarget
37
- from loom.ai.mcp_auth import is_strategy_registered, registered_strategy_names
37
+ from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
38
38
  from loom.core.model import LoomFrozenStruct
39
39
 
40
40
  # Conservative allowlist for a secret *reference*: a name, path, ARN or key id
@@ -191,7 +191,7 @@ class McpServerConfig(LoomFrozenStruct, frozen=True, kw_only=True):
191
191
  here; a bearer token belongs in ``auth: {kind: bearer}``.
192
192
  Mutually exclusive with ``auth``.
193
193
  auth: Named authentication strategy and its settings, flattened:
194
- ``kind`` selects an entry point registered in ``loom.ai.mcp_auth``
194
+ ``kind`` selects an entry point registered in ``loom.ai.remote_auth``
195
195
  and every other key is passed to it as a keyword argument.
196
196
  Mutually exclusive with ``headers_ref``.
197
197
  timeout_ms: Deadline of a single call to this server.
@@ -206,14 +206,26 @@ class McpServerConfig(LoomFrozenStruct, frozen=True, kw_only=True):
206
206
  class A2AAgentConfig(LoomFrozenStruct, frozen=True, kw_only=True):
207
207
  """One named remote A2A agent (``ai.a2a_agents.<name>``).
208
208
 
209
+ The credential is declared exactly as an MCP server declares it, and for
210
+ the same reason: the artifact names the agent, the deployment says how to
211
+ authenticate to it.
212
+
209
213
  Attributes:
210
214
  url: ``https://`` agent URL, free of userinfo and query string.
211
215
  headers_ref: Reference to headers resolved by the secrets resolver.
212
- Never a literal secret.
216
+ Never a literal secret. The resolved payload must be a single
217
+ ``Name=value`` header pair, a shape checked at start-up rather than
218
+ here; a bearer token belongs in ``auth: {kind: bearer}``.
219
+ Mutually exclusive with ``auth``.
220
+ auth: Named authentication strategy and its settings, flattened:
221
+ ``kind`` selects an entry point registered in ``loom.ai.remote_auth``
222
+ and every other key is passed to it as a keyword argument.
223
+ Mutually exclusive with ``headers_ref``.
213
224
  """
214
225
 
215
226
  url: str
216
227
  headers_ref: str | None = None
228
+ auth: dict[str, str] | None = None
217
229
 
218
230
 
219
231
  class AgentEndpointConfig(LoomFrozenStruct, frozen=True, kw_only=True):
@@ -342,19 +354,22 @@ def _validate_headers_ref(component: str, headers_ref: str | None) -> list[Agent
342
354
  return [mcp_credentials_inline(component, "headers_ref")]
343
355
 
344
356
 
345
- def _validate_auth(component: str, server: McpServerConfig) -> list[AgentCompilationIssue]:
346
- """Collect the issues of one server's ``auth`` block.
347
-
348
- Two credentials on one connection are ambiguous, so ``headers_ref`` and
349
- ``auth`` are refused together; every setting in the block is held to the
350
- same fail-closed reference test as ``headers_ref``, so no literal secret
351
- reaches loom by the back door; and an unregistered strategy is refused here
352
- rather than at the first message in production.
357
+ def _validate_auth(
358
+ component: str, headers_ref: str | None, auth: Mapping[str, str] | None
359
+ ) -> list[AgentCompilationIssue]:
360
+ """Collect the issues of one endpoint's ``auth`` block.
361
+
362
+ Applied to MCP servers and A2A agents alike, since both declare the same
363
+ block and resolve it through the same registry. Two credentials on one
364
+ connection are ambiguous, so ``headers_ref`` and ``auth`` are refused
365
+ together; every setting in the block is held to the same fail-closed
366
+ reference test as ``headers_ref``, so no literal secret reaches loom by the
367
+ back door; and an unregistered strategy is refused here rather than at the
368
+ first message in production.
353
369
  """
354
- auth = server.auth
355
370
  if auth is None:
356
371
  return []
357
- if server.headers_ref is not None:
372
+ if headers_ref is not None:
358
373
  return [mcp_auth_conflict(component)]
359
374
  issues = [
360
375
  # The rejected value is deliberately absent from the issue, as for
@@ -378,7 +393,7 @@ def _validate_mcp_servers(
378
393
  component = f"ai.mcp_servers.{name}"
379
394
  issues.extend(_validate_remote_url(component, server.url, mcp_url_invalid))
380
395
  issues.extend(_validate_headers_ref(component, server.headers_ref))
381
- issues.extend(_validate_auth(component, server))
396
+ issues.extend(_validate_auth(component, server.headers_ref, server.auth))
382
397
  if not _TIMEOUT_MS_MIN <= server.timeout_ms <= _TIMEOUT_MS_MAX:
383
398
  issues.append(
384
399
  policy_out_of_range(
@@ -401,4 +416,5 @@ def _validate_a2a_agents(
401
416
  component = f"ai.a2a_agents.{name}"
402
417
  issues.extend(_validate_remote_url(component, agent.url, a2a_url_invalid))
403
418
  issues.extend(_validate_headers_ref(component, agent.headers_ref))
419
+ issues.extend(_validate_auth(component, agent.headers_ref, agent.auth))
404
420
  return issues