@@ -247,6 +247,7 @@ jobs:
247247 with :
248248 python-version : " 3.11"
249249 - name : Install dependencies
250+ id : install
250251 run : |
251252 bash scripts/ci_sync.sh test-integrations
252253 - name : Verify SDK/integrations joint installability
@@ -264,22 +265,27 @@ jobs:
264265 - name : Enforce changed-code coverage
265266 run : diff-cover .artifacts/coverage/coverage.xml --compare-branch=origin/main --fail-under=80
266267 - name : Run quality validators coverage gate
268+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
267269 run : |
268270 python -m pytest tests/unit/test_validators.py -v --tb=short --cov=agentflow_runtime.quality.validators --cov-report=term-missing --cov-fail-under=90
269271 - name : Run freshness monitor coverage gate
272+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
270273 run : |
271274 python -m pytest tests/unit/test_freshness_monitor.py -v --tb=short --cov=agentflow_runtime.quality.monitors.freshness_monitor --cov-report=term-missing --cov-fail-under=90
272275 - name : Run event producer coverage gate
276+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
273277 run : |
274278 python -m pytest tests/unit/test_event_producer.py -v --tb=short --cov=agentflow_runtime.ingestion.producers.event_producer --cov-report=term-missing --cov-fail-under=90
275279 - name : Run SQL guard coverage gate
280+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
276281 run : |
277282 # Security-critical NL->SQL guard: validate_nl_sql (SELECT-only, no DML,
278283 # tenant table allow-list, recursive-CTE shadow reject). test_sql_guard
279284 # plus test_sql_guard_mutation give full module coverage (100% local);
280285 # the 90% gate keeps a 10pp regression cushion.
281286 python -m pytest tests/unit/test_sql_guard.py tests/unit/test_sql_guard_mutation.py -v --tb=short --cov=agentflow_runtime.serving.semantic_layer.sql_guard --cov-report=term-missing --cov-fail-under=90
282287 - name : Run rate limiter coverage gate
288+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
283289 run : |
284290 # Security-critical sliding-window rate limiter (Redis + in-memory
285291 # fail-closed fallback); local module coverage is 98% (only the optional
@@ -297,6 +303,7 @@ jobs:
297303 -k "not auth_middleware" -v --tb=short -p no:schemathesis -p no:cov
298304 python -m coverage report --include="*/serving/api/rate_limiter.py" --show-missing --fail-under=90
299305 - name : Run auth manager coverage gate
306+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
300307 run : |
301308 # Security-critical auth manager (key match/verify, tenant isolation,
302309 # rate-limit/failed-auth windows, rotation grace) and a mutmut target;
@@ -331,6 +338,7 @@ jobs:
331338 -p no:schemathesis
332339 python -m coverage report --include="*/serving/api/auth/manager.py" --show-missing --fail-under=90
333340 - name : Run key rotation coverage gate
341+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
334342 run : |
335343 # Security-critical key-rotation lifecycle (create/rotate/revoke,
336344 # grace-period scheduling, rotation status) and a mutmut target. Like
@@ -353,6 +361,7 @@ jobs:
353361 -p no:schemathesis
354362 python -m coverage report --include="*/serving/api/auth/key_rotation.py" --show-missing --fail-under=90
355363 - name : Run outbox coverage gate
364+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
356365 run : |
357366 # Security/reliability-critical at-least-once outbox dispatch loop
358367 # (delivery, retry/backoff, poison-to-failed, mark-sent transactions)
@@ -362,6 +371,7 @@ jobs:
362371 python -m coverage run -m pytest tests/unit/test_outbox_processor.py tests/unit/test_outbox_connection_guard.py -p no:schemathesis
363372 python -m coverage report --include="*/processing/outbox.py" --show-missing --fail-under=90
364373 - name : Run query package coverage gate
374+ if : ${{ !cancelled() && steps.install.outcome == 'success' }}
365375 run : |
366376 # The NL->SQL orchestration surface (engine, entity/metric/NL query
367377 # mixins, SQL builder) and a mutmut target set; the old single-file
0 commit comments