loom-kernel 1.8.0__tar.gz → 1.9.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 (1168) hide show
  1. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/CHANGELOG.md +73 -0
  2. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/PKG-INFO +1 -1
  3. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/artifacts.md +197 -0
  4. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/overview.md +4 -1
  5. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/pyproject.toml +7 -2
  6. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/scripts/release/checkout_merged_release.py +19 -3
  7. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/_transport.py +17 -8
  8. loom_kernel-1.9.0/src/loom/ai/_usecase.py +74 -0
  9. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_rpc.py +1 -0
  10. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/abc.py +17 -1
  11. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/__init__.py +2 -0
  12. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_compiler.py +15 -2
  13. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_plan.py +41 -1
  14. loom_kernel-1.9.0/src/loom/ai/compiler/phases/_hook.py +127 -0
  15. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/__init__.py +2 -0
  16. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_schema.py +21 -0
  17. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_v1.py +22 -0
  18. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +17 -0
  19. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +4 -27
  20. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/errors.py +71 -2
  21. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/endpoints.py +34 -14
  22. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/response.py +14 -5
  23. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/streaming.py +8 -2
  24. loom_kernel-1.9.0/src/loom/ai/runtime/_hooks.py +294 -0
  25. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_lifecycle.py +96 -15
  26. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/executor.py +11 -4
  27. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/conftest.py +105 -0
  28. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_endpoints.py +408 -11
  29. loom_kernel-1.9.0/tests/integration/ai/test_hooks.py +960 -0
  30. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_streaming.py +25 -1
  31. loom_kernel-1.9.0/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/triage.py +91 -0
  32. loom_kernel-1.9.0/tests/unit/ai/phases/test_hook.py +193 -0
  33. loom_kernel-1.9.0/tests/unit/ai/runtime/__init__.py +1 -0
  34. loom_kernel-1.9.0/tests/unit/ai/runtime/test_hook_command.py +116 -0
  35. loom_kernel-1.9.0/tests/unit/ai/test_declarative_hook.py +111 -0
  36. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_error_factories.py +47 -0
  37. loom_kernel-1.9.0/tests/unit/ai/test_run_error_hook.py +49 -0
  38. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_schema_emission.py +5 -0
  39. loom_kernel-1.9.0/tests/unit/ai/test_usecase_helpers.py +150 -0
  40. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor_uow.py +59 -0
  41. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/release/test_checkout_merged_release.py +32 -1
  42. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_adapter.py +1 -3
  43. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/uv.lock +1 -1
  44. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/ci-main.yml +0 -0
  45. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/ci-pr.yml +0 -0
  46. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/docs.yml +0 -0
  47. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/release.yml +0 -0
  48. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.gitignore +0 -0
  49. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.pre-commit-config.yaml +0 -0
  50. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.readthedocs.yaml +0 -0
  51. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/LICENSE +0 -0
  52. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/Makefile +0 -0
  53. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/README.md +0 -0
  54. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/codecov.yml +0 -0
  55. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docker-compose.local.yaml +0 -0
  56. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/.gitkeep +0 -0
  57. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/custom.css +0 -0
  58. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/logo-transparent.png +0 -0
  59. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/logo.svg +0 -0
  60. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/a2a.md +0 -0
  61. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/mcp.md +0 -0
  62. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/observability.md +0 -0
  63. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/providers.md +0 -0
  64. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/adr/README.md +0 -0
  65. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/clean-architecture.md +0 -0
  66. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/overview.md +0 -0
  67. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/conf.py +0 -0
  68. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/examples.md +0 -0
  69. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/pipelines.md +0 -0
  70. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/testing.md +0 -0
  71. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/examples-repo/index.md +0 -0
  72. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/etl.md +0 -0
  73. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/rest.md +0 -0
  74. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/streaming.md +0 -0
  75. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/autocrud.md +0 -0
  76. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/celery.md +0 -0
  77. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/etl.md +0 -0
  78. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/fake-repo-examples.md +0 -0
  79. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/quickstart.md +0 -0
  80. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/use-case-dsl.md +0 -0
  81. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/index.rst +0 -0
  82. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/overview.md +0 -0
  83. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/ai.rst +0 -0
  84. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/core.rst +0 -0
  85. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/etl.rst +0 -0
  86. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/repository.rst +0 -0
  87. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/rest.rst +0 -0
  88. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/streaming.rst +0 -0
  89. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/testing.rst +0 -0
  90. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/index.rst +0 -0
  91. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/requirements.txt +0 -0
  92. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/autocrud.md +0 -0
  93. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/celery.md +0 -0
  94. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/examples.md +0 -0
  95. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/identity.md +0 -0
  96. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/sql.md +0 -0
  97. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/testing.md +0 -0
  98. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/use-case-dsl.md +0 -0
  99. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/bytewax.md +0 -0
  100. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/delivery.md +0 -0
  101. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/tracing.md +0 -0
  102. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/sonar-project.properties +0 -0
  103. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/__init__.py +0 -0
  104. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/__init__.py +0 -0
  105. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/_filters.py +0 -0
  106. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/__init__.py +0 -0
  107. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_binding.py +0 -0
  108. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_handlers.py +0 -0
  109. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/card.py +0 -0
  110. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/events.py +0 -0
  111. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/server.py +0 -0
  112. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_symbols.py +0 -0
  113. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  114. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
  115. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  116. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  117. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  118. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/config.py +0 -0
  119. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_envelope.py +0 -0
  120. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/describe.py +0 -0
  121. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/__init__.py +0 -0
  122. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  123. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  124. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  125. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  126. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  127. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  128. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
  129. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  130. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  131. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  132. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  133. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  134. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
  135. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/__init__.py +0 -0
  136. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/inference.py +0 -0
  137. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/registry.py +0 -0
  138. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/remote_auth.py +0 -0
  139. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/__init__.py +0 -0
  140. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_health.py +0 -0
  141. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_limits.py +0 -0
  142. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_mcp.py +0 -0
  143. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/validate/__init__.py +0 -0
  144. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/validate/__main__.py +0 -0
  145. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/__init__.py +0 -0
  146. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/auto.py +0 -0
  147. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/bootstrap.py +0 -0
  148. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/config.py +0 -0
  149. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/constants.py +0 -0
  150. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/runner.py +0 -0
  151. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/service.py +0 -0
  152. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/async_bridge.py +0 -0
  153. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/__init__.py +0 -0
  154. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/core_model.py +0 -0
  155. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/protocol.py +0 -0
  156. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  157. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/__init__.py +0 -0
  158. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  159. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/kernel.py +0 -0
  160. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/__init__.py +0 -0
  161. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/__init__.py +0 -0
  162. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/backend.py +0 -0
  163. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/config.py +0 -0
  164. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/dependency.py +0 -0
  165. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/codec.py +0 -0
  166. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/decorators.py +0 -0
  167. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/dependency.py +0 -0
  168. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/gateway.py +0 -0
  169. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/keys.py +0 -0
  170. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/repository.py +0 -0
  171. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/serializer.py +0 -0
  172. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/__init__.py +0 -0
  173. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/adapter.py +0 -0
  174. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/base.py +0 -0
  175. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/field.py +0 -0
  176. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/introspection.py +0 -0
  177. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/compiler.py +0 -0
  178. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/__init__.py +0 -0
  179. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/_resolver_utils.py +0 -0
  180. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/binder.py +0 -0
  181. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/configurable.py +0 -0
  182. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/context.py +0 -0
  183. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/errors.py +0 -0
  184. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/keys.py +0 -0
  185. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/loader.py +0 -0
  186. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/model.py +0 -0
  187. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/observability.py +0 -0
  188. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/resolver.py +0 -0
  189. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/secrets.py +0 -0
  190. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/ssm.py +0 -0
  191. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/contracts/__init__.py +0 -0
  192. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/contracts/manifest.py +0 -0
  193. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/__init__.py +0 -0
  194. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/container.py +0 -0
  195. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/scope.py +0 -0
  196. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/__init__.py +0 -0
  197. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/_utils.py +0 -0
  198. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/base.py +0 -0
  199. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/interfaces.py +0 -0
  200. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/manifest.py +0 -0
  201. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/modules.py +0 -0
  202. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/__init__.py +0 -0
  203. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/compilable.py +0 -0
  204. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/compiler.py +0 -0
  205. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/events.py +0 -0
  206. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/metrics.py +0 -0
  207. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/plan.py +0 -0
  208. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/__init__.py +0 -0
  209. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/codes.py +0 -0
  210. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/errors.py +0 -0
  211. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/__init__.py +0 -0
  212. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/eval.py +0 -0
  213. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/nodes.py +0 -0
  214. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/refs.py +0 -0
  215. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/__init__.py +0 -0
  216. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/context.py +0 -0
  217. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/identity.py +0 -0
  218. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/issuer.py +0 -0
  219. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/wire.py +0 -0
  220. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/__init__.py +0 -0
  221. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/base.py +0 -0
  222. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/describe.py +0 -0
  223. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/__init__.py +0 -0
  224. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/callback.py +0 -0
  225. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/context.py +0 -0
  226. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/handle.py +0 -0
  227. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/job.py +0 -0
  228. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/service.py +0 -0
  229. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/__init__.py +0 -0
  230. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/abc.py +0 -0
  231. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/config.py +0 -0
  232. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/registry.py +0 -0
  233. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/structlogger.py +0 -0
  234. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/__init__.py +0 -0
  235. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/base.py +0 -0
  236. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/enums.py +0 -0
  237. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/field.py +0 -0
  238. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/introspection.py +0 -0
  239. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/projection.py +0 -0
  240. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/relation.py +0 -0
  241. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/struct.py +0 -0
  242. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/timestamped.py +0 -0
  243. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/types.py +0 -0
  244. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/types_postgres.py +0 -0
  245. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/__init__.py +0 -0
  246. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/config.py +0 -0
  247. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/event.py +0 -0
  248. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/__init__.py +0 -0
  249. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/noop.py +0 -0
  250. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/otel.py +0 -0
  251. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/structlog.py +0 -0
  252. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/otel_ids.py +0 -0
  253. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/protocol.py +0 -0
  254. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/runtime.py +0 -0
  255. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/span.py +0 -0
  256. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/topology.py +0 -0
  257. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/plugins/__init__.py +0 -0
  258. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/plugins/entrypoints.py +0 -0
  259. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/__init__.py +0 -0
  260. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/loaders.py +0 -0
  261. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/runtime.py +0 -0
  262. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/__init__.py +0 -0
  263. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/__init__.py +0 -0
  264. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/query.py +0 -0
  265. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  266. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/repository.py +0 -0
  267. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  268. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
  269. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
  270. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  271. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/mutation.py +0 -0
  272. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/registration.py +0 -0
  273. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/registry.py +0 -0
  274. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  275. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  276. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  277. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  278. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  279. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  280. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  281. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  282. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  283. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  284. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  285. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  286. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  287. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  288. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  289. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  290. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  291. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  292. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  293. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  294. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/response/__init__.py +0 -0
  295. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/response/base.py +0 -0
  296. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/__init__.py +0 -0
  297. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/ref.py +0 -0
  298. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/resolver.py +0 -0
  299. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/runner.py +0 -0
  300. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/schema/__init__.py +0 -0
  301. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/schema/schema_mode.py +0 -0
  302. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/__init__.py +0 -0
  303. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/__init__.py +0 -0
  304. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/contracts.py +0 -0
  305. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/errors.py +0 -0
  306. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  307. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
  308. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  309. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
  310. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/config.py +0 -0
  311. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/roles.py +0 -0
  312. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/service.py +0 -0
  313. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/tracing/__init__.py +0 -0
  314. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/tracing/context.py +0 -0
  315. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/transport/__init__.py +0 -0
  316. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/transport/adapter.py +0 -0
  317. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/__init__.py +0 -0
  318. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/abc.py +0 -0
  319. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/context.py +0 -0
  320. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/__init__.py +0 -0
  321. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/_predicates.py +0 -0
  322. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/compute.py +0 -0
  323. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/constants.py +0 -0
  324. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/factory.py +0 -0
  325. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/field_ref.py +0 -0
  326. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/invoker.py +0 -0
  327. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/keys.py +0 -0
  328. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/markers.py +0 -0
  329. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/registry.py +0 -0
  330. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/rule.py +0 -0
  331. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/use_case.py +0 -0
  332. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/__init__.py +0 -0
  333. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/__init__.py +0 -0
  334. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_format_registry.py +0 -0
  335. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  336. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  337. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  338. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  339. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  340. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  341. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_merge.py +0 -0
  342. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_path_template.py +0 -0
  343. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_predicate.py +0 -0
  344. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  345. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  346. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  347. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_write_policy.py +0 -0
  348. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  349. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  350. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  351. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  352. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  353. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  354. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  355. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  356. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  357. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  358. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/provider.py +0 -0
  359. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  360. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  361. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  362. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  363. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  364. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  365. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_writer.py +0 -0
  366. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/provider.py +0 -0
  367. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  368. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  369. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  370. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  371. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  372. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  373. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_store.py +0 -0
  374. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/__init__.py +0 -0
  375. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_binding.py +0 -0
  376. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_compiler.py +0 -0
  377. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_errors.py +0 -0
  378. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_plan.py +0 -0
  379. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators.py +0 -0
  380. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  381. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators_step.py +0 -0
  382. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/__init__.py +0 -0
  383. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_format.py +0 -0
  384. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_read_options.py +0 -0
  385. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_utils.py +0 -0
  386. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_write_options.py +0 -0
  387. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  388. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  389. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  390. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  391. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  392. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  393. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from.py +0 -0
  394. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  395. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  396. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  397. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  398. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  399. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_client.py +0 -0
  400. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_file.py +0 -0
  401. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  402. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  403. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  404. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  405. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  406. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  407. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_into.py +0 -0
  408. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  409. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_table.py +0 -0
  410. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  411. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/__init__.py +0 -0
  412. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  413. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/_executor.py +0 -0
  414. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/__init__.py +0 -0
  415. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/_registry.py +0 -0
  416. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/__init__.py +0 -0
  417. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  418. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  419. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  420. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  421. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  422. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  423. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  424. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  425. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  426. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/targets/__init__.py +0 -0
  427. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  428. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/__init__.py +0 -0
  429. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_config.py +0 -0
  430. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_observer.py +0 -0
  431. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_records.py +0 -0
  432. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  433. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  434. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  435. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  436. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/__init__.py +0 -0
  437. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_builder.py +0 -0
  438. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_ops.py +0 -0
  439. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  440. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_runner.py +0 -0
  441. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_step.py +0 -0
  442. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  443. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  444. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/__init__.py +0 -0
  445. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_generics.py +0 -0
  446. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_params.py +0 -0
  447. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  448. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_process.py +0 -0
  449. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_sql.py +0 -0
  450. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step.py +0 -0
  451. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  452. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  453. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/__init__.py +0 -0
  454. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/_providers.py +0 -0
  455. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/_wiring.py +0 -0
  456. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/config_loader.py +0 -0
  457. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/core.py +0 -0
  458. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/errors.py +0 -0
  459. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/filtering.py +0 -0
  460. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runtime/__init__.py +0 -0
  461. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runtime/contracts.py +0 -0
  462. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/__init__.py +0 -0
  463. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/_contract.py +0 -0
  464. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/_schema.py +0 -0
  465. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/__init__.py +0 -0
  466. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_config.py +0 -0
  467. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_file_locator.py +0 -0
  468. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_locator.py +0 -0
  469. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/routing.py +0 -0
  470. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/__init__.py +0 -0
  471. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_result.py +0 -0
  472. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_runners.py +0 -0
  473. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_scenario.py +0 -0
  474. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_stubs.py +0 -0
  475. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/spark.py +0 -0
  476. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/__init__.py +0 -0
  477. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_async.py +0 -0
  478. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_config.py +0 -0
  479. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_ctx.py +0 -0
  480. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_meta.py +0 -0
  481. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_placeholders.py +0 -0
  482. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_summary.py +0 -0
  483. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/__init__.py +0 -0
  484. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_discovery.py +0 -0
  485. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  486. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_yaml.py +0 -0
  487. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/__init__.py +0 -0
  488. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_assemble.py +0 -0
  489. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_backfill.py +0 -0
  490. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  491. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_body.py +0 -0
  492. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_common.py +0 -0
  493. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_factory.py +0 -0
  494. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_hooks.py +0 -0
  495. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  496. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_run_name.py +0 -0
  497. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_runtime.py +0 -0
  498. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_signature.py +0 -0
  499. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_stages.py +0 -0
  500. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/__init__.py +0 -0
  501. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_model.py +0 -0
  502. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_s3.py +0 -0
  503. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_store.py +0 -0
  504. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/__init__.py +0 -0
  505. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_event.py +0 -0
  506. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_factory.py +0 -0
  507. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_port.py +0 -0
  508. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_slack.py +0 -0
  509. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/__init__.py +0 -0
  510. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_flow.py +0 -0
  511. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  512. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_manifest.py +0 -0
  513. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_task_run.py +0 -0
  514. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/__init__.py +0 -0
  515. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/adapter.py +0 -0
  516. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/kafka.py +0 -0
  517. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/lifecycle.py +0 -0
  518. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/middleware.py +0 -0
  519. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/py.typed +0 -0
  520. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/__init__.py +0 -0
  521. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/_body.py +0 -0
  522. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/adapter.py +0 -0
  523. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/__init__.py +0 -0
  524. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/abc.py +0 -0
  525. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/config.py +0 -0
  526. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/jwt.py +0 -0
  527. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/middleware.py +0 -0
  528. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/autocrud.py +0 -0
  529. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/compiler.py +0 -0
  530. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/constants.py +0 -0
  531. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/cors.py +0 -0
  532. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/errors.py +0 -0
  533. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/__init__.py +0 -0
  534. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/_errors.py +0 -0
  535. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  536. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/app.py +0 -0
  537. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/auto.py +0 -0
  538. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/openapi.py +0 -0
  539. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/response.py +0 -0
  540. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  541. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/sql.py +0 -0
  542. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/middleware.py +0 -0
  543. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/model.py +0 -0
  544. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/rest_adapter.py +0 -0
  545. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/__init__.py +0 -0
  546. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  547. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  548. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  549. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  550. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  551. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  552. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  553. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  554. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  555. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  556. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  557. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  558. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  559. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  560. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  561. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  562. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  563. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  564. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  565. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  566. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/runner.py +0 -0
  567. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/__init__.py +0 -0
  568. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  569. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  570. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_errors.py +0 -0
  571. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_plan.py +0 -0
  572. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  573. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
  574. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/__init__.py +0 -0
  575. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_errors.py +0 -0
  576. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_exceptions.py +0 -0
  577. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_message.py +0 -0
  578. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_tracing.py +0 -0
  579. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_typing.py +0 -0
  580. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/graph/__init__.py +0 -0
  581. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/graph/_flow.py +0 -0
  582. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/__init__.py +0 -0
  583. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_codec.py +0 -0
  584. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_config.py +0 -0
  585. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_errors.py +0 -0
  586. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  587. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_message.py +0 -0
  588. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_record.py +0 -0
  589. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_wire.py +0 -0
  590. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  591. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  592. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  593. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  594. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  595. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  596. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  597. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  598. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  599. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/__init__.py +0 -0
  600. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  601. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_config.py +0 -0
  602. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_event.py +0 -0
  603. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  604. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/__init__.py +0 -0
  605. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  606. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  607. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  608. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  609. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  610. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  611. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_fork.py +0 -0
  612. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  613. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  614. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  615. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_router.py +0 -0
  616. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_shape.py +0 -0
  617. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_sink.py +0 -0
  618. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_step.py +0 -0
  619. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  620. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/common.py +0 -0
  621. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/config.py +0 -0
  622. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_with.py +0 -0
  623. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/refs.py +0 -0
  624. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/testing.py +0 -0
  625. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/__init__.py +0 -0
  626. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/agents.py +0 -0
  627. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/golden.py +0 -0
  628. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/http_harness.py +0 -0
  629. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/in_memory.py +0 -0
  630. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/repository_harness.py +0 -0
  631. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/runner.py +0 -0
  632. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/__init__.py +0 -0
  633. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/conftest.py +0 -0
  634. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/__init__.py +0 -0
  635. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/__init__.py +0 -0
  636. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/test_contract_fake.py +0 -0
  637. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
  638. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/observability/__init__.py +0 -0
  639. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
  640. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/__init__.py +0 -0
  641. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/baselines/.gitkeep +0 -0
  642. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/outputs/.gitkeep +0 -0
  643. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/plans/.gitkeep +0 -0
  644. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/__init__.py +0 -0
  645. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/pydantic_ai_engine.py +0 -0
  646. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/remote_auth_plugin.py +0 -0
  647. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/spans.py +0 -0
  648. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/__init__.py +0 -0
  649. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/__init__.py +0 -0
  650. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_a2a.py +0 -0
  651. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_a2a_auth_wiring.py +0 -0
  652. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_agent_specs_source.py +0 -0
  653. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_a2a.py +0 -0
  654. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_client_factories.py +0 -0
  655. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_gate.py +0 -0
  656. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_capabilities.py +0 -0
  657. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_describe.py +0 -0
  658. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_grant_wiring.py +0 -0
  659. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_health_probe.py +0 -0
  660. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_limits.py +0 -0
  661. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_live_provider.py +0 -0
  662. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
  663. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_provider_portability.py +0 -0
  664. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_remote_auth_wiring.py +0 -0
  665. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_runtime.py +0 -0
  666. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_transport.py +0 -0
  667. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
  668. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  669. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  670. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
  671. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/conftest.py +0 -0
  672. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/__init__.py +0 -0
  673. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/bootstrap/__init__.py +0 -0
  674. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
  675. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/__init__.py +0 -0
  676. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
  677. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  678. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  679. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  680. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/__init__.py +0 -0
  681. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  682. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  683. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
  684. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
  685. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/__init__.py +0 -0
  686. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  687. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  688. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/etl/__init__.py +0 -0
  689. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/etl/test_runner_integration.py +0 -0
  690. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/__init__.py +0 -0
  691. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/__init__.py +0 -0
  692. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
  693. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  694. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  695. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
  696. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/main.py +0 -0
  697. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/manifest.py +0 -0
  698. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/__init__.py +0 -0
  699. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
  700. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/model.py +0 -0
  701. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  702. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/interface.py +0 -0
  703. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/jobs.py +0 -0
  704. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/model.py +0 -0
  705. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/relations.py +0 -0
  706. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/repository.py +0 -0
  707. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  708. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
  709. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/model.py +0 -0
  710. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  711. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/schemas.py +0 -0
  712. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
  713. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/__init__.py +0 -0
  714. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/init/01_users_roles.sql +0 -0
  715. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/test_clickhouse_integration.py +0 -0
  716. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/__init__.py +0 -0
  717. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/__init__.py +0 -0
  718. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/conftest.py +0 -0
  719. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
  720. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
  721. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/test_into_table_integration.py +0 -0
  722. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/support/__init__.py +0 -0
  723. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
  724. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/__init__.py +0 -0
  725. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/__init__.py +0 -0
  726. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/conftest.py +0 -0
  727. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/__init__.py +0 -0
  728. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
  729. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
  730. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_binding.py +0 -0
  731. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
  732. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
  733. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
  734. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
  735. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
  736. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
  737. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
  738. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
  739. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
  740. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
  741. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
  742. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
  743. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
  744. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
  745. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
  746. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
  747. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
  748. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
  749. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
  750. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
  751. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
  752. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
  753. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
  754. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
  755. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
  756. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/__init__.py +0 -0
  757. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/conftest.py +0 -0
  758. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_capabilities.py +0 -0
  759. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_limits.py +0 -0
  760. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_model_role.py +0 -0
  761. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_output.py +0 -0
  762. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_remote_auth_plan.py +0 -0
  763. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_validate_cli.py +0 -0
  764. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_a2a_base_url.py +0 -0
  765. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_a2a_card.py +0 -0
  766. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_compiler.py +0 -0
  767. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_compiler_offline.py +0 -0
  768. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_config.py +0 -0
  769. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_declarative_envelope.py +0 -0
  770. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_describe.py +0 -0
  771. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
  772. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_fake_engine.py +0 -0
  773. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_loopback_plaintext.py +0 -0
  774. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_no_extras_import.py +0 -0
  775. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_public_surface.py +0 -0
  776. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_registry.py +0 -0
  777. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_remote_auth.py +0 -0
  778. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_remote_auth_settings.py +0 -0
  779. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_secret_containment.py +0 -0
  780. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
  781. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
  782. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
  783. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
  784. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/__init__.py +0 -0
  785. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_auto.py +0 -0
  786. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
  787. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_config.py +0 -0
  788. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
  789. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_runner.py +0 -0
  790. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
  791. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/__init__.py +0 -0
  792. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/backend/__init__.py +0 -0
  793. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  794. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/__init__.py +0 -0
  795. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  796. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  797. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  798. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/__init__.py +0 -0
  799. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
  800. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_config_wiring.py +0 -0
  801. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_gateway_config.py +0 -0
  802. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/__init__.py +0 -0
  803. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_base.py +0 -0
  804. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_field.py +0 -0
  805. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_patch.py +0 -0
  806. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_introspection.py +0 -0
  807. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/__init__.py +0 -0
  808. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_binder.py +0 -0
  809. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_config.py +0 -0
  810. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_configurable.py +0 -0
  811. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_context.py +0 -0
  812. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_resolver_utils.py +0 -0
  813. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_secrets.py +0 -0
  814. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_ssm.py +0 -0
  815. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/di/__init__.py +0 -0
  816. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/di/test_container.py +0 -0
  817. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/discovery/__init__.py +0 -0
  818. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/discovery/test_manifest.py +0 -0
  819. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/__init__.py +0 -0
  820. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_caller_binding.py +0 -0
  821. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_compiler.py +0 -0
  822. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor.py +0 -0
  823. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
  824. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_metrics.py +0 -0
  825. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_plan.py +0 -0
  826. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/errors/__init__.py +0 -0
  827. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/errors/test_errors.py +0 -0
  828. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/expr/__init__.py +0 -0
  829. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/expr/test_expr.py +0 -0
  830. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/__init__.py +0 -0
  831. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_context.py +0 -0
  832. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_identity.py +0 -0
  833. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_wire.py +0 -0
  834. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/introspection/__init__.py +0 -0
  835. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/introspection/test_describe.py +0 -0
  836. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/__init__.py +0 -0
  837. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/conftest.py +0 -0
  838. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_callback.py +0 -0
  839. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_context.py +0 -0
  840. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_handle.py +0 -0
  841. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_inline_service.py +0 -0
  842. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_job.py +0 -0
  843. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/__init__.py +0 -0
  844. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/test_config.py +0 -0
  845. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/test_registry.py +0 -0
  846. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/__init__.py +0 -0
  847. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_model.py +0 -0
  848. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_struct.py +0 -0
  849. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_timestamped.py +0 -0
  850. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/__init__.py +0 -0
  851. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_message_id_generator.py +0 -0
  852. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_observers.py +0 -0
  853. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
  854. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
  855. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_provider_modes.py +0 -0
  856. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_runtime.py +0 -0
  857. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
  858. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/__init__.py +0 -0
  859. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/test_entrypoints.py +0 -0
  860. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/test_import_containment.py +0 -0
  861. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/projection/__init__.py +0 -0
  862. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/projection/test_runtime.py +0 -0
  863. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/__init__.py +0 -0
  864. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/__init__.py +0 -0
  865. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/conftest.py +0 -0
  866. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/test_query.py +0 -0
  867. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  868. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
  869. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
  870. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
  871. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
  872. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
  873. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  874. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
  875. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  876. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  877. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/routing/__init__.py +0 -0
  878. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/routing/test_routing.py +0 -0
  879. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/__init__.py +0 -0
  880. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/_fakes.py +0 -0
  881. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/conftest.py +0 -0
  882. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
  883. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
  884. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_config.py +0 -0
  885. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_isolation.py +0 -0
  886. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_null_service.py +0 -0
  887. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_pagination_limits.py +0 -0
  888. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
  889. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_role_policy.py +0 -0
  890. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_async_bridge.py +0 -0
  891. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_compiler_contracts.py +0 -0
  892. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_runner_contracts.py +0 -0
  893. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/tracing/__init__.py +0 -0
  894. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/tracing/test_context.py +0 -0
  895. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/__init__.py +0 -0
  896. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
  897. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  898. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  899. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/__init__.py +0 -0
  900. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_compute.py +0 -0
  901. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_factory.py +0 -0
  902. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
  903. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_invoker.py +0 -0
  904. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_markers.py +0 -0
  905. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_rule.py +0 -0
  906. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_use_case.py +0 -0
  907. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/__init__.py +0 -0
  908. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/__init__.py +0 -0
  909. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
  910. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
  911. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
  912. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_path_template.py +0 -0
  913. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
  914. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  915. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  916. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  917. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  918. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  919. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  920. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  921. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  922. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  923. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
  924. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
  925. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
  926. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  927. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
  928. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
  929. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
  930. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  931. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  932. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  933. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  934. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
  935. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
  936. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  937. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
  938. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
  939. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  940. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  941. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  942. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
  943. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/client_step/__init__.py +0 -0
  944. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/client_step/test_client_step.py +0 -0
  945. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/__init__.py +0 -0
  946. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  947. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
  948. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  949. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  950. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors.py +0 -0
  951. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  952. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  953. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
  954. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  955. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  956. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  957. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  958. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_structural.py +0 -0
  959. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  960. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  961. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/conftest.py +0 -0
  962. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/__init__.py +0 -0
  963. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/__init__.py +0 -0
  964. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
  965. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
  966. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
  967. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
  968. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
  969. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
  970. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
  971. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
  972. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
  973. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/__init__.py +0 -0
  974. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
  975. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
  976. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_history_target.py +0 -0
  977. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_registry.py +0 -0
  978. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source.py +0 -0
  979. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source_json.py +0 -0
  980. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source_options.py +0 -0
  981. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_target.py +0 -0
  982. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_utils.py +0 -0
  983. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_variants.py +0 -0
  984. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_observer.py +0 -0
  985. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_records.py +0 -0
  986. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_store.py +0 -0
  987. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/__init__.py +0 -0
  988. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
  989. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
  990. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/conftest.py +0 -0
  991. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_builder.py +0 -0
  992. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_runner.py +0 -0
  993. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_step.py +0 -0
  994. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/__init__.py +0 -0
  995. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  996. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  997. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_step.py +0 -0
  998. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/__init__.py +0 -0
  999. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_contract.py +0 -0
  1000. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_schema.py +0 -0
  1001. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_table.py +0 -0
  1002. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/__init__.py +0 -0
  1003. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_merge.py +0 -0
  1004. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_predicate.py +0 -0
  1005. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  1006. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  1007. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/__init__.py +0 -0
  1008. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
  1009. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  1010. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_locator.py +0 -0
  1011. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
  1012. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_route_build.py +0 -0
  1013. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  1014. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
  1015. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_config_loader.py +0 -0
  1016. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_executor.py +0 -0
  1017. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_executor_tracing.py +0 -0
  1018. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_format_registry.py +0 -0
  1019. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_module_contracts.py +0 -0
  1020. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
  1021. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
  1022. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_runner.py +0 -0
  1023. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_runner_errors.py +0 -0
  1024. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_spark_testing.py +0 -0
  1025. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/__init__.py +0 -0
  1026. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_runners.py +0 -0
  1027. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
  1028. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  1029. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/__init__.py +0 -0
  1030. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_backfill_flow.py +0 -0
  1031. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_config.py +0 -0
  1032. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_ctx.py +0 -0
  1033. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_etl_flow.py +0 -0
  1034. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_logging_bridge.py +0 -0
  1035. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_maintenance_flow.py +0 -0
  1036. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_manifest.py +0 -0
  1037. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_manifest_s3.py +0 -0
  1038. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_notify.py +0 -0
  1039. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_observer.py +0 -0
  1040. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_placeholders.py +0 -0
  1041. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_task_run_observer.py +0 -0
  1042. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_yaml_loader.py +0 -0
  1043. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/__init__.py +0 -0
  1044. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/test_adapter.py +0 -0
  1045. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/test_middleware.py +0 -0
  1046. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/release/test_release_workflow_contract.py +0 -0
  1047. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/__init__.py +0 -0
  1048. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/_fixture_app.py +0 -0
  1049. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_app_hardening.py +0 -0
  1050. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_auth_middleware.py +0 -0
  1051. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
  1052. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_autocrud.py +0 -0
  1053. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_cors.py +0 -0
  1054. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
  1055. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_fastapi_auto_persistence.py +0 -0
  1056. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_jwt_issuer.py +0 -0
  1057. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_jwt_middleware.py +0 -0
  1058. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_middleware.py +0 -0
  1059. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  1060. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_request_hardening.py +0 -0
  1061. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_response.py +0 -0
  1062. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_adapter.py +0 -0
  1063. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_compiler.py +0 -0
  1064. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_model.py +0 -0
  1065. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_route_rbac.py +0 -0
  1066. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_router_identity.py +0 -0
  1067. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_router_runtime.py +0 -0
  1068. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint.py +0 -0
  1069. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
  1070. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
  1071. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_serialization.py +0 -0
  1072. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/__init__.py +0 -0
  1073. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
  1074. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/cases.py +0 -0
  1075. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/conftest.py +0 -0
  1076. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
  1077. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
  1078. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
  1079. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
  1080. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
  1081. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
  1082. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
  1083. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
  1084. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runner.py +0 -0
  1085. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
  1086. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
  1087. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
  1088. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
  1089. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
  1090. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_storage.py +0 -0
  1091. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
  1092. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/__init__.py +0 -0
  1093. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/cases.py +0 -0
  1094. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
  1095. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_basics.py +0 -0
  1096. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
  1097. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_delivery.py +0 -0
  1098. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
  1099. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
  1100. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
  1101. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_router.py +0 -0
  1102. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_window.py +0 -0
  1103. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_with.py +0 -0
  1104. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/conftest.py +0 -0
  1105. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/__init__.py +0 -0
  1106. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/cases.py +0 -0
  1107. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
  1108. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_message.py +0 -0
  1109. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
  1110. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
  1111. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
  1112. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/__init__.py +0 -0
  1113. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
  1114. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
  1115. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/explode.py +0 -0
  1116. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
  1117. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/router.py +0 -0
  1118. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
  1119. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
  1120. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/conftest.py +0 -0
  1121. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
  1122. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
  1123. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/__init__.py +0 -0
  1124. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/cases.py +0 -0
  1125. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/conftest.py +0 -0
  1126. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/fakes.py +0 -0
  1127. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_client.py +0 -0
  1128. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_config.py +0 -0
  1129. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
  1130. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
  1131. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_message.py +0 -0
  1132. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
  1133. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
  1134. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
  1135. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
  1136. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
  1137. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
  1138. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
  1139. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/__init__.py +0 -0
  1140. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/conftest.py +0 -0
  1141. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
  1142. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
  1143. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
  1144. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_table_package.py +0 -0
  1145. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/__init__.py +0 -0
  1146. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/cases.py +0 -0
  1147. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/conftest.py +0 -0
  1148. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
  1149. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
  1150. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
  1151. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +0 -0
  1152. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
  1153. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_registry.py +0 -0
  1154. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
  1155. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/support/__init__.py +0 -0
  1156. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/support/flow_cases.py +0 -0
  1157. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_expand_routes.py +0 -0
  1158. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_fork.py +0 -0
  1159. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_otel_observability.py +0 -0
  1160. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_routing.py +0 -0
  1161. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_testing_mongo.py +0 -0
  1162. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_with.py +0 -0
  1163. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/__init__.py +0 -0
  1164. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_golden.py +0 -0
  1165. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_http_harness.py +0 -0
  1166. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_identity_harness.py +0 -0
  1167. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_in_memory.py +0 -0
  1168. {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_runner.py +0 -0
@@ -1,3 +1,76 @@
1
+ # 🚀 Release 1.9.0 ([#154](https://github.com/the-reacher-data/loom-py/pull/154)) ([`22d9a89`](https://github.com/the-reacher-data/loom-py/commit/22d9a894c766d2414ee6607e990b6473dd5ebfe3))
2
+
3
+
4
+ ## ✨ Features
5
+ ### ai
6
+ - **ai:** run a deployment use case on every completed agent run (on_output)<br>
7
+ > An agent artifact may declare `on_output: {usecase: <key>}`. The runtime
8
+ > then executes that use case exactly once per run that completes with a
9
+ > validated output, as the caller, through the normal use-case path
10
+ > (executor, rules, unit of work), with a command carrying the output under
11
+ > `output` plus runtime context (interaction_id, conversation_id, subject,
12
+ > mechanism, agent, provider, model). The use case's return value comes back
13
+ > as `hook_result`; a failing hook fails the run with HOOK_FAILED (500), an
14
+ > authorization denial with UNAUTHORIZED (403); the model never sees the hook.
15
+ > Every admitted run now carries an `interaction_id` on its result, its SSE
16
+ > `final`/`error` frame and its HTTP error body, and the request accepts an
17
+ > opaque `conversation_id` (1..128) propagated verbatim to the hook.
18
+ > Compile-time refusals: unknown use case, unsatisfiable Input, a use case
19
+ > that is both a `kind: usecase` grant and the hook, and a deps bundle whose
20
+ > invoker is missing or unbound (checked at start-up before any client opens).
21
+ > The hook is shielded from client disconnects and bounded by
22
+ > tool_timeout_ms; RuntimeExecutor now rolls back its unit of work on
23
+ > cancellation as well as on exceptions, and the SSE transport settles the
24
+ > frame task before closing the event generator.
25
+ > pyright now resolves imports against the project venv when invoked
26
+ > directly, so a globally installed dependency cannot shadow the pinned one.
27
+ > Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
28
+ > Claude-Session: https://claude.ai/code/session_01Gr9ww7Ut7iiPZcukawEXzH
29
+
30
+
31
+
32
+
33
+
34
+
35
+ ## ♻️ Refactor
36
+ ### ai
37
+ - **ai:** clear the SonarCloud findings of the on_output hook<br>
38
+ > The quality gate of #154 failed on a single reliability finding (S7497):
39
+ > the hook runner's `except asyncio.CancelledError` turned an internal
40
+ > cancellation into `RuntimeError` instead of re-raising. Wait on the hook
41
+ > task with `asyncio.wait` instead of `asyncio.shield`, which returns once
42
+ > the task ends, cancelled included; the consumer's cancellation is then
43
+ > the only `CancelledError` reaching the handler, always re-raised, and the
44
+ > internal cancel is detected after the wait. `_consumer_cancelled` and its
45
+ > `cancelling()` probe go away. `_settle` bounds its wait with
46
+ > `asyncio.timeout` (S7483).
47
+
48
+ - **ai:** name _settle's bound so Sonar S7483 stops matching the parameter<br>
49
+ > Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
50
+ > Claude-Session: https://claude.ai/code/session_016xY1skW5S2PU9Fc3M7tfAW
51
+ > --------
52
+ > Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
53
+
54
+
55
+
56
+
57
+
58
+
59
+ # 🚀 Release 1.8.1 ([#152](https://github.com/the-reacher-data/loom-py/pull/152)) ([`e8d1d81`](https://github.com/the-reacher-data/loom-py/commit/e8d1d81cf2b3fe15e8351108b893d6076950f0cd))
60
+
61
+
62
+
63
+ ## 🐛 Fixes
64
+ ### release
65
+ - **release:** merge the release PR when its check rollup is empty
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
1
74
  # 🚀 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
75
 
3
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 1.8.0
3
+ Version: 1.9.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Typing :: Typed
@@ -68,6 +68,8 @@ model_role: reasoning
68
68
  output:
69
69
  kind: type_ref
70
70
  ref: myapp.domain.incidents:IncidentReport
71
+ on_output:
72
+ usecase: incidents.record_report
71
73
  capabilities:
72
74
  - kind: usecase
73
75
  keys:
@@ -109,6 +111,7 @@ metadata:
109
111
  | `instructions` | yes | — | Non-empty. **Never published.** Never a place to encode authorization. |
110
112
  | `model_role` | no | `default` | `^[a-z][a-z0-9_-]{0,31}$`. A logical role, never a vendor name or a model id. |
111
113
  | `output` | yes | — | The declared answer shape. See below. |
114
+ | `on_output` | no | — | Use case executed once per completed run with the validated output; see below. |
112
115
  | `capabilities` | no | `[]` | Explicit grants. Empty means the agent can only talk. |
113
116
  | `policies` | no | see below | Execution limits. |
114
117
  | `metadata` | no | `{}` | Free-form `string: string` labels. **Never published**, never read by the runtime. |
@@ -165,6 +168,200 @@ output:
165
168
  The reference is `module:Symbol`. Filesystem paths are not representable by the
166
169
  pattern.
167
170
 
171
+ ## `on_output` — a use case run once per completed run
172
+
173
+ ```yaml
174
+ output:
175
+ kind: type_ref
176
+ ref: myapp.domain.triage:TriageReport
177
+ on_output:
178
+ usecase: incidents.record_triage # a use-case key of the registry; must not also be a grant
179
+ ```
180
+
181
+ For every run that **completes** with an output validated against the declared
182
+ shape, the runtime executes that use case **exactly once**, as the caller,
183
+ through the normal use-case path — executor, rules, unit of work. The use
184
+ case's return value comes back to the caller as `hook_result`.
185
+
186
+ It is **not a tool: the model never sees it.** It never enters the
187
+ instructions, it is never offered to the model, and the model cannot call it,
188
+ skip it or choose its arguments. Whether a triage is recorded is decided by the
189
+ deployment that wrote the artifact, not by the model on each run — which is
190
+ what makes the record deterministic. Granting the same operation as a
191
+ `kind: usecase` tool gives you the opposite: a record that exists only when the
192
+ model felt like calling it, with whatever arguments it wrote.
193
+
194
+ Only a completed run fires the hook. A run that ends in an `error`, breaches a
195
+ declared limit (`run_timeout_ms`, `max_iterations`, …) or whose client leaves
196
+ the stream before the `final` event never runs it.
197
+
198
+ ### What the use case receives
199
+
200
+ The command nests the validated output under `output` and offers the run's
201
+ context beside it:
202
+
203
+ | Name | Value |
204
+ |---|---|
205
+ | `output` | The validated answer, as **one nested value**, whatever the artifact's `output` block declares. |
206
+ | `interaction_id` | Identifier the runtime mints for every admitted run. |
207
+ | `conversation_id` | The request's `conversation_id`, verbatim; `None` when the request carried none. |
208
+ | `subject`, `mechanism` | The caller's identity. |
209
+ | `agent`, `provider`, `model` | The agent's name, and the provider and model its `model_role` resolved to. |
210
+
211
+ **The Command declares what it wants** and receives only that: the runtime
212
+ filters the offered names down to the ones the Input declares, so a strict
213
+ Command (`forbid_unknown_fields=True`) decodes without listing every context
214
+ name. Because `output` is always nested, a field called `subject` inside the
215
+ model's answer can never shadow the caller's.
216
+
217
+ ```python
218
+ class RecordTriageCommand(Command):
219
+ output: TriageReport # the type_ref type itself; dict[str, Any] also works
220
+ interaction_id: str
221
+ conversation_id: str | None = None
222
+ agent: str
223
+ model: str
224
+ # `subject`, `mechanism`, `provider` are offered but not declared: filtered out.
225
+
226
+
227
+ class TriageRecorded(msgspec.Struct, frozen=True):
228
+ triage_id: str
229
+
230
+
231
+ @use_case_key("incidents.record_triage")
232
+ class RecordTriage(UseCase[Triage, TriageRecorded]):
233
+ def __init__(self, triages: TriageRepository) -> None:
234
+ self._triages = triages
235
+
236
+ async def execute(
237
+ self,
238
+ cmd: RecordTriageCommand = Input(),
239
+ caller: Identity = Caller(), # the agent's caller
240
+ ) -> TriageRecorded:
241
+ report = cmd.output
242
+ await self._triages.save(
243
+ Triage(
244
+ id=cmd.interaction_id, conversation_id=cmd.conversation_id,
245
+ subject=caller.subject, agent=cmd.agent, model=cmd.model,
246
+ incident_ref=report.incident_ref, severity=report.severity,
247
+ confidence=report.confidence,
248
+ )
249
+ )
250
+ return TriageRecorded(triage_id=cmd.interaction_id)
251
+ ```
252
+
253
+ The verdict the on-call engineer gives later ("wrong severity") is an ordinary
254
+ use case of your application, called with the `interaction_id` the app already
255
+ holds. Loom stores nothing.
256
+
257
+ ### The compile-time rule
258
+
259
+ The compiler proves that the run can feed the use case, so a missing field is
260
+ never discovered at the end of a paid run. The key is resolved against the
261
+ same registry as a `kind: usecase` grant, and the use case's `execute` must
262
+ take an `Input()` whose required fields are all among `output` and the context
263
+ names above. Four coded issues:
264
+
265
+ | Code | When |
266
+ |---|---|
267
+ | `ON_OUTPUT_USECASE_UNKNOWN` | The key is not registered. |
268
+ | `ON_OUTPUT_INPUT_UNSATISFIED` | The use case cannot be fed from a run: it is not compiled, its `execute` declares primitive parameters, declares no `Input()`, or its Input requires a name the run does not offer. `internal` and `calculated` command fields and `Caller()` are never demanded. |
269
+ | `ON_OUTPUT_USECASE_ALSO_GRANTED` | The same key also appears in a `kind: usecase` grant. A hook use case must not be callable by the model. |
270
+ | `ON_OUTPUT_INVOKER_MISSING` | Start-up: an agent declares a hook but the dependency bundle carries no `invoker` bound to the caller. Probed before any client opens, so a misconfigured deployment fails at start-up rather than after every run. |
271
+
272
+ The offline validator (`python -m loom.ai.validate`) accepts the field but
273
+ does not resolve the key: it runs only the configuration-independent phases,
274
+ and a use-case registry is deployment state. The four issues above surface
275
+ when the application compiles its agents.
276
+
277
+ ### `on_output` versus a `kind: usecase` grant
278
+
279
+ Same vocabulary, same registry, same caller identity, same executor — and
280
+ opposite owners. A **grant** is a tool the *model* may call, when and how it
281
+ decides. A **hook** is a use case the *runtime* calls, once, with the
282
+ validated output. That is why one key cannot be both. Deciding whether an
283
+ operation is a tool at all follows
284
+ [the rule](mcp.md#the-rule-your-own-tools-are-a-usecase-grant) on the MCP page;
285
+ `on_output` is for the operation that must happen after every answer,
286
+ regardless of what the model did.
287
+
288
+ ### When the hook fails, the run fails
289
+
290
+ The model's answer is withheld and the caller gets a coded error. The hook is
291
+ **never retried**: it runs outside the engine's retry loop, and `HOOK_FAILED`
292
+ is not a retriable code.
293
+
294
+ | The hook… | The caller gets |
295
+ |---|---|
296
+ | raises | `500` `HOOK_FAILED` with a fixed message — `the output hook failed; the detail is recorded server-side`. The exception never reaches the caller; the server log carries it under the `interaction_id`. |
297
+ | raises `Forbidden`, `Unauthenticated`, `RoleNotAllowedError` or `RolesNotBoundError` | `403` `UNAUTHORIZED`, exactly as a `kind: usecase` tool would. |
298
+ | exceeds `tool_timeout_ms` | Cut at the bound and reported as `HOOK_FAILED`. |
299
+ | is cancelled internally | `HOOK_FAILED`: a hook that cancels itself is a hook failure, not a client exit. |
300
+
301
+ On `/stream` the failure is a single `error` frame and no `final`.
302
+
303
+ An anonymous caller — an endpoint declaring `allow_anonymous` — runs the hook
304
+ with `Caller()` bound to `ANONYMOUS`, so the command's `subject` is `""`.
305
+ Recording those is the deployment's choice: a use case whose rules refuse an
306
+ anonymous caller answers `403 UNAUTHORIZED` like any other denial.
307
+
308
+ ### Timing and the concurrency permit
309
+
310
+ The hook runs after the model has finished, but **inside** the run: the
311
+ `max_concurrent_runs` permit is held until it ends. It is bounded by the same
312
+ `tool_timeout_ms` as a capability call, so the worst-case duration of an
313
+ admitted run is `run_timeout_ms + tool_timeout_ms + 1 s` of grace given to a
314
+ cut hook to observe its cancellation. A hook that ignores that grace runs
315
+ detached afterwards; the permit is released regardless.
316
+
317
+ A client that disconnects while the hook is running does not interrupt it:
318
+ the hook is shielded, so a record that has begun finishes or fails cleanly and
319
+ its unit of work is committed or rolled back as usual.
320
+
321
+ A hook cut at its bound is rolled back; on a non-transactional backend such
322
+ as DynamoDB, partial writes may remain, so a hook use case should be
323
+ idempotent on `interaction_id`, and `HOOK_FAILED` means "unknown", not "not
324
+ recorded".
325
+
326
+ ### What the caller receives
327
+
328
+ Every result carries `interaction_id`, hook or no hook: `AgentResult`, the
329
+ `final` and `error` SSE frames, and every HTTP error body. It is `null` only
330
+ when the failure happened before a run was admitted — a `422` body, a `429`
331
+ `TOO_MANY_RUNS` — because a fixed shape beats a conditional one. `hook_result`
332
+ is on `final` and on `AgentResult`, `null` when the artifact declares no hook.
333
+ The hook's return value is a client-facing DTO delivered verbatim to the caller
334
+ — public on an `allow_anonymous` mount — so return a purpose-built struct,
335
+ never a domain entity.
336
+
337
+ The request body accepts an optional `conversation_id`: a string of 1 to 128
338
+ characters that loom never reads and never keys anything on. It is copied
339
+ verbatim into the hook's command and nowhere else; an out-of-range value is a
340
+ `422`.
341
+
342
+ `POST /agents/incident-triage/run` with
343
+ `{"prompt": "Checkout latency doubled since 09:40…", "conversation_id": "c-42"}`:
344
+
345
+ ```json
346
+ {
347
+ "output": {"incident_ref": "INC-1", "severity": "high", "confidence": 0.71, "alerts": ["A-7", "A-9"]},
348
+ "usage": {"input_tokens": 1840, "output_tokens": 412, "requests": 3, "duration_ms": 5210},
349
+ "interaction_id": "7f3c9a0e4b2d4c1e9a7b5d6e8f0a1b2c",
350
+ "hook_result": {"triage_id": "7f3c9a0e4b2d4c1e9a7b5d6e8f0a1b2c"}
351
+ }
352
+ ```
353
+
354
+ Over `/stream`, the last frame is:
355
+
356
+ ```
357
+ event: final
358
+ data: {"output":{...},"usage":{...},"interaction_id":"7f3c...","hook_result":{"triage_id":"7f3c..."}}
359
+ ```
360
+
361
+ Had `RecordTriage` raised, the app would instead get
362
+ `500 {"code":"HOOK_FAILED","message":"the output hook failed; the detail is recorded server-side","interaction_id":"7f3c..."}`
363
+ — or an `error` frame with the same three fields — and no answer.
364
+
168
365
  ## `capabilities` — the six kinds
169
366
 
170
367
  A capability is a **grant**, never a discovery. Nothing is expanded
@@ -99,7 +99,10 @@ Exposure is always an explicit opt-in, never a default.
99
99
  ## Where to go next
100
100
 
101
101
  - **[Artifact reference](artifacts.md)** — the complete `spec_version: 1`
102
- format, field by field, and the folder layout an agent lives in.
102
+ format, field by field, and the folder layout an agent lives in. It includes
103
+ [`on_output`](artifacts.md#on_output--a-use-case-run-once-per-completed-run),
104
+ the use case the runtime executes once per completed run with the validated
105
+ output.
103
106
  - **[Model providers](providers.md)** — the provider matrix, and why an
104
107
  OpenAI-compatible endpoint is one provider covering many vendors.
105
108
  - **[A2A surface](a2a.md)** — publishing an agent to other agents, and exactly
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "loom-kernel"
3
- version = "1.8.0"
3
+ version = "1.9.0"
4
4
  description = "Loom Python project"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -269,6 +269,11 @@ extend-immutable-calls = [
269
269
 
270
270
  [tool.pyright]
271
271
  pythonVersion = "3.11"
272
+ # Resolve imports against the project venv even when pyright is invoked
273
+ # directly (editor, hooks) instead of through `uv run`, so a globally
274
+ # installed, older dependency never shadows the pinned one.
275
+ venvPath = "."
276
+ venv = ".venv"
272
277
  # src only, deliberately. Checking tests as well surfaces 294 errors across
273
278
  # eight rules — mostly stubs that no longer satisfy the protocol they stand in
274
279
  # for. That is real signal and worth burning down, but it is a project, not a
@@ -357,7 +362,7 @@ markers = [
357
362
 
358
363
  [tool.commitizen]
359
364
  name = "cz_conventional_commits"
360
- version = "1.8.0"
365
+ version = "1.9.0"
361
366
  tag_format = "v$version"
362
367
  version_files = [
363
368
  "pyproject.toml:project.version",
@@ -195,9 +195,25 @@ def _is_ready_to_merge(merge_state: str, check_outcomes: Sequence[CheckOutcome])
195
195
  # reports through the Checks API, and no workflow runs on a branch pushed by
196
196
  # GITHUB_TOKEN, so no coverage is ever uploaded for it. Merging is still
197
197
  # safe as long as every check that did report has passed.
198
- return bool(check_outcomes) and all(
199
- outcome is CheckOutcome.PASSED for outcome in check_outcomes
200
- )
198
+ #
199
+ # And an empty rollup is the *normal* state, not a missing signal. The branch
200
+ # and the PR are created with GITHUB_TOKEN, and GitHub deliberately emits no
201
+ # event for actions taken with it -- the protection against workflows
202
+ # triggering workflows without end. So no run is ever queued against a release
203
+ # PR and no check can ever appear. Requiring at least one made the wait
204
+ # unsatisfiable by construction: every release timed out and was published by
205
+ # hand.
206
+ #
207
+ # What guards a release PR is not CI on a version bump -- the code it describes
208
+ # already passed CI in the pull requests that composed it. It is that the PR
209
+ # changes exactly CHANGELOG.md, pyproject.toml and uv.lock and nothing else,
210
+ # asserted by _validate_snapshot at the top of every poll before this function
211
+ # is reached. A PR carrying anything more never gets this far.
212
+ #
213
+ # This cannot open the loop the token protection exists to prevent: the release
214
+ # workflow's own `prepare` job refuses a head ref starting with `docs/`, so
215
+ # merging a release PR never starts another release.
216
+ return all(outcome is CheckOutcome.PASSED for outcome in check_outcomes)
201
217
 
202
218
 
203
219
  def _validate_polling_bounds(timeout_seconds: float, poll_interval_seconds: float) -> None:
@@ -218,7 +218,7 @@ def failure_event(exc: BaseException) -> ErrorEvent:
218
218
  event = failure_event(AgentRunError(AgentRunErrorCode.RUN_TIMEOUT, "late"))
219
219
  """
220
220
  if isinstance(exc, AgentRunError):
221
- return ErrorEvent(code=exc.code, message=str(exc))
221
+ return ErrorEvent(code=exc.code, message=str(exc), interaction_id=exc.interaction_id)
222
222
  return ErrorEvent(code=AgentRunErrorCode.PROVIDER_UNAVAILABLE, message=_UNEXPECTED_FAILURE)
223
223
 
224
224
 
@@ -231,16 +231,25 @@ async def _next_frame(frames: AsyncIterator[bytes]) -> bytes | None:
231
231
 
232
232
 
233
233
  async def _drain(pending: asyncio.Future[bytes | None] | None) -> None:
234
- """Cancel the awaited frame and wait for it, so nothing outlives the stream."""
234
+ """Cancel the awaited frame and wait for it, so nothing outlives the stream.
235
+
236
+ The wait is shielded and repeated until the frame task is done. A server
237
+ that cancels its handler again at every checkpoint (an ``anyio`` cancel
238
+ scope does, after a disconnect) would otherwise cancel the frame task a
239
+ second time through the bare await — cutting the output hook it shields —
240
+ and then return early, letting the caller close a generator that task is
241
+ still running.
242
+ """
235
243
  if pending is None:
236
244
  return
237
245
  pending.cancel()
238
- try:
239
- await pending
240
- except (Exception, asyncio.CancelledError):
241
- # The consumer is already gone: neither the cancellation just requested
242
- # nor a late failure has anybody left to be reported to.
243
- return
246
+ while not pending.done():
247
+ try:
248
+ await asyncio.shield(pending)
249
+ except (Exception, asyncio.CancelledError):
250
+ # The consumer is already gone: neither the cancellation just
251
+ # requested nor a late failure has anybody left to be reported to.
252
+ continue
244
253
 
245
254
 
246
255
  async def with_heartbeats(
@@ -0,0 +1,74 @@
1
+ """Engine-free helpers to run a granted use case as a given caller.
2
+
3
+ Both the pydantic-ai capability tools and the runtime output hook invoke a use
4
+ case through the dependency bundle's **bound** invoker, with the caller
5
+ installed as the ambient identity for the duration of the call. This module
6
+ holds that shared piece without importing any engine, so the runtime can use
7
+ it with no optional extra installed.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Any
13
+
14
+ from loom.ai.errors import AgentRunError, AgentRunErrorCode
15
+ from loom.core.engine.compilable import Compilable
16
+ from loom.core.identity import Identity, reset_identity, set_identity
17
+ from loom.core.use_case.invoker import ApplicationInvoker
18
+
19
+
20
+ def require_invoker(bundle: object, label: str) -> ApplicationInvoker:
21
+ """Return the bundle's invoker, refusing a bundle that carries none.
22
+
23
+ Read from the bundle rather than resolved from the container: the bundle's
24
+ invoker is the one the composition root already bound to this invocation's
25
+ caller, and the container holds only the unbound singleton.
26
+
27
+ Args:
28
+ bundle: Dependency bundle built for the caller by the deps factory.
29
+ label: Caller of the refused call, worded as it should appear in the
30
+ error (``"tool 'lookup'"``, ``"on_output hook 'incidents.record'"``).
31
+
32
+ Returns:
33
+ The invoker bound to the caller.
34
+
35
+ Raises:
36
+ AgentRunError: ``UNAUTHORIZED`` when the bundle carries no invoker.
37
+ """
38
+ invoker = getattr(bundle, "invoker", None)
39
+ if isinstance(invoker, ApplicationInvoker):
40
+ return invoker
41
+ raise AgentRunError(
42
+ AgentRunErrorCode.UNAUTHORIZED,
43
+ f"{label} requires a dependency bundle exposing an 'invoker' bound to its caller",
44
+ )
45
+
46
+
47
+ async def invoke_as(
48
+ invoker: ApplicationInvoker,
49
+ use_case: type[Compilable],
50
+ identity: Identity,
51
+ *,
52
+ params: dict[str, Any] | None,
53
+ payload: dict[str, Any] | None,
54
+ ) -> object:
55
+ """Invoke ``use_case`` through ``invoker`` with ``identity`` as the ambient caller.
56
+
57
+ The identity is installed only for the duration of the call and restored in
58
+ a ``finally`` block, so a reused task never inherits it.
59
+
60
+ Args:
61
+ invoker: Invoker already bound to ``identity`` by the composition root.
62
+ use_case: Use case type to run.
63
+ identity: Caller to install as the ambient identity during the call.
64
+ params: Query-style parameters forwarded untouched.
65
+ payload: Body-style payload forwarded untouched.
66
+
67
+ Returns:
68
+ Whatever the use case returns.
69
+ """
70
+ token = set_identity(identity)
71
+ try:
72
+ return await invoker.invoke(use_case, params=params, payload=payload)
73
+ finally:
74
+ reset_identity(token)
@@ -50,6 +50,7 @@ RUN_ERROR_DETAILS: Final[Mapping[AgentRunErrorCode, str]] = MappingProxyType(
50
50
  AgentRunErrorCode.TOO_MANY_RUNS: "the agent is at its concurrency limit",
51
51
  AgentRunErrorCode.UNAUTHORIZED: "the caller is not permitted to perform this run",
52
52
  AgentRunErrorCode.CANCELLED: "the run was cancelled",
53
+ AgentRunErrorCode.HOOK_FAILED: "the output hook failed",
53
54
  }
54
55
  )
55
56
 
@@ -12,13 +12,16 @@ from __future__ import annotations
12
12
 
13
13
  from collections.abc import AsyncIterator, Mapping
14
14
  from contextlib import AbstractAsyncContextManager
15
- from typing import Any, ClassVar, Literal, Protocol
15
+ from typing import Any, ClassVar, Final, Literal, Protocol
16
16
 
17
17
  from loom.ai.errors import AgentRunErrorCode
18
18
  from loom.core.di import LoomContainer
19
19
  from loom.core.identity import Identity
20
20
  from loom.core.model import LoomFrozenStruct
21
21
 
22
+ CONVERSATION_ID_MAX_LENGTH: Final[int] = 128
23
+ """Longest ``conversation_id`` a run accepts; the value itself is opaque."""
24
+
22
25
 
23
26
  class AgentUsage(LoomFrozenStruct, frozen=True, kw_only=True):
24
27
  """Resource accounting of one agent run.
@@ -43,10 +46,15 @@ class AgentResult(LoomFrozenStruct, frozen=True, kw_only=True):
43
46
  output: Answer already decoded and validated against the declared
44
47
  output shape.
45
48
  usage: Resource accounting of the run.
49
+ interaction_id: Identifier the runtime minted for this run.
50
+ hook_result: Return value of the ``on_output`` use case, when the plan
51
+ declares one.
46
52
  """
47
53
 
48
54
  output: object
49
55
  usage: AgentUsage
56
+ interaction_id: str | None = None
57
+ hook_result: object | None = None
50
58
 
51
59
 
52
60
  class TextDeltaEvent(
@@ -97,10 +105,13 @@ class ErrorEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="error", tag_f
97
105
  Attributes:
98
106
  code: Stable run-time failure code; the retry policy reads its class.
99
107
  message: Human-readable description.
108
+ interaction_id: Identifier of the admitted run this failure belongs
109
+ to; ``None`` before admission.
100
110
  """
101
111
 
102
112
  code: AgentRunErrorCode
103
113
  message: str
114
+ interaction_id: str | None = None
104
115
 
105
116
 
106
117
  class FinalEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="final", tag_field="type"):
@@ -110,10 +121,15 @@ class FinalEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="final", tag_f
110
121
  output: Answer already decoded and validated against the declared
111
122
  output shape.
112
123
  usage: Resource accounting of the whole run.
124
+ interaction_id: Identifier the runtime minted for this run.
125
+ hook_result: Return value of the ``on_output`` use case, when the plan
126
+ declares one.
113
127
  """
114
128
 
115
129
  output: object
116
130
  usage: AgentUsage
131
+ interaction_id: str | None = None
132
+ hook_result: object | None = None
117
133
 
118
134
 
119
135
  AgentEvent = TextDeltaEvent | ToolCallEvent | ToolResultEvent | ErrorEvent | FinalEvent
@@ -22,6 +22,7 @@ from loom.ai.compiler._plan import (
22
22
  CompiledCapability,
23
23
  CompiledMcpCapability,
24
24
  CompiledOutput,
25
+ CompiledOutputHook,
25
26
  CompiledPythonCapability,
26
27
  CompiledRemoteAuth,
27
28
  CompiledSkillsCapability,
@@ -40,6 +41,7 @@ __all__ = [
40
41
  "CompiledCapability",
41
42
  "CompiledMcpCapability",
42
43
  "CompiledOutput",
44
+ "CompiledOutputHook",
43
45
  "CompiledPythonCapability",
44
46
  "CompiledRemoteAuth",
45
47
  "CompiledSkillsCapability",
@@ -12,8 +12,14 @@ from collections import defaultdict
12
12
  from collections.abc import Sequence
13
13
  from types import MappingProxyType
14
14
 
15
- from loom.ai.compiler._plan import AgentPlan, CompiledCapability, CompiledOutput
15
+ from loom.ai.compiler._plan import (
16
+ AgentPlan,
17
+ CompiledCapability,
18
+ CompiledOutput,
19
+ CompiledOutputHook,
20
+ )
16
21
  from loom.ai.compiler.phases._capabilities import compile_capabilities
22
+ from loom.ai.compiler.phases._hook import compile_output_hook
17
23
  from loom.ai.compiler.phases._limits import validate_policies
18
24
  from loom.ai.compiler.phases._model_role import resolve_model_role
19
25
  from loom.ai.compiler.phases._output import compile_output
@@ -122,6 +128,10 @@ class AgentCompiler:
122
128
  issues: list[AgentCompilationIssue] = []
123
129
  output, output_issues = compile_output(spec.output, component)
124
130
  issues.extend(output_issues)
131
+ on_output, hook_issues = compile_output_hook(
132
+ spec, component=component, registry=self._registry
133
+ )
134
+ issues.extend(hook_issues)
125
135
  issues.extend(validate_policies(spec.policies, component))
126
136
  inference, role_issues = resolve_model_role(spec.model_role, self._config.models, component)
127
137
  issues.extend(role_issues)
@@ -137,7 +147,8 @@ class AgentCompiler:
137
147
  issues.extend(capability_issues)
138
148
  if issues or output is None or inference is None:
139
149
  return None, issues
140
- return self._build_plan(spec, inference, output, capabilities, source_path), []
150
+ plan = self._build_plan(spec, inference, output, capabilities, on_output, source_path)
151
+ return plan, []
141
152
 
142
153
  @staticmethod
143
154
  def _build_plan(
@@ -145,6 +156,7 @@ class AgentCompiler:
145
156
  inference: InferenceTarget,
146
157
  output: CompiledOutput,
147
158
  capabilities: tuple[CompiledCapability, ...],
159
+ on_output: CompiledOutputHook | None,
148
160
  source_path: str | None,
149
161
  ) -> AgentPlan:
150
162
  return AgentPlan(
@@ -156,6 +168,7 @@ class AgentCompiler:
156
168
  output=output,
157
169
  capabilities=capabilities,
158
170
  policies=spec.policies,
171
+ on_output=on_output,
159
172
  metadata=MappingProxyType(dict(spec.metadata)),
160
173
  source_path=source_path,
161
174
  )