Skip to content

HYP-829: run publish preflight as first extract-workflow activity (user gate, no error codes)#1966

Draft
rupeshatlan wants to merge 14 commits into
mainfrom
rupesh/hyp-829-user-gate-only
Draft

HYP-829: run publish preflight as first extract-workflow activity (user gate, no error codes)#1966
rupeshatlan wants to merge 14 commits into
mainfrom
rupesh/hyp-829-user-gate-only

Conversation

@rupeshatlan
Copy link
Copy Markdown

Summary

Part of HYP-829 (Preflight 1 — user publish checks). Companion to heracles PR (head ring-rupesh-hyp-829-user-gate-only).

Wires run_publish_preflight into SqlApp.run() as the first awaited step (Phase 0), before extraction — so scheduled runs that bypass Heracles are still gated. SqlApp now inherits PublishPreflightMixin, so the activity is registered automatically for every SQL app.

The check is consolidated server-side: run_publish_preflight makes a single call to Heracles' new /workflows/preflight/user-publish-check and raises AppPermissionDeniedError (non-retryable) on a failed verdict; fail-open on transport error. checks.py is reduced to a thin client — the raw-httpx user lookup, Keycloak token-exchange, and /evaluates plumbing are removed (addresses the earlier "reinventing pyatlan" review).

ExtractionInput gains user_id with AliasChoices("user_id","user-id") + populate_by_name so Heracles' kebab-case user-id DAG arg actually populates the field — previously the base Input validator only warned and Pydantic dropped it (the activity would have always self-skipped). The unknown-key validator now also recognises validation aliases so it no longer falsely warns "silently dropped".

This branch is the user-gate-only line — the HYP-1309 semantic-status-code work was intentionally dropped per product call.

Tests

  • Rewritten tests/unit/handler/test_checks.py (thin client: payload/headers/URL, parsing, non-200) and tests/unit/app/test_preflight.py (skip paths, pass, raise-on-fail, fail-open).
  • 787 passed across handler/app/templates + base-contracts regression; alias populate + no-false-warning verified.

Pending / reviewer notes

  • End-to-end on deexp (manual + scheduled, disabled-user T3) still TODO.
  • docs/agents/sdk-capabilities.md references the removed check_* helpers — regenerate via the skill (auto-generated, not hand-edited here).

🤖 Generated with Claude Code

rupeshatlan and others added 13 commits May 13, 2026 15:40
…(HYP-829)

- Add http_status property to FailureCategory enum with RFC-standard
  mappings (AUTH→401, PERMISSION→403, INVALID_INPUT→422,
  DEPENDENCY_UNAVAILABLE→503, TIMEOUT→504, INTERNAL→500, etc.)
- Add http_status property to AppError that delegates to its category
- Guard model_validate in auth/preflight/metadata endpoints so
  ValidationError raises InvalidInputError (422) instead of 500
- Add except AppError clause before bare except Exception in all three
  handler endpoints so typed errors (AuthError, NotFoundError, etc.)
  surface the correct HTTP status to callers
…HYP-829 G6)

Rewrites check_atlan_publish_permission to call Heracles endpoints
(GET /users/{id}, POST /evaluates) instead of PyAtlan, mirroring the
battle-tested marketplace-scripts/preflight/publish_checks.py approach.

Adds check_user_enabled as a standalone helper for the user-enabled check.

Both checks run in parallel via asyncio.gather — same pattern the call
discussion agreed on (source checks + user permission checks concurrently).

Adds PublishPreflightMixin (application_sdk/app/preflight.py) — a Temporal
activity mixin that apps inherit to get run_publish_preflight() as their
first workflow activity. This covers scheduled workflows, which bypass the
Heracles HTTP-preflight call and go directly to Temporal.

Checks performed (in parallel):
  1. UserEnabled      — GET /users/{user_id}; rejects disabled accounts
  2. AtlanPublishPermission — POST /evaluates; confirms ENTITY_CREATE/UPDATE/DELETE
     on the target connection via Keycloak token-exchange impersonation

Both skip gracefully (pass=True + warning log) when service credentials
or user_id are not available, so existing apps that haven't opted in yet
are unaffected.

Exports:
  from application_sdk.handler import check_user_enabled, check_atlan_publish_permission
  from application_sdk.app import PublishPreflightMixin
…n_publish_permission (HYP-829)

- 11 tests covering enabled/disabled user, 403 from Heracles, network errors,
  permission granted/denied, skipped checks when creds absent, bad client secret
- Fix PreflightOutput.checks field: use allow_unbounded_fields=True to pass
  payload safety validator (checks list is always small, <=2 items)
…(HYP-829)

PreflightOutput skip-path instantiations were missing the checks kwarg, which
`field(default_factory=list)` doesn't satisfy when combined with the dataclass
+ Pydantic Output + Annotated[..., MaxItems(20)] stack. Caught live in Hive
worker logs: TypeError: missing 1 required positional argument: 'checks'.

Also includes:
- handler/checks.py — resolve HERACLES_URL at call time, not module import,
  so env vars injected after module load take effect (P7 follow-up).
- handler/service.py — raise HTTPException(422) directly on model_validate
  failures so InvalidInputError doesn't escape unhandled to the test client
  / FastAPI. Adds except AppError clauses on /auth, /check, /metadata so
  typed errors return their semantic HTTP status code (HYP-829 EC).
- tests/unit/errors/test_categorical.py — EC1+EC2: 14 cases for
  FailureCategory.http_status mapping + 6 cases for AppError.http_status
  delegation + guard test.
- tests/unit/handler/test_service.py — EC3-EC6: AppError subclasses on each
  endpoint return semantic codes; malformed bodies return 422; no stack
  trace leakage in error detail.
… add unit tests (HYP-829)

Root cause of the live Hive worker TypeError 'missing checks argument':
combining @DataClass with a Pydantic Output base class creates a hybrid
that:

  1. Generates a dataclass __init__ that doesn't honor default_factory
     when the field is wrapped in Annotated[..., MaxItems(20)].
  2. Skips Pydantic's __pydantic_fields_set__ initialisation so attribute
     access via the instance breaks (.passed, .checks, .message).

Plain Pydantic subclasses (the rest of the SDK's convention — see
test_service.py's _RoutingInput/_RoutingOutput) work correctly. Removed
the @DataClass decorator from both PreflightInput and PreflightOutput
and added a comment explaining why future readers shouldn't add it back.

Tests added at tests/unit/app/test_preflight.py — 8 cases covering:

  - PreflightOutput construction with/without checks kwarg (regression
    guard for the missing-default bug)
  - run_publish_preflight skip paths (user_id absent, empty user_id,
    service token unavailable) — these crashed at runtime previously
  - run_publish_preflight happy path (all checks pass, message set)
  - run_publish_preflight failure path (raises AppPermissionDeniedError
    with the first failing check's message)
…re is absent (HYP-829)

Live diagnosis from a deexp13p01 cron run showed:

  [ERROR] application_sdk.infrastructure.secrets - Failed to fetch
          deployment config key: ATLAN_AUTH_CLIENT_ID
  [WARNING] application_sdk.app.preflight - run_publish_preflight:
          service token unavailable — skipping checks.

Even though ATLAN_AUTH_CLIENT_ID was set on the pod via envFrom from the
argo-client-creds Kubernetes secret. Root cause: get_deployment_secret()
routes through Dapr to the 'deployment-secret-store' component, but app
worker pods only mount objectstore.yaml + secretstore.yaml — no
deployment-secret-store. Dapr returns no result, the SDK returns None,
the preflight skips.

atlan-publish-app (the only other app using these creds today) sidesteps
this by reading the env vars directly via os.getenv. Matching that
pattern: try Dapr first, fall back to os.environ.get for both the
service-token creds and the impersonation creds. No infra change needed;
unblocks the gate as soon as the env vars are wired via envFrom.
…ght-error-codes

# Conflicts:
#	application_sdk/app/__init__.py
#	application_sdk/handler/service.py
…-829)

Pre-commit hooks on CI flagged formatting drift in code touched by this
PR's preflight + handler endpoint changes. Local pre-commit run produced:

  - ruff-format reformatted multi-arg HTTPException calls
  - isort consolidated import groups
  - PLC0415 caught 3 method-local imports without noqa annotations

The local imports are intentional cold-path deferrals (matching the
existing pattern in this file) — added 'noqa: PLC0415 — cold path'
inline comments so ruff doesn't re-flag them.
Adds PublishPreflightMixin (from application_sdk.app) and
check_user_enabled / check_atlan_publish_permission (from
application_sdk.handler) to the auto-generated capability manifest.

Generated by .claude/skills/capability-manifest extractor.
…rror (HYP-829)

CI surfaced TestHandlerError / test_back_compat failures:

  AttributeError: property 'http_status' of 'HandlerError' object has no setter

Root cause: this branch added `http_status` as a read-only property on
the AppError base class. HandlerError (legacy AppError subclass) sets
`self.http_status = http_status` as an instance attribute in __init__.
The read-only property on the parent shadows that setter, so every
HandlerError construction now raises.

Main solved the same problem differently — a local `_CATEGORY_TO_HTTP`
dict + `_app_error_to_http_status(exc)` helper in handler/service.py
that doesn't touch the AppError class. Aligning with main:

  - Drop the AppError.http_status property.
  - Keep FailureCategory.http_status (no instance-setter conflict; it's
    a property on the enum itself).
  - Rewrite EC2 tests to read `error.category.http_status` instead of
    `error.http_status` — same functional check, different access path.

Also includes a ruff-format pass on application_sdk/handler/checks.py
that was missed in the earlier commit.
…tegorical (HYP-829)

Pre-commit's pinned ruff (different version than locally installed) prefers
the tuple-arg form. One-line change in a single assert.
Removes the HYP-1309 semantic-status-code changes (not required for now):
- errors/categories.py: FailureCategory.http_status property
- handler/service.py: 422 body-validation guards on /auth /check /metadata
- corresponding tests (test_categorical.py, test_service.py)

Retains the HYP-1308 user gate: PublishPreflightMixin.run_publish_preflight
+ check_user_enabled / check_atlan_publish_permission helpers and their tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wires run_publish_preflight into SqlApp.run() as the first awaited step
(Phase 0) before extraction — covers scheduled runs that bypass Heracles.
SqlApp now inherits PublishPreflightMixin so the activity is registered.

The check is consolidated server-side: run_publish_preflight makes a single
call to Heracles' new /workflows/preflight/user-publish-check and raises
AppPermissionDeniedError on a failed verdict (fail-open on transport error).
checks.py is reduced to a thin client — the raw-httpx user lookup,
Keycloak token-exchange, and /evaluates plumbing are removed.

ExtractionInput gains user_id with AliasChoices("user_id","user-id") +
populate_by_name so Heracles' kebab-case user-id DAG arg actually populates
the field (the base Input validator only warned on it before, dropping it).
The unknown-key validator now also recognises validation aliases so it no
longer falsely warns "silently dropped" for aliased fields.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@snykgituser
Copy link
Copy Markdown

snykgituser commented Jun 2, 2026

Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
Code Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

…ate-only

# Conflicts:
#	docs/agents/sdk-capabilities.md
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📜 Docstring Coverage Report

RESULT: PASSED (minimum: 30.0%, actual: 77.6%)

Detailed Coverage Report
======= Coverage for /home/runner/work/application-sdk/application-sdk/ ========
----------------------------------- Summary ------------------------------------
| Name                                                                           | Total | Miss | Cover | Cover% |
|--------------------------------------------------------------------------------|-------|------|-------|--------|
| .claude/skills/capability-manifest/references/extractor.py                     |    21 |    2 |    19 |    90% |
| .mothership/sdk-evolution/scripts/update_index.py                              |    10 |    2 |     8 |    80% |
| application_sdk/__init__.py                                                    |     1 |    0 |     1 |   100% |
| application_sdk/_discovery_errors.py                                           |     7 |    0 |     7 |   100% |
| application_sdk/constants.py                                                   |     3 |    1 |     2 |    67% |
| application_sdk/discovery.py                                                   |    12 |    3 |     9 |    75% |
| application_sdk/main.py                                                        |    31 |    6 |    25 |    81% |
| application_sdk/main_errors.py                                                 |     5 |    0 |     5 |   100% |
| application_sdk/version.py                                                     |     1 |    0 |     1 |   100% |
| application_sdk/app/__init__.py                                                |     1 |    0 |     1 |   100% |
| application_sdk/app/base.py                                                    |    75 |   18 |    57 |    76% |
| application_sdk/app/base_errors.py                                             |     5 |    0 |     5 |   100% |
| application_sdk/app/client.py                                                  |     1 |    0 |     1 |   100% |
| application_sdk/app/context.py                                                 |    39 |    2 |    37 |    95% |
| application_sdk/app/entrypoint.py                                              |    13 |    4 |     9 |    69% |
| application_sdk/app/preflight.py                                               |     6 |    0 |     6 |   100% |
| application_sdk/app/registry.py                                                |    37 |   11 |    26 |    70% |
| application_sdk/app/task.py                                                    |    14 |    6 |     8 |    57% |
| application_sdk/clients/__init__.py                                            |     2 |    1 |     1 |    50% |
| application_sdk/clients/_interface.py                                          |     4 |    1 |     3 |    75% |
| application_sdk/clients/base.py                                                |     6 |    1 |     5 |    83% |
| application_sdk/clients/models.py                                              |     2 |    0 |     2 |   100% |
| application_sdk/clients/redis.py                                               |    27 |    0 |    27 |   100% |
| application_sdk/clients/redis_errors.py                                        |     5 |    0 |     5 |   100% |
| application_sdk/clients/sql.py                                                 |    23 |    1 |    22 |    96% |
| application_sdk/clients/sql_errors.py                                          |    11 |    0 |    11 |   100% |
| application_sdk/clients/sql_typecasters.py                                     |    10 |    4 |     6 |    60% |
| application_sdk/clients/ssl_utils.py                                           |     8 |    0 |     8 |   100% |
| application_sdk/clients/azure/__init__.py                                      |     1 |    0 |     1 |   100% |
| application_sdk/clients/azure/auth.py                                          |     7 |    0 |     7 |   100% |
| application_sdk/clients/azure/azure_errors.py                                  |     8 |    0 |     8 |   100% |
| application_sdk/clients/azure/client.py                                        |    13 |    0 |    13 |   100% |
| application_sdk/common/__init__.py                                             |     1 |    0 |     1 |   100% |
| application_sdk/common/_env.py                                                 |     2 |    0 |     2 |   100% |
| application_sdk/common/aws_utils.py                                            |    10 |    1 |     9 |    90% |
| application_sdk/common/aws_utils_errors.py                                     |     7 |    0 |     7 |   100% |
| application_sdk/common/concurrency.py                                          |     3 |    0 |     3 |   100% |
| application_sdk/common/env_warnings.py                                         |     2 |    0 |     2 |   100% |
| application_sdk/common/error_codes.py                                          |    15 |    3 |    12 |    80% |
| application_sdk/common/errors.py                                               |     6 |    0 |     6 |   100% |
| application_sdk/common/file_converter.py                                       |     9 |    5 |     4 |    44% |
| application_sdk/common/file_ops.py                                             |    16 |    1 |    15 |    94% |
| application_sdk/common/models.py                                               |     4 |    2 |     2 |    50% |
| application_sdk/common/path.py                                                 |     2 |    1 |     1 |    50% |
| application_sdk/common/spillable_dict.py                                       |    17 |   11 |     6 |    35% |
| application_sdk/common/sql_filters.py                                          |    13 |    1 |    12 |    92% |
| application_sdk/common/sql_filters_errors.py                                   |     2 |    0 |     2 |   100% |
| application_sdk/common/transforms.py                                           |     5 |    0 |     5 |   100% |
| application_sdk/common/types.py                                                |     2 |    1 |     1 |    50% |
| application_sdk/common/utils.py                                                |     2 |    0 |     2 |   100% |
| application_sdk/common/incremental/__init__.py                                 |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/helpers.py                                  |    12 |    1 |    11 |    92% |
| application_sdk/common/incremental/incremental_errors.py                       |    11 |    0 |    11 |   100% |
| application_sdk/common/incremental/marker.py                                   |     5 |    0 |     5 |   100% |
| application_sdk/common/incremental/models.py                                   |    10 |    0 |    10 |   100% |
| application_sdk/common/incremental/column_extraction/__init__.py               |     1 |    0 |     1 |   100% |
| application_sdk/common/incremental/column_extraction/analysis.py               |     3 |    0 |     3 |   100% |
| application_sdk/common/incremental/column_extraction/backfill.py               |     3 |    0 |     3 |   100% |
| application_sdk/common/incremental/state/__init__.py                           |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/state/incremental_diff.py                   |     8 |    0 |     8 |   100% |
| application_sdk/common/incremental/state/state_reader.py                       |     2 |    0 |     2 |   100% |
| application_sdk/common/incremental/state/state_writer.py                       |    10 |    0 |    10 |   100% |
| application_sdk/common/incremental/state/table_scope.py                        |     8 |    0 |     8 |   100% |
| application_sdk/common/incremental/storage/__init__.py                         |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/storage/duckdb_utils.py                     |    12 |    2 |    10 |    83% |
| application_sdk/common/incremental/storage/rocksdb_utils.py                    |     3 |    0 |     3 |   100% |
| application_sdk/contracts/__init__.py                                          |     1 |    0 |     1 |   100% |
| application_sdk/contracts/base.py                                              |    37 |    7 |    30 |    81% |
| application_sdk/contracts/cleanup.py                                           |     5 |    0 |     5 |   100% |
| application_sdk/contracts/events.py                                            |    12 |    0 |    12 |   100% |
| application_sdk/contracts/storage.py                                           |     6 |    1 |     5 |    83% |
| application_sdk/contracts/types.py                                             |    15 |    0 |    15 |   100% |
| application_sdk/contracts/types_errors.py                                      |     2 |    0 |     2 |   100% |
| application_sdk/credentials/__init__.py                                        |     1 |    0 |     1 |   100% |
| application_sdk/credentials/agent.py                                           |     7 |    1 |     6 |    86% |
| application_sdk/credentials/atlan.py                                           |    12 |    6 |     6 |    50% |
| application_sdk/credentials/atlan_client.py                                    |     6 |    0 |     6 |   100% |
| application_sdk/credentials/errors.py                                          |    20 |   12 |     8 |    40% |
| application_sdk/credentials/git.py                                             |     9 |    6 |     3 |    33% |
| application_sdk/credentials/oauth.py                                           |    13 |    2 |    11 |    85% |
| application_sdk/credentials/ref.py                                             |    16 |    1 |    15 |    94% |
| application_sdk/credentials/registry.py                                        |    11 |    3 |     8 |    73% |
| application_sdk/credentials/resolver.py                                        |    11 |    4 |     7 |    64% |
| application_sdk/credentials/spec.py                                            |     6 |    1 |     5 |    83% |
| application_sdk/credentials/types.py                                           |    35 |   17 |    18 |    51% |
| application_sdk/credentials/utils.py                                           |     3 |    0 |     3 |   100% |
| application_sdk/dev/__init__.py                                                |     1 |    0 |     1 |   100% |
| application_sdk/dev/_dapr.py                                                   |    11 |    2 |     9 |    82% |
| application_sdk/dev/_dapr_errors.py                                            |     5 |    4 |     1 |    20% |
| application_sdk/dev/_embedded.py                                               |     3 |    0 |     3 |   100% |
| application_sdk/errors/__init__.py                                             |     4 |    1 |     3 |    75% |
| application_sdk/errors/base.py                                                 |     8 |    2 |     6 |    75% |
| application_sdk/errors/categories.py                                           |     3 |    0 |     3 |   100% |
| application_sdk/errors/leaves.py                                               |    15 |    8 |     7 |    47% |
| application_sdk/errors/wire.py                                                 |     3 |    1 |     2 |    67% |
| application_sdk/execution/__init__.py                                          |     1 |    0 |     1 |   100% |
| application_sdk/execution/decorators.py                                        |     3 |    2 |     1 |    33% |
| application_sdk/execution/errors.py                                            |     2 |    0 |     2 |   100% |
| application_sdk/execution/heartbeat.py                                         |    17 |    2 |    15 |    88% |
| application_sdk/execution/retry.py                                             |     7 |    0 |     7 |   100% |
| application_sdk/execution/sandbox.py                                           |     4 |    0 |     4 |   100% |
| application_sdk/execution/settings.py                                          |     6 |    1 |     5 |    83% |
| application_sdk/execution/shutdown.py                                          |     4 |    0 |     4 |   100% |
| application_sdk/execution/_temporal/__init__.py                                |     1 |    1 |     0 |     0% |
| application_sdk/execution/_temporal/_activity_errors.py                        |     7 |    0 |     7 |   100% |
| application_sdk/execution/_temporal/_backend_errors.py                         |     5 |    4 |     1 |    20% |
| application_sdk/execution/_temporal/_lock_errors.py                            |     5 |    0 |     5 |   100% |
| application_sdk/execution/_temporal/activities.py                              |     7 |    0 |     7 |   100% |
| application_sdk/execution/_temporal/activity_utils.py                          |     6 |    0 |     6 |   100% |
| application_sdk/execution/_temporal/auth.py                                    |    12 |    0 |    12 |   100% |
| application_sdk/execution/_temporal/backend.py                                 |    12 |    1 |    11 |    92% |
| application_sdk/execution/_temporal/converter.py                               |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/eviction_retry.py                          |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/lock_activities.py                         |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/sdr.py                                     |    13 |    7 |     6 |    46% |
| application_sdk/execution/_temporal/worker.py                                  |    10 |    5 |     5 |    50% |
| application_sdk/execution/_temporal/workflows.py                               |     2 |    0 |     2 |   100% |
| application_sdk/execution/_temporal/interceptors/__init__.py                   |     1 |    0 |     1 |   100% |
| application_sdk/execution/_temporal/interceptors/events.py                     |    13 |    0 |    13 |   100% |
| application_sdk/execution/_temporal/interceptors/lock.py                       |    10 |    2 |     8 |    80% |
| application_sdk/execution/_temporal/interceptors/log.py                        |    19 |   12 |     7 |    37% |
| application_sdk/execution/_temporal/interceptors/metrics.py                    |    16 |   13 |     3 |    19% |
| application_sdk/execution/_temporal/interceptors/outputs.py                    |     9 |    0 |     9 |   100% |
| application_sdk/execution/_temporal/interceptors/trace.py                      |     6 |    4 |     2 |    33% |
| application_sdk/handler/__init__.py                                            |     1 |    0 |     1 |   100% |
| application_sdk/handler/base.py                                                |    14 |    3 |    11 |    79% |
| application_sdk/handler/checks.py                                              |     3 |    0 |     3 |   100% |
| application_sdk/handler/context.py                                             |    17 |    5 |    12 |    71% |
| application_sdk/handler/contracts.py                                           |    32 |    3 |    29 |    91% |
| application_sdk/handler/manifest.py                                            |     5 |    0 |     5 |   100% |
| application_sdk/handler/service.py                                             |    44 |   23 |    21 |    48% |
| application_sdk/handler/service_errors.py                                      |     4 |    0 |     4 |   100% |
| application_sdk/infrastructure/__init__.py                                     |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_secret_utils.py                                |     2 |    0 |     2 |   100% |
| application_sdk/infrastructure/bindings.py                                     |    16 |    3 |    13 |    81% |
| application_sdk/infrastructure/capacity.py                                     |    11 |    0 |    11 |   100% |
| application_sdk/infrastructure/context.py                                      |     6 |    0 |     6 |   100% |
| application_sdk/infrastructure/credential_vault.py                             |     7 |    3 |     4 |    57% |
| application_sdk/infrastructure/pubsub.py                                       |    13 |    3 |    10 |    77% |
| application_sdk/infrastructure/secrets.py                                      |    21 |    6 |    15 |    71% |
| application_sdk/infrastructure/state.py                                        |    10 |    7 |     3 |    30% |
| application_sdk/infrastructure/_dapr/__init__.py                               |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_dapr/_dapr_errors.py                           |     3 |    0 |     3 |   100% |
| application_sdk/infrastructure/_dapr/client.py                                 |    28 |    4 |    24 |    86% |
| application_sdk/infrastructure/_dapr/credential_vault.py                       |    13 |    4 |     9 |    69% |
| application_sdk/infrastructure/_dapr/http.py                                   |    17 |   12 |     5 |    29% |
| application_sdk/infrastructure/_redis/__init__.py                              |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_redis/capacity.py                              |     9 |    4 |     5 |    56% |
| application_sdk/observability/__init__.py                                      |     1 |    1 |     0 |     0% |
| application_sdk/observability/_objectstore_metric_exporter.py                  |    13 |    8 |     5 |    38% |
| application_sdk/observability/_objectstore_metric_reader.py                    |     2 |    0 |     2 |   100% |
| application_sdk/observability/_prometheus_enrichment.py                        |     6 |    3 |     3 |    50% |
| application_sdk/observability/context.py                                       |     4 |    0 |     4 |   100% |
| application_sdk/observability/correlation.py                                   |     6 |    0 |     6 |   100% |
| application_sdk/observability/logger_adaptor.py                                |    46 |    8 |    38 |    83% |
| application_sdk/observability/logger_adaptor_errors.py                         |     2 |    0 |     2 |   100% |
| application_sdk/observability/metrics.py                                       |     8 |    6 |     2 |    25% |
| application_sdk/observability/metrics_adaptor.py                               |    13 |    2 |    11 |    85% |
| application_sdk/observability/models.py                                        |     6 |    0 |     6 |   100% |
| application_sdk/observability/observability.py                                 |    19 |    4 |    15 |    79% |
| application_sdk/observability/pushgateway.py                                   |    16 |   11 |     5 |    31% |
| application_sdk/observability/pushgateway_errors.py                            |     3 |    0 |     3 |   100% |
| application_sdk/observability/resource_sampler.py                              |     5 |    0 |     5 |   100% |
| application_sdk/observability/segment_client.py                                |    15 |    1 |    14 |    93% |
| application_sdk/observability/trace_context.py                                 |     2 |    0 |     2 |   100% |
| application_sdk/observability/traces_adaptor.py                                |    15 |    1 |    14 |    93% |
| application_sdk/observability/utils.py                                         |     7 |    1 |     6 |    86% |
| application_sdk/observability/decorators/observability_decorator.py            |     7 |    4 |     3 |    43% |
| application_sdk/outputs/__init__.py                                            |     2 |    0 |     2 |   100% |
| application_sdk/outputs/collector.py                                           |     9 |    0 |     9 |   100% |
| application_sdk/outputs/models.py                                              |     3 |    0 |     3 |   100% |
| application_sdk/server/health.py                                               |    20 |    0 |    20 |   100% |
| application_sdk/server/fastapi/models.py                                       |    21 |   17 |     4 |    19% |
| application_sdk/server/fastapi/utils.py                                        |     5 |    0 |     5 |   100% |
| application_sdk/server/mcp/__init__.py                                         |     2 |    2 |     0 |     0% |
| application_sdk/server/mcp/decorators.py                                       |     3 |    1 |     2 |    67% |
| application_sdk/server/mcp/models.py                                           |     2 |    2 |     0 |     0% |
| application_sdk/server/mcp/server.py                                           |     5 |    0 |     5 |   100% |
| application_sdk/server/middleware/__init__.py                                  |     1 |    0 |     1 |   100% |
| application_sdk/server/middleware/_constants.py                                |     1 |    0 |     1 |   100% |
| application_sdk/server/middleware/log.py                                       |     4 |    3 |     1 |    25% |
| application_sdk/storage/__init__.py                                            |     1 |    0 |     1 |   100% |
| application_sdk/storage/_concurrency.py                                        |     3 |    1 |     2 |    67% |
| application_sdk/storage/_credential_providers.py                               |     3 |    0 |     3 |   100% |
| application_sdk/storage/_obstore_config.py                                     |     8 |    0 |     8 |   100% |
| application_sdk/storage/batch.py                                               |     8 |    2 |     6 |    75% |
| application_sdk/storage/binding.py                                             |    13 |    1 |    12 |    92% |
| application_sdk/storage/cloud.py                                               |    22 |    5 |    17 |    77% |
| application_sdk/storage/errors.py                                              |    29 |   19 |    10 |    34% |
| application_sdk/storage/factory.py                                             |     3 |    0 |     3 |   100% |
| application_sdk/storage/file_ref_sync.py                                       |    13 |    3 |    10 |    77% |
| application_sdk/storage/ops.py                                                 |    21 |    1 |    20 |    95% |
| application_sdk/storage/reference.py                                           |    11 |    1 |    10 |    91% |
| application_sdk/storage/rolling.py                                             |    31 |   12 |    19 |    61% |
| application_sdk/storage/rolling_errors.py                                      |     4 |    0 |     4 |   100% |
| application_sdk/storage/transfer.py                                            |    13 |    3 |    10 |    77% |
| application_sdk/storage/formats/__init__.py                                    |    29 |    0 |    29 |   100% |
| application_sdk/storage/formats/format_errors.py                               |    19 |    0 |    19 |   100% |
| application_sdk/storage/formats/json.py                                        |    15 |    1 |    14 |    93% |
| application_sdk/storage/formats/parquet.py                                     |    28 |    1 |    27 |    96% |
| application_sdk/storage/formats/utils.py                                       |     9 |    2 |     7 |    78% |
| application_sdk/templates/__init__.py                                          |     2 |    1 |     1 |    50% |
| application_sdk/templates/_template_errors.py                                  |     4 |    0 |     4 |   100% |
| application_sdk/templates/base_metadata_extractor.py                           |     4 |    1 |     3 |    75% |
| application_sdk/templates/incremental_sql_metadata_extractor.py                |    18 |    1 |    17 |    94% |
| application_sdk/templates/sql_app.py                                           |    31 |    0 |    31 |   100% |
| application_sdk/templates/sql_app_errors.py                                    |     7 |    0 |     7 |   100% |
| application_sdk/templates/sql_metadata_extractor.py                            |    14 |    1 |    13 |    93% |
| application_sdk/templates/sql_query_extractor.py                               |     6 |    1 |     5 |    83% |
| application_sdk/templates/contracts/__init__.py                                |     1 |    0 |     1 |   100% |
| application_sdk/templates/contracts/base_metadata_extraction.py                |     3 |    0 |     3 |   100% |
| application_sdk/templates/contracts/incremental_sql.py                         |    26 |    5 |    21 |    81% |
| application_sdk/templates/contracts/sql_metadata.py                            |    31 |    8 |    23 |    74% |
| application_sdk/templates/contracts/sql_query.py                               |     7 |    0 |     7 |   100% |
| application_sdk/test_utils/integration/__init__.py                             |     1 |    1 |     0 |     0% |
| application_sdk/testing/__init__.py                                            |     1 |    0 |     1 |   100% |
| application_sdk/testing/fixtures.py                                            |    10 |    0 |    10 |   100% |
| application_sdk/testing/mocks.py                                               |    68 |   17 |    51 |    75% |
| application_sdk/testing/e2e/__init__.py                                        |     1 |    0 |     1 |   100% |
| application_sdk/testing/e2e/_errors.py                                         |    10 |    0 |    10 |   100% |
| application_sdk/testing/e2e/base.py                                            |    18 |    1 |    17 |    94% |
| application_sdk/testing/e2e/client.py                                          |    32 |    6 |    26 |    81% |
| application_sdk/testing/e2e/config.py                                          |     2 |    0 |     2 |   100% |
| application_sdk/testing/e2e/credential.py                                      |     2 |    0 |     2 |   100% |
| application_sdk/testing/e2e/logs.py                                            |     6 |    1 |     5 |    83% |
| application_sdk/testing/e2e/payload.py                                         |     9 |    0 |     9 |   100% |
| application_sdk/testing/e2e/pods.py                                            |     5 |    1 |     4 |    80% |
| application_sdk/testing/e2e/portforward.py                                     |     4 |    0 |     4 |   100% |
| application_sdk/testing/e2e/sql_app.py                                         |     9 |    0 |     9 |   100% |
| application_sdk/testing/e2e/substitutions.py                                   |     3 |    0 |     3 |   100% |
| application_sdk/testing/e2e/workflows.py                                       |     3 |    0 |     3 |   100% |
| application_sdk/testing/full_dag/__init__.py                                   |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/_errors.py                                    |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/base.py                                       |    15 |    1 |    14 |    93% |
| application_sdk/testing/full_dag/client.py                                     |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/payload.py                                    |     8 |    0 |     8 |   100% |
| application_sdk/testing/full_dag/sql_app.py                                    |     5 |    0 |     5 |   100% |
| application_sdk/testing/hypothesis/__init__.py                                 |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/__init__.py                      |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/sql_client.py                    |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/clients/__init__.py              |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/clients/sql.py                   |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/common/__init__.py               |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/common/logger.py                 |     3 |    0 |     3 |   100% |
| application_sdk/testing/hypothesis/strategies/handlers/__init__.py             |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/__init__.py         |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/sql_metadata.py     |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/sql_preflight.py    |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/__init__.py               |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/json_input.py             |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/parquet_input.py          |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/outputs/__init__.py              |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/outputs/json_output.py           |     2 |    1 |     1 |    50% |
| application_sdk/testing/hypothesis/strategies/outputs/statestore.py            |     3 |    1 |     2 |    67% |
| application_sdk/testing/hypothesis/strategies/server/__init__.py               |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/server/fastapi/__init__.py       |     1 |    1 |     0 |     0% |
| application_sdk/testing/integration/__init__.py                                |     1 |    0 |     1 |   100% |
| application_sdk/testing/integration/_errors.py                                 |     4 |    0 |     4 |   100% |
| application_sdk/testing/integration/assertions.py                              |    55 |   25 |    30 |    55% |
| application_sdk/testing/integration/client.py                                  |    18 |    0 |    18 |   100% |
| application_sdk/testing/integration/comparison.py                              |    12 |    1 |    11 |    92% |
| application_sdk/testing/integration/lazy.py                                    |    10 |    0 |    10 |   100% |
| application_sdk/testing/integration/models.py                                  |     9 |    0 |     9 |   100% |
| application_sdk/testing/integration/runner.py                                  |    24 |    2 |    22 |    92% |
| application_sdk/testing/integration/validation.py                              |     7 |    0 |     7 |   100% |
| application_sdk/testing/parity/__init__.py                                     |     1 |    0 |     1 |   100% |
| application_sdk/testing/parity/__main__.py                                     |     2 |    1 |     1 |    50% |
| application_sdk/testing/parity/comparator.py                                   |     8 |    0 |     8 |   100% |
| application_sdk/testing/parity/models.py                                       |     5 |    1 |     4 |    80% |
| application_sdk/testing/parity/report.py                                       |     4 |    0 |     4 |   100% |
| application_sdk/testing/scale_data_generator/__init__.py                       |     1 |    0 |     1 |   100% |
| application_sdk/testing/scale_data_generator/config_loader.py                  |    11 |    4 |     7 |    64% |
| application_sdk/testing/scale_data_generator/data_generator.py                 |    10 |    3 |     7 |    70% |
| application_sdk/testing/scale_data_generator/driver.py                         |     3 |    3 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/__init__.py        |     1 |    1 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/base.py            |     7 |    3 |     4 |    57% |
| application_sdk/testing/scale_data_generator/output_handler/csv_handler.py     |     6 |    6 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/json_handler.py    |     5 |    5 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/parquet_handler.py |     6 |    6 |     0 |     0% |
| application_sdk/testing/sdr/__init__.py                                        |     1 |    0 |     1 |   100% |
| application_sdk/testing/sdr/base.py                                            |     5 |    2 |     3 |    60% |
| application_sdk/tools/__init__.py                                              |     1 |    1 |     0 |     0% |
| application_sdk/tools/provision_credentials.py                                 |     2 |    1 |     1 |    50% |
| application_sdk/transformers/__init__.py                                       |     3 |    1 |     2 |    67% |
| application_sdk/transformers/errors.py                                         |     2 |    1 |     1 |    50% |
| application_sdk/transformers/atlas/__init__.py                                 |     6 |    1 |     5 |    83% |
| application_sdk/transformers/atlas/errors.py                                   |     8 |    7 |     1 |    12% |
| application_sdk/transformers/atlas/sql.py                                      |    25 |    4 |    21 |    84% |
| application_sdk/transformers/common/__init__.py                                |     1 |    1 |     0 |     0% |
| application_sdk/transformers/common/last_sync.py                               |     5 |    0 |     5 |   100% |
| application_sdk/transformers/common/utils.py                                   |     6 |    0 |     6 |   100% |
| application_sdk/transformers/query/__init__.py                                 |    11 |    2 |     9 |    82% |
| application_sdk/transformers/query/errors.py                                   |     4 |    3 |     1 |    25% |
| contract-toolkit/examples/bundle/app/generated/crawler/__init__.py             |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/crawler/_input.py               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/__init__.py               |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/_input.py                 |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/connection-ref/app/generated/__init__.py             |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/connection-ref/app/generated/_input.py               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/__init__.py                     |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/_input.py                       |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/__init__.py                      |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/_input.py                        |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/__init__.py                       |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/_input.py                         |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/__init__.py                    |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/_input.py                      |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/__init__.py           |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/_input.py             |     2 |    2 |     0 |     0% |
| contract-toolkit/scripts/test-sdk-import.py                                    |     3 |    1 |     2 |    67% |
| examples/application_custom_fastapi.py                                         |    10 |    5 |     5 |    50% |
| examples/application_fastapi.py                                                |    10 |    1 |     9 |    90% |
| examples/application_hello_world.py                                            |     6 |    0 |     6 |   100% |
| examples/application_sql.py                                                    |    11 |    3 |     8 |    73% |
| examples/application_sql_miner.py                                              |     9 |    3 |     6 |    67% |
| examples/application_sql_with_custom_transformer.py                            |    12 |    7 |     5 |    42% |
| examples/run_examples.py                                                       |    13 |   12 |     1 |     8% |
| tests/__init__.py                                                              |     1 |    1 |     0 |     0% |
| tests/conftest.py                                                              |     1 |    0 |     1 |   100% |
| tests/e2e/__init__.py                                                          |     1 |    1 |     0 |     0% |
| tests/e2e/conftest.py                                                          |     4 |    1 |     3 |    75% |
| tests/integration/__init__.py                                                  |     1 |    0 |     1 |   100% |
| tests/integration/conftest.py                                                  |    14 |    2 |    12 |    86% |
| tests/integration/test_cloud_store.py                                          |    15 |   12 |     3 |    20% |
| tests/integration/test_core_execution.py                                       |    29 |   24 |     5 |    17% |
| tests/integration/test_dapr_http.py                                            |    22 |    0 |    22 |   100% |
| tests/integration/test_error_and_retry.py                                      |    19 |   15 |     4 |    21% |
| tests/integration/test_events_serde.py                                         |    15 |    5 |    10 |    67% |
| tests/integration/test_handler_service.py                                      |    60 |   31 |    29 |    48% |
| tests/integration/test_heartbeat.py                                            |    13 |   10 |     3 |    23% |
| tests/integration/test_incremental_pipeline.py                                 |    14 |    3 |    11 |    79% |
| tests/integration/test_lifecycle.py                                            |    21 |   17 |     4 |    19% |
| tests/integration/test_multi_entrypoint.py                                     |    26 |   19 |     7 |    27% |
| tests/integration/test_output_e2e.py                                           |    16 |    0 |    16 |   100% |
| tests/integration/test_sql_app_file_reference.py                               |    19 |    9 |    10 |    53% |
| tests/integration/test_sql_app_prime_auth.py                                   |    16 |   11 |     5 |    31% |
| tests/integration/test_storage_io.py                                           |    19 |    0 |    19 |   100% |
| tests/integration/test_storage_writers.py                                      |     9 |    2 |     7 |    78% |
| tests/integration/test_temporal_docker_auth.py                                 |    21 |    8 |    13 |    62% |
| tests/integration/test_timeout.py                                              |     7 |    5 |     2 |    29% |
| tests/integration/test_workflow_interaction_cookbook.py                        |    44 |   37 |     7 |    16% |
| tests/integration/test_workflow_interaction_relay.py                           |    17 |   11 |     6 |    35% |
| tests/integration/_example/__init__.py                                         |     1 |    0 |     1 |   100% |
| tests/integration/_example/conftest.py                                         |     6 |    0 |     6 |   100% |
| tests/integration/_example/scenarios.py                                        |     1 |    0 |     1 |   100% |
| tests/integration/_example/test_integration.py                                 |     2 |    0 |     2 |   100% |
| tests/integration/storage/__init__.py                                          |     1 |    1 |     0 |     0% |
| tests/integration/storage/conftest.py                                          |     5 |    0 |     5 |   100% |
| tests/integration/storage/test_binding_azure.py                                |     6 |    0 |     6 |   100% |
| tests/integration/storage/test_binding_gcs.py                                  |     6 |    0 |     6 |   100% |
| tests/integration/storage/test_binding_s3.py                                   |     7 |    0 |     7 |   100% |
| tests/unit/__init__.py                                                         |     1 |    1 |     0 |     0% |
| tests/unit/conftest.py                                                         |     6 |    1 |     5 |    83% |
| tests/unit/test_app_config.py                                                  |    82 |   45 |    37 |    45% |
| tests/unit/test_discovery.py                                                   |    75 |   69 |     6 |     8% |
| tests/unit/test_imports.py                                                     |     4 |    0 |     4 |   100% |
| tests/unit/test_main.py                                                        |   144 |   64 |    80 |    56% |
| tests/unit/test_parse_atlan_yaml.py                                            |    29 |   25 |     4 |    14% |
| tests/unit/app/__init__.py                                                     |     1 |    1 |     0 |     0% |
| tests/unit/app/test_base.py                                                    |   271 |  218 |    53 |    20% |
| tests/unit/app/test_cleanup_files.py                                           |    15 |   14 |     1 |     7% |
| tests/unit/app/test_cleanup_storage.py                                         |    29 |   26 |     3 |    10% |
| tests/unit/app/test_client.py                                                  |    19 |    1 |    18 |    95% |
| tests/unit/app/test_context.py                                                 |    86 |   72 |    14 |    16% |
| tests/unit/app/test_entrypoint.py                                              |    65 |   38 |    27 |    42% |
| tests/unit/app/test_on_complete.py                                             |    35 |   32 |     3 |     9% |
| tests/unit/app/test_preflight.py                                               |    15 |    2 |    13 |    87% |
| tests/unit/app/test_registry.py                                                |    34 |    4 |    30 |    88% |
| tests/unit/app/test_task.py                                                    |    88 |   53 |    35 |    40% |
| tests/unit/clients/__init__.py                                                 |     1 |    1 |     0 |     0% |
| tests/unit/clients/test_async_sql_client.py                                    |    11 |   10 |     1 |     9% |
| tests/unit/clients/test_azure_auth.py                                          |    33 |    0 |    33 |   100% |
| tests/unit/clients/test_azure_client.py                                        |    19 |    0 |    19 |   100% |
| tests/unit/clients/test_azure_client_contracts.py                              |    52 |   46 |     6 |    12% |
| tests/unit/clients/test_base_client.py                                         |    23 |    1 |    22 |    96% |
| tests/unit/clients/test_clienterror_preservation.py                            |    13 |    8 |     5 |    38% |
| tests/unit/clients/test_redis_client.py                                        |    40 |    0 |    40 |   100% |
| tests/unit/clients/test_redis_client_contracts.py                              |    56 |   36 |    20 |    36% |
| tests/unit/clients/test_sql_client.py                                          |    63 |   26 |    37 |    59% |
| tests/unit/clients/test_sql_typecasters.py                                     |    22 |   16 |     6 |    27% |
| tests/unit/clients/test_ssl_utils.py                                           |    41 |    4 |    37 |    90% |
| tests/unit/common/test_aws_utils.py                                            |    32 |    1 |    31 |    97% |
| tests/unit/common/test_column_extraction.py                                    |    11 |    0 |    11 |   100% |
| tests/unit/common/test_env_warnings.py                                         |    10 |    7 |     3 |    30% |
| tests/unit/common/test_file_converter.py                                       |    29 |    0 |    29 |   100% |
| tests/unit/common/test_file_ops.py                                             |    21 |    0 |    21 |   100% |
| tests/unit/common/test_path.py                                                 |     6 |    0 |     6 |   100% |
| tests/unit/common/test_spillable_dict.py                                       |    28 |   18 |    10 |    36% |
| tests/unit/common/test_sql_filters_injection.py                                |    30 |   29 |     1 |     3% |
| tests/unit/common/test_transforms.py                                           |    34 |   31 |     3 |     9% |
| tests/unit/common/test_utils.py                                                |    82 |   11 |    71 |    87% |
| tests/unit/common/test_utils_file_discovery.py                                 |    13 |    0 |    13 |   100% |
| tests/unit/common/incremental/__init__.py                                      |     1 |    1 |     0 |     0% |
| tests/unit/common/incremental/test_helpers.py                                  |    37 |    1 |    36 |    97% |
| tests/unit/common/incremental/test_incremental_diff.py                         |    24 |   15 |     9 |    38% |
| tests/unit/common/incremental/test_marker.py                                   |    16 |    0 |    16 |   100% |
| tests/unit/common/incremental/test_models.py                                   |    15 |    0 |    15 |   100% |
| tests/unit/common/incremental/test_state_reader.py                             |     7 |    1 |     6 |    86% |
| tests/unit/common/incremental/test_state_writer.py                             |    32 |    2 |    30 |    94% |
| tests/unit/common/incremental/column_extraction/__init__.py                    |     1 |    1 |     0 |     0% |
| tests/unit/common/incremental/column_extraction/test_analysis.py               |    16 |   10 |     6 |    38% |
| tests/unit/common/incremental/column_extraction/test_backfill.py               |    24 |    5 |    19 |    79% |
| tests/unit/common/incremental/state/__init__.py                                |     1 |    1 |     0 |     0% |
| tests/unit/common/incremental/state/test_table_scope.py                        |    36 |   26 |    10 |    28% |
| tests/unit/contracts/__init__.py                                               |     1 |    1 |     0 |     0% |
| tests/unit/contracts/test_base.py                                              |   136 |  133 |     3 |     2% |
| tests/unit/contracts/test_connection_ref.py                                    |    31 |   29 |     2 |     6% |
| tests/unit/contracts/test_git_reference.py                                     |    23 |   22 |     1 |     4% |
| tests/unit/contracts/test_storage_tier_temporal_serde.py                       |     9 |    1 |     8 |    89% |
| tests/unit/contracts/test_types.py                                             |    25 |   24 |     1 |     4% |
| tests/unit/credentials/__init__.py                                             |     1 |    1 |     0 |     0% |
| tests/unit/credentials/test_agent.py                                           |    88 |   59 |    29 |    33% |
| tests/unit/credentials/test_atlan.py                                           |    41 |   31 |    10 |    24% |
| tests/unit/credentials/test_atlan_client.py                                    |    29 |   22 |     7 |    24% |
| tests/unit/credentials/test_mock_store.py                                      |    17 |   15 |     2 |    12% |
| tests/unit/credentials/test_oauth.py                                           |    28 |   16 |    12 |    43% |
| tests/unit/credentials/test_ref.py                                             |    26 |   23 |     3 |    12% |
| tests/unit/credentials/test_registry.py                                        |    20 |   18 |     2 |    10% |
| tests/unit/credentials/test_resolver.py                                        |    21 |    9 |    12 |    57% |
| tests/unit/credentials/test_types.py                                           |    42 |   41 |     1 |     2% |
| tests/unit/credentials/test_utils.py                                           |    18 |    1 |    17 |    94% |
| tests/unit/decorators/__init__.py                                              |     1 |    1 |     0 |     0% |
| tests/unit/decorators/test_mcp_tool.py                                         |    56 |    4 |    52 |    93% |
| tests/unit/dev/__init__.py                                                     |     1 |    1 |     0 |     0% |
| tests/unit/dev/test_dapr.py                                                    |    22 |   17 |     5 |    23% |
| tests/unit/dev/test_embedded.py                                                |     6 |    1 |     5 |    83% |
| tests/unit/errors/__init__.py                                                  |     1 |    1 |     0 |     0% |
| tests/unit/errors/test_app_subclassing.py                                      |     9 |    8 |     1 |    11% |
| tests/unit/errors/test_back_compat.py                                          |   102 |  101 |     1 |     1% |
| tests/unit/errors/test_base.py                                                 |    21 |   20 |     1 |     5% |
| tests/unit/errors/test_categorical.py                                          |     7 |    6 |     1 |    14% |
| tests/unit/errors/test_domain_evidence.py                                      |    12 |   10 |     2 |    17% |
| tests/unit/execution/__init__.py                                               |     1 |    1 |     0 |     0% |
| tests/unit/execution/conftest.py                                               |     4 |    2 |     2 |    50% |
| tests/unit/execution/test_activities.py                                        |   119 |  105 |    14 |    12% |
| tests/unit/execution/test_activities_tracking.py                               |    18 |   12 |     6 |    33% |
| tests/unit/execution/test_auth_token_refresh_event.py                          |    62 |   36 |    26 |    42% |
| tests/unit/execution/test_backend.py                                           |    59 |   49 |    10 |    17% |
| tests/unit/execution/test_converter.py                                         |    15 |   12 |     3 |    20% |
| tests/unit/execution/test_eviction.py                                          |    31 |   27 |     4 |    13% |
| tests/unit/execution/test_heartbeat.py                                         |    32 |   18 |    14 |    44% |
| tests/unit/execution/test_lock_interceptor.py                                  |    33 |   13 |    20 |    61% |
| tests/unit/execution/test_run_in_thread.py                                     |     6 |    1 |     5 |    83% |
| tests/unit/execution/test_sdr.py                                               |    31 |   25 |     6 |    19% |
| tests/unit/execution/test_settings.py                                          |    28 |   23 |     5 |    18% |
| tests/unit/execution/test_temporal_prometheus.py                               |     7 |    0 |     7 |   100% |
| tests/unit/execution/test_worker.py                                            |    83 |   64 |    19 |    23% |
| tests/unit/execution/test_workflows.py                                         |    44 |   37 |     7 |    16% |
| tests/unit/handler/__init__.py                                                 |     1 |    1 |     0 |     0% |
| tests/unit/handler/test_base.py                                                |    18 |   17 |     1 |     6% |
| tests/unit/handler/test_checks.py                                              |    15 |   13 |     2 |    13% |
| tests/unit/handler/test_contracts.py                                           |    63 |   44 |    19 |    30% |
| tests/unit/handler/test_service.py                                             |   356 |  237 |   119 |    33% |
| tests/unit/infrastructure/__init__.py                                          |     1 |    1 |     0 |     0% |
| tests/unit/infrastructure/test_bindings.py                                     |    18 |   14 |     4 |    22% |
| tests/unit/infrastructure/test_capacity.py                                     |    20 |   16 |     4 |    20% |
| tests/unit/infrastructure/test_connection_pool_config.py                       |    13 |    1 |    12 |    92% |
| tests/unit/infrastructure/test_credential_state_store.py                       |    19 |   12 |     7 |    37% |
| tests/unit/infrastructure/test_credential_vault.py                             |    36 |   17 |    19 |    53% |
| tests/unit/infrastructure/test_dapr_http.py                                    |    45 |   27 |    18 |    40% |
| tests/unit/infrastructure/test_dapr_wrappers.py                                |    46 |   44 |     2 |     4% |
| tests/unit/infrastructure/test_pubsub.py                                       |    30 |   10 |    20 |    67% |
| tests/unit/infrastructure/test_secrets.py                                      |    36 |    0 |    36 |   100% |
| tests/unit/infrastructure/test_state.py                                        |    20 |    0 |    20 |   100% |
| tests/unit/interceptors/__init__.py                                            |     1 |    1 |     0 |     0% |
| tests/unit/interceptors/test_events.py                                         |    42 |   29 |    13 |    31% |
| tests/unit/interceptors/test_log_interceptor.py                                |    84 |   79 |     5 |     6% |
| tests/unit/interceptors/test_metrics_interceptor.py                            |    43 |   41 |     2 |     5% |
| tests/unit/interceptors/test_output_interceptor.py                             |    35 |    3 |    32 |    91% |
| tests/unit/interceptors/test_trace_interceptor.py                              |    17 |   16 |     1 |     6% |
| tests/unit/observability/__init__.py                                           |     1 |    1 |     0 |     0% |
| tests/unit/observability/test_execution_context.py                             |    11 |    0 |    11 |   100% |
| tests/unit/observability/test_logger_adaptor.py                                |   145 |   62 |    83 |    57% |
| tests/unit/observability/test_metrics.py                                       |    11 |   10 |     1 |     9% |
| tests/unit/observability/test_metrics_adaptor.py                               |    29 |    6 |    23 |    79% |
| tests/unit/observability/test_objectstore_metric_exporter.py                   |    17 |   13 |     4 |    24% |
| tests/unit/observability/test_observability_decorator.py                       |    31 |   27 |     4 |    13% |
| tests/unit/observability/test_prometheus_enrichment.py                         |    13 |    8 |     5 |    38% |
| tests/unit/observability/test_pushgateway.py                                   |    50 |   42 |     8 |    16% |
| tests/unit/observability/test_resource_sampler.py                              |    12 |    7 |     5 |    42% |
| tests/unit/observability/test_segment_client.py                                |    70 |   50 |    20 |    29% |
| tests/unit/observability/test_traces_adaptor.py                                |    13 |    1 |    12 |    92% |
| tests/unit/observability/test_traces_adaptor_contracts.py                      |    27 |   22 |     5 |    19% |
| tests/unit/outputs/__init__.py                                                 |     1 |    1 |     0 |     0% |
| tests/unit/outputs/test_outputs.py                                             |    33 |   24 |     9 |    27% |
| tests/unit/server/__init__.py                                                  |     1 |    1 |     0 |     0% |
| tests/unit/server/test_health.py                                               |    24 |   21 |     3 |    12% |
| tests/unit/server/fastapi/test_fastapi_utils.py                                |    36 |    0 |    36 |   100% |
| tests/unit/server/mcp/__init__.py                                              |     1 |    1 |     0 |     0% |
| tests/unit/server/mcp/test_mcp_server_v3.py                                    |    14 |    9 |     5 |    36% |
| tests/unit/server/middleware/__init__.py                                       |     1 |    1 |     0 |     0% |
| tests/unit/server/middleware/test_log.py                                       |    13 |    9 |     4 |    31% |
| tests/unit/storage/__init__.py                                                 |     1 |    1 |     0 |     0% |
| tests/unit/storage/test_batch.py                                               |    36 |   26 |    10 |    28% |
| tests/unit/storage/test_binding.py                                             |    99 |   73 |    26 |    26% |
| tests/unit/storage/test_cloud.py                                               |    45 |   35 |    10 |    22% |
| tests/unit/storage/test_credential_providers.py                                |    11 |   10 |     1 |     9% |
| tests/unit/storage/test_file_ref_sync.py                                       |    37 |   28 |     9 |    24% |
| tests/unit/storage/test_obstore_config.py                                      |    19 |   15 |     4 |    21% |
| tests/unit/storage/test_ops.py                                                 |    98 |   78 |    20 |    20% |
| tests/unit/storage/test_path_separators.py                                     |    13 |    0 |    13 |   100% |
| tests/unit/storage/test_reference.py                                           |    51 |   31 |    20 |    39% |
| tests/unit/storage/test_rolling.py                                             |    68 |   53 |    15 |    22% |
| tests/unit/storage/test_transfer.py                                            |    44 |   34 |    10 |    23% |
| tests/unit/storage/formats/__init__.py                                         |     1 |    1 |     0 |     0% |
| tests/unit/storage/formats/test_base_io.py                                     |    60 |   53 |     7 |    12% |
| tests/unit/storage/formats/test_reader_isolation.py                            |     8 |    2 |     6 |    75% |
| tests/unit/storage/formats/test_utils.py                                       |     2 |    2 |     0 |     0% |
| tests/unit/storage/formats/test_writer_data_integrity.py                       |    26 |    6 |    20 |    77% |
| tests/unit/storage/formats/readers/__init__.py                                 |     1 |    1 |     0 |     0% |
| tests/unit/storage/formats/readers/test_json_reader.py                         |    38 |   18 |    20 |    53% |
| tests/unit/storage/formats/readers/test_parquet_reader.py                      |    68 |   43 |    25 |    37% |
| tests/unit/storage/formats/writers/__init__.py                                 |     1 |    1 |     0 |     0% |
| tests/unit/storage/formats/writers/test_json_writer.py                         |     7 |    6 |     1 |    14% |
| tests/unit/storage/formats/writers/test_parquet_writer.py                      |    74 |   11 |    63 |    85% |
| tests/unit/templates/__init__.py                                               |     1 |    1 |     0 |     0% |
| tests/unit/templates/conftest.py                                               |     2 |    0 |     2 |   100% |
| tests/unit/templates/test_base_metadata_extractor.py                           |    14 |   12 |     2 |    14% |
| tests/unit/templates/test_extraction_input_ae_payload.py                       |    12 |   11 |     1 |     8% |
| tests/unit/templates/test_extraction_input_filters.py                          |    41 |   25 |    16 |    39% |
| tests/unit/templates/test_incremental_sql_metadata_extractor.py                |    89 |   56 |    33 |    37% |
| tests/unit/templates/test_sql_app.py                                           |   117 |   51 |    66 |    56% |
| tests/unit/templates/test_sql_metadata_extractor.py                            |   131 |   99 |    32 |    24% |
| tests/unit/templates/test_sql_query_extractor.py                               |    15 |   12 |     3 |    20% |
| tests/unit/templates/contracts/test_incremental_sql_marker.py                  |    16 |   15 |     1 |     6% |
| tests/unit/testing/__init__.py                                                 |     1 |    1 |     0 |     0% |
| tests/unit/testing/test_fixtures.py                                            |    16 |   15 |     1 |     6% |
| tests/unit/testing/test_mocks.py                                               |    29 |   28 |     1 |     3% |
| tests/unit/testing/test_parity.py                                              |    35 |   34 |     1 |     3% |
| tests/unit/testing/e2e/__init__.py                                             |     1 |    1 |     0 |     0% |
| tests/unit/testing/e2e/test_base_e2e.py                                        |    27 |   23 |     4 |    15% |
| tests/unit/testing/e2e/test_client.py                                          |     9 |    3 |     6 |    67% |
| tests/unit/testing/e2e/test_harness_payload.py                                 |    19 |   16 |     3 |    16% |
| tests/unit/testing/e2e/test_logs.py                                            |    10 |    8 |     2 |    20% |
| tests/unit/testing/e2e/test_portforward.py                                     |     7 |    1 |     6 |    86% |
| tests/unit/testing/e2e/test_sql_app_e2e.py                                     |    35 |   34 |     1 |     3% |
| tests/unit/testing/e2e/test_substitutions.py                                   |    16 |   13 |     3 |    19% |
| tests/unit/testing/full_dag/__init__.py                                        |     1 |    1 |     0 |     0% |
| tests/unit/testing/full_dag/test_base.py                                       |    22 |    3 |    19 |    86% |
| tests/unit/testing/full_dag/test_client.py                                     |    14 |   10 |     4 |    29% |
| tests/unit/testing/full_dag/test_payload.py                                    |    11 |    3 |     8 |    73% |
| tests/unit/testing/full_dag/test_sql_app.py                                    |    12 |    4 |     8 |    67% |
| tests/unit/testing/integration/__init__.py                                     |     1 |    1 |     0 |     0% |
| tests/unit/testing/integration/test_client.py                                  |    25 |   14 |    11 |    44% |
| tests/unit/testing/integration/test_comparison.py                              |    29 |    0 |    29 |   100% |
| tests/unit/testing/integration/test_lazy_pandas.py                             |     5 |    0 |     5 |   100% |
| tests/unit/testing/sdr/__init__.py                                             |     1 |    1 |     0 |     0% |
| tests/unit/testing/sdr/test_base.py                                            |    13 |   11 |     2 |    15% |
| tests/unit/tools/__init__.py                                                   |     1 |    1 |     0 |     0% |
| tests/unit/tools/test_check_migration.py                                       |    65 |   44 |    21 |    32% |
| tests/unit/tools/test_codemod_roundtrip.py                                     |    32 |   31 |     1 |     3% |
| tests/unit/tools/test_extract_context.py                                       |    50 |   48 |     2 |     4% |
| tests/unit/tools/test_fingerprint.py                                           |    23 |   21 |     2 |     9% |
| tests/unit/tools/test_provision_credentials.py                                 |    11 |    0 |    11 |   100% |
| tests/unit/tools/test_rewrite_imports.py                                       |    41 |   31 |    10 |    24% |
| tests/unit/tools/test_run_codemods.py                                          |    16 |   15 |     1 |     6% |
| tests/unit/tools/test_codemods/__init__.py                                     |     1 |    1 |     0 |     0% |
| tests/unit/tools/test_codemods/conftest.py                                     |     2 |    0 |     2 |   100% |
| tests/unit/tools/test_codemods/test_remove_activities_cls.py                   |    15 |   11 |     4 |    27% |
| tests/unit/tools/test_codemods/test_remove_decorators.py                       |    17 |   16 |     1 |     6% |
| tests/unit/tools/test_codemods/test_rewrite_activity_calls.py                  |    16 |   11 |     5 |    31% |
| tests/unit/tools/test_codemods/test_rewrite_entry_point.py                     |    19 |   16 |     3 |    16% |
| tests/unit/tools/test_codemods/test_rewrite_handlers.py                        |    13 |   12 |     1 |     8% |
| tests/unit/tools/test_codemods/test_rewrite_returns.py                         |    12 |   10 |     2 |    17% |
| tests/unit/tools/test_codemods/test_rewrite_signatures.py                      |    19 |   18 |     1 |     5% |
| tests/unit/transformers/__init__.py                                            |     1 |    1 |     0 |     0% |
| tests/unit/transformers/atlas/__init__.py                                      |     1 |    1 |     0 |     0% |
| tests/unit/transformers/atlas/test_atlas_transformer.py                        |    28 |   15 |    13 |    46% |
| tests/unit/transformers/atlas/test_column.py                                   |    17 |    6 |    11 |    65% |
| tests/unit/transformers/atlas/test_database.py                                 |     8 |    6 |     2 |    25% |
| tests/unit/transformers/atlas/test_function.py                                 |    11 |    5 |     6 |    55% |
| tests/unit/transformers/atlas/test_procedure.py                                |     7 |    6 |     1 |    14% |
| tests/unit/transformers/atlas/test_schema.py                                   |     8 |    6 |     2 |    25% |
| tests/unit/transformers/atlas/test_sql_extra.py                                |    42 |   39 |     3 |     7% |
| tests/unit/transformers/atlas/test_table.py                                    |    15 |    6 |     9 |    60% |
| tests/unit/transformers/common/__init__.py                                     |     1 |    1 |     0 |     0% |
| tests/unit/transformers/common/test_last_sync.py                               |    13 |    6 |     7 |    54% |
| tests/unit/transformers/query/test_sql_transformer.py                          |    20 |    4 |    16 |    80% |
| tests/unit/transformers/query/test_sql_transformer_output_validation.py        |     5 |    2 |     3 |    60% |
| tools/migrate_v3/__init__.py                                                   |     1 |    0 |     1 |   100% |
| tools/migrate_v3/check_migration.py                                            |    11 |    6 |     5 |    45% |
| tools/migrate_v3/contract_mapping.py                                           |     3 |    1 |     2 |    67% |
| tools/migrate_v3/extract_context.py                                            |    21 |   16 |     5 |    24% |
| tools/migrate_v3/fingerprint.py                                                |     3 |    1 |     2 |    67% |
| tools/migrate_v3/import_mapping.py                                             |     2 |    0 |     2 |   100% |
| tools/migrate_v3/rewrite_imports.py                                            |    19 |    8 |    11 |    58% |
| tools/migrate_v3/run_codemods.py                                               |    14 |    5 |     9 |    64% |
| tools/migrate_v3/codemods/__init__.py                                          |    11 |    4 |     7 |    64% |
| tools/migrate_v3/codemods/remove_activities_cls.py                             |    12 |    7 |     5 |    42% |
| tools/migrate_v3/codemods/remove_decorators.py                                 |    11 |    8 |     3 |    27% |
| tools/migrate_v3/codemods/rewrite_activity_calls.py                            |     6 |    1 |     5 |    83% |
| tools/migrate_v3/codemods/rewrite_entry_point.py                               |    10 |    3 |     7 |    70% |
| tools/migrate_v3/codemods/rewrite_handlers.py                                  |     8 |    5 |     3 |    38% |
| tools/migrate_v3/codemods/rewrite_returns.py                                   |     7 |    5 |     2 |    29% |
| tools/migrate_v3/codemods/rewrite_signatures.py                                |     8 |    4 |     4 |    50% |
|--------------------------------------------------------------------------------|-------|------|-------|--------|
| TOTAL                                                                          | 10204 | 5319 |  4885 |  47.9% |
---------------- RESULT: PASSED (minimum: 30.0%, actual: 47.9%) ----------------

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📚 Capability manifest drift detected

docs/agents/sdk-capabilities.md is stale relative to the SDK source on this branch.

To resolve, pick one:

  • Comment /regen-manifest on this PR — a bot will regenerate and push the update.
  • Run uv run poe regen-capabilities locally and push the result.
  • Run the /capability-manifest Claude Code skill locally and push.

This check is informational, not blocking. Reviewers should ensure the manifest is
current before approval so the SDK-surface diff is visible in Files changed.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📦 Trivy Vulnerability Scan Results

Schema Version Created At Artifact Type
2 2026-06-02T19:48:03.490276489Z . repository

Report Summary

Could not generate summary table (data length mismatch: 9 vs 8).

Scan Result Details

requirements.txt
uv.lock

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📦 Trivy Secret Scan Results

Schema Version Created At Artifact Type
2 2026-06-02T19:48:11.220855164Z . repository

Report Summary

Could not generate summary table (data length mismatch: 9 vs 8).

Scan Result Details

requirements.txt
uv.lock

@atlan-ci
Copy link
Copy Markdown
Collaborator

atlan-ci commented Jun 2, 2026

☂️ Python Coverage

current status: ✅

Overall Coverage

Lines Covered Coverage Threshold Status
17725 16057 91% 0% 🟢

New Files

No new covered files...

Modified Files

No covered modified files...

updated for commit: 4f08995 by action🐍

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🛠 Full Test Coverage Report: https://k.atlan.dev/coverage/application-sdk/pr/1966

@rupeshatlan rupeshatlan marked this pull request as ready for review June 5, 2026 05:04
Copy link
Copy Markdown
Collaborator

@cmgrote cmgrote left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New Heracles endpoints should be exposed via pyatlan, and then the existing pyatlan bits (client(s), etc) used for the actual interactions — token exchange, underlying Heracles API calls, etc.

Also, at the moment the PR solely supports SqlApps, a minority of the overall app landscape. (Not only the template, but the mixin itself is based on ExtractionInput, which is specific to SqlApps.)

@cmgrote cmgrote marked this pull request as draft June 5, 2026 13:04
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.

4 participants