Skip to content

fix(execution): size activity slots and the blocking pool from the container's limits [FND-4646] - #4822

Open
cmgrote wants to merge 1 commit into
mainfrom
christophergrote/fnd-4646
Open

cmgrote wants to merge 1 commit into
mainfrom
christophergrote/fnd-4646

Conversation

@cmgrote

@cmgrote cmgrote commented Nov 10, 2026

Copy link
Copy Markdown
Collaborator

Changelog

  • Behaviour change. Small pods now run fewer activities at once. When TEMPORAL_MAX_CONCURRENT_ACTIVITIES is unset or blank, the worker's activity-slot default is min(100, 10 × CPUs, memory limit ÷ 256 MiB), never below 1. It used to be a fixed 100. CPUs are the container's CFS quota, rounded down (available_cpus()). The memory limit is the cgroup's, falling back to K8S_POD_MEMORY_LIMIT. With no known memory limit, only the CPU term applies. 100 stays the cap, so no pod gets more slots than before. Example: a 1-CPU, 2 GiB pod gets 8 slots. The env var still overrides.
  • The sdk-blocking- pool behind run_in_thread is now min(32, available_cpus() + 4) wide. It used to be os.cpu_count() + 4, so a 1-CPU pod on a 64-core node got 32 threads.
  • At startup the worker logs Activity slots: N (...), naming either the env var or the CPU and memory inputs it derived the value from.
  • Docs: configuration.md (new TEMPORAL_MAX_CONCURRENT_ACTIVITIES row), upgrade-guide-v3.md (behaviour-change note), env-vars.md (K8S_POD_MEMORY_LIMIT now also feeds the slot default), concepts/tasks.md and ADR-0010 (pool width).

Additional context (e.g. screenshots, logs, links)

  • Linear: FND-4646.
  • Out of scope, unchanged: the sticky workflow cache and the workflow-task slots stay at Temporal's defaults. The issue lists them as evidence, but its fix covers only the two values above.
  • The per-CPU (10) and per-slot memory (256 MiB) factors are heuristics. They are private constants in execution/settings.py. If sizing telemetry later shows a different per-activity footprint, change them there.
  • New tests were run red-green: all 20 fail on main and pass on this branch. Locally, 1786 tests pass across tests/unit/execution, tests/unit/runtime, tests/unit/observability/test_cgroup.py and tests/unit/test_app_config.py. Pre-commit is clean.
  • Every changed file is on the planned list. No security-relevant changes.

Checklist

  • Additional tests added
  • All CI checks passed
  • Relevant documentation updated

Copyleft License Compliance

  • Have you used any code that is subject to a Copyleft license (e.g., GPL, AGPL, LGPL)?
  • If yes, have you modified the code in the context of this project? please share additional details.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AbKqGaeq2q955aBdyQCbxg

…ntainer's limits [FND-4646]

The worker defaulted to 100 activity slots and sized the sdk-blocking pool
from os.cpu_count(), the node's cores. A 1-CPU pod on a 64-core node got
100 slots and 32 blocking threads, oversubscribing CPU and memory and
starving the heartbeat loop.

- sdk-blocking pool: min(32, available_cpus() + 4).
- Activity slots: TEMPORAL_MAX_CONCURRENT_ACTIVITIES still wins; unset,
  min(100, 10 x CPUs, memory limit // 256 MiB), never below 1.
- The worker logs the slot count and its inputs at startup.

Claude-Session: https://claude.ai/code/session_01AbKqGaeq2q955aBdyQCbxg
@linear

linear Bot commented Nov 10, 2026

Copy link
Copy Markdown

FND-4646

@github-actions

Copy link
Copy Markdown
Contributor

📜 Docstring Coverage Report

RESULT: PASSED (minimum: 75.0%, actual: 80.0%)

Detailed Coverage Report
= Coverage for /home/runner/work/application-sdk/application-sdk/application_sdk/ =
----------------------------------- Summary ------------------------------------
| Name                                                           | Total | Miss | Cover | Cover% |
|----------------------------------------------------------------|-------|------|-------|--------|
| __init__.py                                                    |     1 |    0 |     1 |   100% |
| _build_info.py                                                 |     2 |    0 |     2 |   100% |
| _context_errors.py                                             |     7 |    3 |     4 |    57% |
| _discovery_errors.py                                           |     7 |    0 |     7 |   100% |
| _install.py                                                    |     6 |    0 |     6 |   100% |
| _logging.py                                                    |    13 |    8 |     5 |    38% |
| constants.py                                                   |    18 |   10 |     8 |    44% |
| discovery.py                                                   |    12 |    3 |     9 |    75% |
| main.py                                                        |    62 |   20 |    42 |    68% |
| main_errors.py                                                 |     5 |    0 |     5 |   100% |
| pkl_version.py                                                 |     1 |    0 |     1 |   100% |
| version.py                                                     |     1 |    0 |     1 |   100% |
| _runtime/__init__.py                                           |     1 |    0 |     1 |   100% |
| _runtime/cgroup.py                                             |     6 |    2 |     4 |    67% |
| _runtime/offload.py                                            |    66 |   17 |    49 |    74% |
| _runtime/progress.py                                           |    32 |    2 |    30 |    94% |
| app/__init__.py                                                |     1 |    0 |     1 |   100% |
| app/_artifact_schema_guard.py                                  |     8 |    0 |     8 |   100% |
| app/_ep_registration.py                                        |     6 |    0 |     6 |   100% |
| app/_generated_tree.py                                         |     1 |    0 |     1 |   100% |
| app/base.py                                                    |   104 |   23 |    81 |    78% |
| app/base_errors.py                                             |     5 |    0 |     5 |   100% |
| app/build_identity.py                                          |     1 |    0 |     1 |   100% |
| app/client.py                                                  |     1 |    0 |     1 |   100% |
| app/context.py                                                 |    42 |    2 |    40 |    95% |
| app/entrypoint.py                                              |    20 |    5 |    15 |    75% |
| app/registry.py                                                |    40 |   11 |    29 |    72% |
| app/task.py                                                    |    17 |    6 |    11 |    65% |
| clients/__init__.py                                            |     2 |    1 |     1 |    50% |
| clients/_interface.py                                          |     6 |    1 |     5 |    83% |
| clients/_sql_failure_classifier.py                             |     5 |    0 |     5 |   100% |
| clients/base.py                                                |    22 |   10 |    12 |    55% |
| clients/http_errors.py                                         |     2 |    0 |     2 |   100% |
| clients/models.py                                              |     2 |    0 |     2 |   100% |
| clients/redis.py                                               |    27 |    0 |    27 |   100% |
| clients/redis_errors.py                                        |     5 |    0 |     5 |   100% |
| clients/sql.py                                                 |    64 |   22 |    42 |    66% |
| clients/sql_errors.py                                          |    15 |    0 |    15 |   100% |
| clients/sql_typecasters.py                                     |    14 |    4 |    10 |    71% |
| clients/ssl_utils.py                                           |     8 |    0 |     8 |   100% |
| clients/azure/__init__.py                                      |     1 |    0 |     1 |   100% |
| clients/azure/auth.py                                          |     7 |    0 |     7 |   100% |
| clients/azure/azure_errors.py                                  |     8 |    0 |     8 |   100% |
| clients/azure/client.py                                        |    14 |    0 |    14 |   100% |
| common/__init__.py                                             |     1 |    0 |     1 |   100% |
| common/_env.py                                                 |     2 |    0 |     2 |   100% |
| common/_generated_tree.py                                      |     9 |    0 |     9 |   100% |
| common/_listing.py                                             |     7 |    0 |     7 |   100% |
| common/asset_serialization.py                                  |    20 |    5 |    15 |    75% |
| common/atomic.py                                               |    17 |    0 |    17 |   100% |
| common/aws_utils.py                                            |    13 |    1 |    12 |    92% |
| common/aws_utils_errors.py                                     |     8 |    0 |     8 |   100% |
| common/backoff.py                                              |     9 |    1 |     8 |    89% |
| common/build_identity.py                                       |     2 |    0 |     2 |   100% |
| common/concurrency.py                                          |     3 |    0 |     3 |   100% |
| common/dispatch.py                                             |     7 |    2 |     5 |    71% |
| common/entity_envelope.py                                      |    10 |    0 |    10 |   100% |
| common/env_warnings.py                                         |     2 |    0 |     2 |   100% |
| common/error_codes.py                                          |    15 |    3 |    12 |    80% |
| common/errors.py                                               |     8 |    0 |     8 |   100% |
| common/file_converter.py                                       |     9 |    5 |     4 |    44% |
| common/file_ops.py                                             |    16 |    1 |    15 |    94% |
| common/filter_matching.py                                      |     9 |    3 |     6 |    67% |
| common/last_sync.py                                            |     6 |    0 |     6 |   100% |
| common/logger.py                                               |     1 |    0 |     1 |   100% |
| common/models.py                                               |     4 |    2 |     2 |    50% |
| common/path.py                                                 |     2 |    1 |     1 |    50% |
| common/restart_marker.py                                       |     8 |    0 |     8 |   100% |
| common/spillable_dict.py                                       |    17 |   11 |     6 |    35% |
| common/sql_filters.py                                          |    18 |    4 |    14 |    78% |
| common/sql_filters_errors.py                                   |     2 |    0 |     2 |   100% |
| common/task_queue.py                                           |    10 |    0 |    10 |   100% |
| common/transforms.py                                           |     5 |    0 |     5 |   100% |
| common/types.py                                                |     2 |    0 |     2 |   100% |
| common/utils.py                                                |     2 |    0 |     2 |   100% |
| common/incremental/__init__.py                                 |     3 |    0 |     3 |   100% |
| common/incremental/helpers.py                                  |    13 |    0 |    13 |   100% |
| common/incremental/incremental_errors.py                       |    12 |    0 |    12 |   100% |
| common/incremental/marker.py                                   |    13 |    0 |    13 |   100% |
| common/incremental/models.py                                   |    11 |    0 |    11 |   100% |
| common/incremental/column_extraction/__init__.py               |     1 |    0 |     1 |   100% |
| common/incremental/column_extraction/analysis.py               |     4 |    0 |     4 |   100% |
| common/incremental/column_extraction/backfill.py               |     3 |    0 |     3 |   100% |
| common/incremental/state/__init__.py                           |     1 |    1 |     0 |     0% |
| common/incremental/state/incremental_diff.py                   |     8 |    0 |     8 |   100% |
| common/incremental/state/state_reader.py                       |     7 |    0 |     7 |   100% |
| common/incremental/state/state_writer.py                       |    15 |    1 |    14 |    93% |
| common/incremental/state/store.py                              |    23 |    6 |    17 |    74% |
| common/incremental/state/table_scope.py                        |     8 |    0 |     8 |   100% |
| common/incremental/storage/__init__.py                         |     1 |    1 |     0 |     0% |
| common/incremental/storage/duckdb_utils.py                     |    24 |    8 |    16 |    67% |
| common/incremental/storage/rocksdb_utils.py                    |    11 |    5 |     6 |    55% |
| contracts/__init__.py                                          |     3 |    2 |     1 |    33% |
| contracts/base.py                                              |    39 |    7 |    32 |    82% |
| contracts/cleanup.py                                           |     5 |    0 |     5 |   100% |
| contracts/compat.py                                            |     9 |    1 |     8 |    89% |
| contracts/events.py                                            |    12 |    0 |    12 |   100% |
| contracts/storage.py                                           |    12 |    2 |    10 |    83% |
| contracts/types.py                                             |    24 |    1 |    23 |    96% |
| contracts/types_errors.py                                      |     2 |    0 |     2 |   100% |
| credentials/__init__.py                                        |     3 |    2 |     1 |    33% |
| credentials/agent.py                                           |    21 |    4 |    17 |    81% |
| credentials/atlan.py                                           |    12 |    6 |     6 |    50% |
| credentials/atlan_client.py                                    |     6 |    0 |     6 |   100% |
| credentials/errors.py                                          |    20 |   12 |     8 |    40% |
| credentials/extra.py                                           |     3 |    1 |     2 |    67% |
| credentials/git.py                                             |     9 |    6 |     3 |    33% |
| credentials/ingress.py                                         |     9 |    0 |     9 |   100% |
| credentials/oauth.py                                           |    13 |    2 |    11 |    85% |
| credentials/ref.py                                             |    17 |    1 |    16 |    94% |
| credentials/registry.py                                        |    11 |    3 |     8 |    73% |
| credentials/requirements.py                                    |    19 |    7 |    12 |    63% |
| credentials/resolver.py                                        |    11 |    4 |     7 |    64% |
| credentials/routing.py                                         |    10 |    1 |     9 |    90% |
| credentials/spec.py                                            |    23 |   11 |    12 |    52% |
| credentials/types.py                                           |    35 |   17 |    18 |    51% |
| credentials/utils.py                                           |    16 |    3 |    13 |    81% |
| dev/__init__.py                                                |     1 |    0 |     1 |   100% |
| dev/_dapr.py                                                   |    17 |    3 |    14 |    82% |
| dev/_dapr_errors.py                                            |    10 |    9 |     1 |    10% |
| dev/_embedded.py                                               |     4 |    0 |     4 |   100% |
| dev/_pkl_errors.py                                             |     3 |    0 |     3 |   100% |
| dev/pkl.py                                                     |    16 |    6 |    10 |    62% |
| errors/__init__.py                                             |     4 |    1 |     3 |    75% |
| errors/base.py                                                 |    15 |    2 |    13 |    87% |
| errors/categories.py                                           |     3 |    0 |     3 |   100% |
| errors/http.py                                                 |     4 |    1 |     3 |    75% |
| errors/leaves.py                                               |    26 |    8 |    18 |    69% |
| errors/wire.py                                                 |     5 |    1 |     4 |    80% |
| execution/__init__.py                                          |     1 |    0 |     1 |   100% |
| execution/decorators.py                                        |     3 |    2 |     1 |    33% |
| execution/errors.py                                            |     2 |    0 |     2 |   100% |
| execution/heartbeat.py                                         |    26 |    4 |    22 |    85% |
| execution/progress.py                                          |     6 |    0 |     6 |   100% |
| execution/progress_telemetry.py                                |     7 |    1 |     6 |    86% |
| execution/retry.py                                             |     9 |    0 |     9 |   100% |
| execution/run_length.py                                        |     7 |    1 |     6 |    86% |
| execution/sandbox.py                                           |     4 |    0 |     4 |   100% |
| execution/settings.py                                          |    12 |    2 |    10 |    83% |
| execution/shutdown.py                                          |     4 |    0 |     4 |   100% |
| execution/_temporal/__init__.py                                |     1 |    1 |     0 |     0% |
| execution/_temporal/_activity_errors.py                        |     9 |    0 |     9 |   100% |
| execution/_temporal/_backend_errors.py                         |     6 |    4 |     2 |    33% |
| execution/_temporal/_lock_errors.py                            |     5 |    0 |     5 |   100% |
| execution/_temporal/_store_records.py                          |    17 |    3 |    14 |    82% |
| execution/_temporal/activities.py                              |    12 |    0 |    12 |   100% |
| execution/_temporal/activity_utils.py                          |     7 |    0 |     7 |   100% |
| execution/_temporal/auth.py                                    |    16 |    0 |    16 |   100% |
| execution/_temporal/backend.py                                 |    18 |    3 |    15 |    83% |
| execution/_temporal/converter.py                               |     3 |    0 |     3 |   100% |
| execution/_temporal/credential_sweep.py                        |     5 |    0 |     5 |   100% |
| execution/_temporal/eviction_retry.py                          |     4 |    0 |     4 |   100% |
| execution/_temporal/lock_activities.py                         |     5 |    0 |     5 |   100% |
| execution/_temporal/poll_state.py                              |     7 |    1 |     6 |    86% |
| execution/_temporal/preflight_gate.py                          |    93 |    8 |    85 |    91% |
| execution/_temporal/preflight_persist.py                       |    15 |    0 |    15 |   100% |
| execution/_temporal/preflight_transport.py                     |     8 |    3 |     5 |    62% |
| execution/_temporal/sdr.py                                     |    19 |    8 |    11 |    58% |
| execution/_temporal/store_assert.py                            |    25 |    4 |    21 |    84% |
| execution/_temporal/worker.py                                  |    20 |    6 |    14 |    70% |
| execution/_temporal/workflows.py                               |     3 |    0 |     3 |   100% |
| execution/_temporal/interceptors/__init__.py                   |     1 |    0 |     1 |   100% |
| execution/_temporal/interceptors/events.py                     |    28 |    3 |    25 |    89% |
| execution/_temporal/interceptors/liveness.py                   |    11 |    9 |     2 |    18% |
| execution/_temporal/interceptors/lock.py                       |    10 |    2 |     8 |    80% |
| execution/_temporal/interceptors/log.py                        |    25 |   12 |    13 |    52% |
| execution/_temporal/interceptors/metrics.py                    |    18 |   15 |     3 |    17% |
| execution/_temporal/interceptors/outputs.py                    |    22 |    9 |    13 |    59% |
| execution/_temporal/interceptors/sizing.py                     |    18 |    9 |     9 |    50% |
| execution/_temporal/interceptors/trace.py                      |     6 |    4 |     2 |    33% |
| handler/__init__.py                                            |     3 |    2 |     1 |    33% |
| handler/_dispatch.py                                           |    11 |    5 |     6 |    55% |
| handler/_preflight_outcome.py                                  |    16 |    0 |    16 |   100% |
| handler/_warmup.py                                             |    10 |    0 |    10 |   100% |
| handler/asgi.py                                                |    13 |    4 |     9 |    69% |
| handler/base.py                                                |    17 |    3 |    14 |    82% |
| handler/context.py                                             |    24 |    7 |    17 |    71% |
| handler/contracts.py                                           |    56 |   11 |    45 |    80% |
| handler/manifest.py                                            |     5 |    0 |     5 |   100% |
| handler/metadata_routes.py                                     |    29 |    5 |    24 |    83% |
| handler/object_routes.py                                       |    28 |   12 |    16 |    57% |
| handler/request_contract.py                                    |     5 |    1 |     4 |    80% |
| handler/routes.py                                              |    33 |   11 |    22 |    67% |
| handler/service.py                                             |    49 |   19 |    30 |    61% |
| handler/service_errors.py                                      |     4 |    0 |     4 |   100% |
| handler/source_probe_errors.py                                 |    13 |    0 |    13 |   100% |
| handler/source_probes.py                                       |    28 |   14 |    14 |    50% |
| infrastructure/__init__.py                                     |     1 |    0 |     1 |   100% |
| infrastructure/_secret_utils.py                                |     2 |    0 |     2 |   100% |
| infrastructure/_single_key_probe.py                            |     7 |    2 |     5 |    71% |
| infrastructure/bindings.py                                     |    16 |    3 |    13 |    81% |
| infrastructure/capacity.py                                     |    11 |    0 |    11 |   100% |
| infrastructure/context.py                                      |     8 |    0 |     8 |   100% |
| infrastructure/credential_vault.py                             |     8 |    3 |     5 |    62% |
| infrastructure/pubsub.py                                       |    13 |    3 |    10 |    77% |
| infrastructure/secrets.py                                      |    30 |    9 |    21 |    70% |
| infrastructure/state.py                                        |    10 |    7 |     3 |    30% |
| infrastructure/_dapr/__init__.py                               |     1 |    0 |     1 |   100% |
| infrastructure/_dapr/_dapr_errors.py                           |     3 |    0 |     3 |   100% |
| infrastructure/_dapr/client.py                                 |    36 |    4 |    32 |    89% |
| infrastructure/_dapr/credential_vault.py                       |    19 |    6 |    13 |    68% |
| infrastructure/_dapr/http.py                                   |    30 |   20 |    10 |    33% |
| infrastructure/_redis/__init__.py                              |     1 |    0 |     1 |   100% |
| infrastructure/_redis/capacity.py                              |     9 |    4 |     5 |    56% |
| observability/__init__.py                                      |     1 |    1 |     0 |     0% |
| observability/_objectstore_metric_exporter.py                  |    14 |    8 |     6 |    43% |
| observability/_objectstore_metric_reader.py                    |     2 |    0 |     2 |   100% |
| observability/_prometheus_enrichment.py                        |     6 |    3 |     3 |    50% |
| observability/background_loop.py                               |    26 |    6 |    20 |    77% |
| observability/cgroup.py                                        |    20 |    1 |    19 |    95% |
| observability/console_sink.py                                  |    15 |    6 |     9 |    60% |
| observability/context.py                                       |     6 |    0 |     6 |   100% |
| observability/correlation.py                                   |     6 |    0 |     6 |   100% |
| observability/dapr_log_forwarder.py                            |    17 |    4 |    13 |    76% |
| observability/events.py                                        |     1 |    0 |     1 |   100% |
| observability/logger_adaptor.py                                |    61 |   12 |    49 |    80% |
| observability/logger_adaptor_errors.py                         |     2 |    0 |     2 |   100% |
| observability/metrics.py                                       |     8 |    6 |     2 |    25% |
| observability/metrics_adaptor.py                               |    12 |    2 |    10 |    83% |
| observability/models.py                                        |     6 |    0 |     6 |   100% |
| observability/observability.py                                 |    27 |    5 |    22 |    81% |
| observability/pushgateway.py                                   |    16 |   11 |     5 |    31% |
| observability/pushgateway_errors.py                            |     3 |    0 |     3 |   100% |
| observability/resource_sampler.py                              |     6 |    0 |     6 |   100% |
| observability/segment_client.py                                |    21 |    3 |    18 |    86% |
| observability/sizing.py                                        |    16 |    7 |     9 |    56% |
| observability/sizing_census.py                                 |     8 |    3 |     5 |    62% |
| observability/sizing_inputs.py                                 |    13 |    3 |    10 |    77% |
| observability/sizing_sink.py                                   |    12 |    1 |    11 |    92% |
| observability/temporal_core_metrics.py                         |    11 |    2 |     9 |    82% |
| observability/trace_context.py                                 |     2 |    0 |     2 |   100% |
| observability/traces_adaptor.py                                |    14 |    1 |    13 |    93% |
| observability/utils.py                                         |     8 |    1 |     7 |    88% |
| observability/decorators/observability_decorator.py            |     7 |    4 |     3 |    43% |
| outputs/__init__.py                                            |     2 |    0 |     2 |   100% |
| outputs/collector.py                                           |    10 |    0 |    10 |   100% |
| outputs/models.py                                              |     3 |    0 |     3 |   100% |
| server/__init__.py                                             |     1 |    0 |     1 |   100% |
| server/health.py                                               |    24 |    0 |    24 |   100% |
| server/fastapi/models.py                                       |    21 |   17 |     4 |    19% |
| server/fastapi/utils.py                                        |     5 |    0 |     5 |   100% |
| server/mcp/__init__.py                                         |     2 |    2 |     0 |     0% |
| server/mcp/decorators.py                                       |     3 |    1 |     2 |    67% |
| server/mcp/models.py                                           |     2 |    2 |     0 |     0% |
| server/mcp/server.py                                           |     7 |    1 |     6 |    86% |
| server/middleware/__init__.py                                  |     1 |    0 |     1 |   100% |
| server/middleware/_constants.py                                |     1 |    0 |     1 |   100% |
| server/middleware/log.py                                       |     4 |    3 |     1 |    25% |
| storage/__init__.py                                            |     1 |    0 |     1 |   100% |
| storage/_budget.py                                             |    11 |    5 |     6 |    55% |
| storage/_concurrency.py                                        |     7 |    3 |     4 |    57% |
| storage/_credential_providers.py                               |     6 |    0 |     6 |   100% |
| storage/_local_marker.py                                       |    13 |    1 |    12 |    92% |
| storage/_locks.py                                              |     5 |    1 |     4 |    80% |
| storage/_manifest.py                                           |     3 |    0 |     3 |   100% |
| storage/_obstore_config.py                                     |    13 |    0 |    13 |   100% |
| storage/_telemetry.py                                          |     5 |    0 |     5 |   100% |
| storage/batch.py                                               |    31 |    5 |    26 |    84% |
| storage/binding.py                                             |    29 |    1 |    28 |    97% |
| storage/chunked.py                                             |    20 |    2 |    18 |    90% |
| storage/cloud.py                                               |    30 |    6 |    24 |    80% |
| storage/errors.py                                              |    61 |   38 |    23 |    38% |
| storage/factory.py                                             |     3 |    0 |     3 |   100% |
| storage/file_ref_sync.py                                       |    19 |    3 |    16 |    84% |
| storage/integrity.py                                           |    14 |    0 |    14 |   100% |
| storage/ops.py                                                 |    47 |    6 |    41 |    87% |
| storage/preflight.py                                           |    13 |    0 |    13 |   100% |
| storage/reference.py                                           |    34 |    3 |    31 |    91% |
| storage/rolling.py                                             |    39 |   15 |    24 |    62% |
| storage/rolling_errors.py                                      |     4 |    0 |     4 |   100% |
| storage/transfer.py                                            |    14 |    0 |    14 |   100% |
| storage/formats/__init__.py                                    |    33 |    0 |    33 |   100% |
| storage/formats/format_errors.py                               |    16 |    0 |    16 |   100% |
| storage/formats/json.py                                        |    16 |    6 |    10 |    62% |
| storage/formats/parquet.py                                     |    33 |    5 |    28 |    85% |
| storage/formats/utils.py                                       |    11 |    2 |     9 |    82% |
| templates/__init__.py                                          |     2 |    1 |     1 |    50% |
| templates/_template_errors.py                                  |    11 |    0 |    11 |   100% |
| templates/base_metadata_extractor.py                           |     4 |    1 |     3 |    75% |
| templates/incremental_sql_metadata_extractor.py                |    21 |    2 |    19 |    90% |
| templates/sql_app.py                                           |    50 |    6 |    44 |    88% |
| templates/sql_app_errors.py                                    |     9 |    0 |     9 |   100% |
| templates/sql_metadata_extractor.py                            |    14 |    1 |    13 |    93% |
| templates/sql_query_extractor.py                               |     6 |    1 |     5 |    83% |
| templates/contracts/__init__.py                                |     1 |    0 |     1 |   100% |
| templates/contracts/base_metadata_extraction.py                |     3 |    0 |     3 |   100% |
| templates/contracts/incremental_sql.py                         |    32 |    7 |    25 |    78% |
| templates/contracts/sql_metadata.py                            |    37 |    9 |    28 |    76% |
| templates/contracts/sql_query.py                               |     7 |    0 |     7 |   100% |
| test_utils/integration/__init__.py                             |     1 |    1 |     0 |     0% |
| testing/__init__.py                                            |     2 |    0 |     2 |   100% |
| testing/_errors.py                                             |     5 |    0 |     5 |   100% |
| testing/_mustache.py                                           |     2 |    0 |     2 |   100% |
| testing/fake_source.py                                         |    60 |   17 |    43 |    72% |
| testing/fixtures.py                                            |    12 |    0 |    12 |   100% |
| testing/golden.py                                              |    26 |   10 |    16 |    62% |
| testing/mocks.py                                               |    68 |   17 |    51 |    75% |
| testing/preflight.py                                           |    20 |    6 |    14 |    70% |
| testing/setup_routes.py                                        |    45 |    5 |    40 |    89% |
| testing/volatile_fields.py                                     |     1 |    0 |     1 |   100% |
| testing/warming.py                                             |    11 |    4 |     7 |    64% |
| testing/e2e/__init__.py                                        |     1 |    0 |     1 |   100% |
| testing/e2e/_errors.py                                         |    18 |    0 |    18 |   100% |
| testing/e2e/_manifest_identity.py                              |    11 |    0 |    11 |   100% |
| testing/e2e/base.py                                            |   137 |    7 |   130 |    95% |
| testing/e2e/client.py                                          |    29 |    7 |    22 |    76% |
| testing/e2e/config.py                                          |     5 |    0 |     5 |   100% |
| testing/e2e/credential.py                                      |     2 |    0 |     2 |   100% |
| testing/e2e/logs.py                                            |     9 |    1 |     8 |    89% |
| testing/e2e/payload.py                                         |    11 |    0 |    11 |   100% |
| testing/e2e/portforward.py                                     |     1 |    0 |     1 |   100% |
| testing/e2e/sql_app.py                                         |    10 |    0 |    10 |   100% |
| testing/e2e/substitutions.py                                   |     3 |    0 |     3 |   100% |
| testing/e2e/system_app.py                                      |    10 |    0 |    10 |   100% |
| testing/e2e/tenant_pool.py                                     |     3 |    0 |     3 |   100% |
| testing/e2e/workflows.py                                       |     6 |    1 |     5 |    83% |
| testing/full_dag/__init__.py                                   |     1 |    0 |     1 |   100% |
| testing/full_dag/_errors.py                                    |     1 |    0 |     1 |   100% |
| testing/full_dag/base.py                                       |    18 |    2 |    16 |    89% |
| testing/full_dag/client.py                                     |     1 |    0 |     1 |   100% |
| testing/full_dag/payload.py                                    |     8 |    0 |     8 |   100% |
| testing/full_dag/sql_app.py                                    |     6 |    1 |     5 |    83% |
| testing/harness/__init__.py                                    |     1 |    0 |     1 |   100% |
| testing/harness/_errors.py                                     |    13 |    0 |    13 |   100% |
| testing/harness/_poll.py                                       |    15 |    0 |    15 |   100% |
| testing/harness/bridge.py                                      |     5 |    0 |     5 |   100% |
| testing/harness/budgets.py                                     |     6 |    0 |     6 |   100% |
| testing/harness/evidence.py                                    |    15 |    1 |    14 |    93% |
| testing/harness/expectations.py                                |    41 |    1 |    40 |    98% |
| testing/harness/fixtures.py                                    |    43 |    4 |    39 |    91% |
| testing/harness/identity.py                                    |    11 |    1 |    10 |    91% |
| testing/harness/outcome.py                                     |    16 |    0 |    16 |   100% |
| testing/harness/preconditions.py                               |    19 |    4 |    15 |    79% |
| testing/harness/spec.py                                        |     2 |    0 |     2 |   100% |
| testing/harness/substrate.py                                   |     3 |    0 |     3 |   100% |
| testing/harness/waiting.py                                     |     8 |    0 |     8 |   100% |
| testing/harness/atlas/__init__.py                              |    29 |    6 |    23 |    79% |
| testing/harness/atlas/_errors.py                               |     2 |    0 |     2 |   100% |
| testing/harness/automation_engine/__init__.py                  |     1 |    0 |     1 |   100% |
| testing/harness/automation_engine/_errors.py                   |    10 |    0 |    10 |   100% |
| testing/harness/automation_engine/client.py                    |    39 |    4 |    35 |    90% |
| testing/harness/automation_engine/retry.py                     |    17 |    1 |    16 |    94% |
| testing/harness/automation_engine/wire.py                      |    24 |    2 |    22 |    92% |
| testing/harness/cluster/__init__.py                            |     1 |    0 |     1 |   100% |
| testing/harness/cluster/_errors.py                             |     4 |    0 |     4 |   100% |
| testing/harness/cluster/_portforward.py                        |    15 |    2 |    13 |    87% |
| testing/harness/cluster/_protocols.py                          |     9 |    0 |     9 |   100% |
| testing/harness/cluster/_states.py                             |     9 |    0 |     9 |   100% |
| testing/harness/cluster/kube.py                                |    50 |    7 |    43 |    86% |
| testing/harness/seed/__init__.py                               |     5 |    0 |     5 |   100% |
| testing/harness/seed/_errors.py                                |     7 |    0 |     7 |   100% |
| testing/harness/seed/_ndjson.py                                |     7 |    0 |     7 |   100% |
| testing/harness/seed/_publish.py                               |     8 |    0 |     8 |   100% |
| testing/harness/seed/_spec.py                                  |    11 |    0 |    11 |   100% |
| testing/harness/starters/__init__.py                           |     2 |    0 |     2 |   100% |
| testing/harness/starters/_ae.py                                |     4 |    0 |     4 |   100% |
| testing/harness/starters/_errors.py                            |     4 |    0 |     4 |   100% |
| testing/harness/starters/_queue.py                             |     3 |    0 |     3 |   100% |
| testing/harness/starters/_specs.py                             |    12 |    0 |    12 |   100% |
| testing/harness/teardown/__init__.py                           |     5 |    0 |     5 |   100% |
| testing/harness/teardown/_dag.py                               |     4 |    0 |     4 |   100% |
| testing/harness/teardown/_purge.py                             |     8 |    0 |     8 |   100% |
| testing/harness/temporal/__init__.py                           |     1 |    0 |     1 |   100% |
| testing/harness/temporal/_errors.py                            |     5 |    0 |     5 |   100% |
| testing/harness/temporal/_protocols.py                         |     4 |    0 |     4 |   100% |
| testing/harness/temporal/_states.py                            |     6 |    0 |     6 |   100% |
| testing/harness/temporal/client.py                             |    23 |    1 |    22 |    96% |
| testing/hypothesis/__init__.py                                 |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/__init__.py                      |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/sql_client.py                    |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/clients/__init__.py              |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/clients/sql.py                   |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/common/__init__.py               |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/common/logger.py                 |     3 |    0 |     3 |   100% |
| testing/hypothesis/strategies/handlers/__init__.py             |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/handlers/sql/__init__.py         |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/handlers/sql/sql_metadata.py     |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/handlers/sql/sql_preflight.py    |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/inputs/__init__.py               |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/inputs/json_input.py             |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/inputs/parquet_input.py          |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/outputs/__init__.py              |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/outputs/json_output.py           |     2 |    1 |     1 |    50% |
| testing/hypothesis/strategies/outputs/statestore.py            |     3 |    1 |     2 |    67% |
| testing/hypothesis/strategies/server/__init__.py               |     1 |    1 |     0 |     0% |
| testing/hypothesis/strategies/server/fastapi/__init__.py       |     1 |    1 |     0 |     0% |
| testing/integration/__init__.py                                |     3 |    1 |     2 |    67% |
| testing/integration/_errors.py                                 |    17 |    0 |    17 |   100% |
| testing/integration/assertions.py                              |    55 |   25 |    30 |    55% |
| testing/integration/client.py                                  |    18 |    0 |    18 |   100% |
| testing/integration/comparison.py                              |    12 |    1 |    11 |    92% |
| testing/integration/corpus.py                                  |    25 |    7 |    18 |    72% |
| testing/integration/fixtures.py                                |    26 |    1 |    25 |    96% |
| testing/integration/lazy.py                                    |    10 |    0 |    10 |   100% |
| testing/integration/models.py                                  |     9 |    0 |     9 |   100% |
| testing/integration/runner.py                                  |    27 |    2 |    25 |    93% |
| testing/integration/source.py                                  |     8 |    0 |     8 |   100% |
| testing/integration/validation.py                              |     7 |    0 |     7 |   100% |
| testing/parity/__init__.py                                     |     1 |    0 |     1 |   100% |
| testing/parity/__main__.py                                     |     2 |    1 |     1 |    50% |
| testing/parity/comparator.py                                   |     8 |    0 |     8 |   100% |
| testing/parity/models.py                                       |     5 |    1 |     4 |    80% |
| testing/parity/report.py                                       |     4 |    0 |     4 |   100% |
| testing/scale_data_generator/__init__.py                       |     1 |    0 |     1 |   100% |
| testing/scale_data_generator/config_loader.py                  |    11 |    4 |     7 |    64% |
| testing/scale_data_generator/data_generator.py                 |    10 |    3 |     7 |    70% |
| testing/scale_data_generator/driver.py                         |     3 |    3 |     0 |     0% |
| testing/scale_data_generator/output_handler/__init__.py        |     1 |    1 |     0 |     0% |
| testing/scale_data_generator/output_handler/base.py            |     7 |    3 |     4 |    57% |
| testing/scale_data_generator/output_handler/csv_handler.py     |     6 |    6 |     0 |     0% |
| testing/scale_data_generator/output_handler/json_handler.py    |     5 |    5 |     0 |     0% |
| testing/scale_data_generator/output_handler/parquet_handler.py |     6 |    6 |     0 |     0% |
| testing/sdr/__init__.py                                        |     1 |    0 |     1 |   100% |
| testing/sdr/base.py                                            |    14 |    3 |    11 |    79% |
| tools/__init__.py                                              |     1 |    1 |     0 |     0% |
| tools/provision_credentials.py                                 |     2 |    1 |     1 |    50% |
| transformers/__init__.py                                       |     4 |    2 |     2 |    50% |
| transformers/errors.py                                         |     2 |    1 |     1 |    50% |
| transformers/atlas/__init__.py                                 |     6 |    1 |     5 |    83% |
| transformers/atlas/errors.py                                   |     8 |    7 |     1 |    12% |
| transformers/atlas/sql.py                                      |    25 |    4 |    21 |    84% |
| transformers/common/__init__.py                                |     1 |    1 |     0 |     0% |
| transformers/common/last_sync.py                               |     1 |    0 |     1 |   100% |
| transformers/common/utils.py                                   |     6 |    0 |     6 |   100% |
| transformers/query/__init__.py                                 |    19 |    2 |    17 |    89% |
| transformers/query/errors.py                                   |     5 |    3 |     2 |    40% |
| validation/__init__.py                                         |     1 |    0 |     1 |   100% |
| validation/artifacts.py                                        |    28 |    2 |    26 |    93% |
| validation/asset_rules.py                                      |     3 |    0 |     3 |   100% |
| validation/assets.py                                           |    33 |    2 |    31 |    94% |
| validation/interceptor.py                                      |    17 |    0 |    17 |   100% |
| validation/ndjson.py                                           |    28 |    4 |    24 |    86% |
| validation/parquet.py                                          |    16 |    0 |    16 |   100% |
| validation/protocols.py                                        |     9 |    0 |     9 |   100% |
| validation/sources.py                                          |    15 |    0 |    15 |   100% |
| validation/wrapper.py                                          |     8 |    0 |     8 |   100% |
|----------------------------------------------------------------|-------|------|-------|--------|
| TOTAL                                                          |  5425 | 1085 |  4340 |  80.0% |
---------------- RESULT: PASSED (minimum: 0.0%, actual: 80.0%) -----------------

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant