Commit Graph

68 Commits

Author SHA1 Message Date
clever-agent fd68b85c7b Revert "Build: Removed unnessecary status-check target as well"
CI / push-validation (push) Successful in 16s
CI / helm (push) Successful in 35s
CI / lint (push) Successful in 3m21s
CI / build (push) Successful in 3m21s
CI / quality (push) Successful in 3m41s
CI / integration_tests (push) Successful in 3m52s
CI / typecheck (push) Successful in 3m59s
CI / security (push) Successful in 4m5s
CI / e2e_tests (push) Successful in 6m25s
CI / unit_tests (push) Successful in 8m12s
CI / docker (push) Successful in 21s
CI / coverage (push) Successful in 13m51s
CI / status-check (push) Successful in 1s
This reverts commit 9998b4f9ad.
2026-04-13 19:15:55 -04:00
clever-agent 9998b4f9ad Build: Removed unnessecary status-check target as well
CI / lint (push) Successful in 46s
CI / quality (push) Successful in 43s
CI / typecheck (push) Successful in 1m9s
CI / security (push) Successful in 1m5s
CI / push-validation (push) Successful in 20s
CI / helm (push) Successful in 22s
CI / unit_tests (push) Failing after 7m42s
CI / docker (push) Has been skipped
CI / integration_tests (push) Failing after 9m34s
CI / build (push) Failing after 10m58s
CI / e2e_tests (push) Failing after 10m59s
CI / docker (pull_request) Has been skipped
CI / coverage (push) Successful in 22m29s
CI / coverage (pull_request) Successful in 14m42s
CI / security (pull_request) Successful in 10m42s
CI / integration_tests (pull_request) Failing after 9m42s
CI / unit_tests (pull_request) Failing after 10m35s
CI / e2e_tests (pull_request) Successful in 11m9s
CI / helm (pull_request) Successful in 46s
CI / push-validation (pull_request) Successful in 1m4s
CI / quality (pull_request) Successful in 8m59s
CI / build (pull_request) Successful in 7m35s
CI / lint (pull_request) Successful in 9m0s
CI / typecheck (pull_request) Successful in 9m39s
2026-04-13 17:55:41 -04:00
clever-agent 5438540803 build: Removed benchmark stage from CI, moving this to its own workflow
CI / lint (push) Successful in 22s
CI / typecheck (push) Successful in 49s
CI / quality (push) Successful in 37s
CI / security (push) Successful in 57s
CI / build (push) Successful in 26s
CI / push-validation (push) Successful in 16s
CI / helm (push) Successful in 39s
CI / e2e_tests (push) Successful in 3m7s
CI / integration_tests (push) Successful in 6m26s
CI / unit_tests (push) Successful in 7m46s
CI / docker (push) Successful in 20s
CI / coverage (push) Successful in 14m50s
CI / status-check (push) Successful in 1s
CI / typecheck (pull_request) Failing after 55s
CI / quality (pull_request) Successful in 48s
CI / security (pull_request) Successful in 53s
CI / build (pull_request) Successful in 28s
CI / helm (pull_request) Successful in 24s
CI / push-validation (pull_request) Successful in 27s
CI / lint (pull_request) Failing after 11m48s
CI / unit_tests (pull_request) Failing after 12m26s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / e2e_tests (pull_request) Failing after 17m45s
CI / integration_tests (pull_request) Failing after 19m36s
CI / status-check (pull_request) Has been cancelled
2026-04-13 17:16:41 -04:00
freemo 8ea00f5185 fix: restore CI quality tests to passing state (#4175)
CI / unit_tests (push) Has been cancelled
CI / benchmark-publish (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / typecheck (push) Has been cancelled
CI / security (push) Has been cancelled
CI / quality (push) Has been cancelled
CI / integration_tests (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / coverage (push) Has been cancelled
CI / benchmark-regression (push) Has been cancelled
CI / build (push) Has been cancelled
CI / push-validation (push) Has been cancelled
CI / status-check (push) Has been cancelled
CI / docker (push) Has been cancelled
CI / helm (push) Has been cancelled
Co-authored-by: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Co-committed-by: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
2026-04-08 11:02:14 +00:00
freemo 194c830f98 fix(ci): resolve repository push failure in CI pipeline
ci.yml / fix(ci): resolve repository push failure in CI pipeline (push) Failing after 0s
Reviewed and APPROVED. Closes CI push failure issue.
2026-04-05 21:25:11 +00:00
freemo 0295a8104c perf(ci): optimize e2e_tests push job to reduce execution time
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / security (push) Waiting to run
CI / quality (push) Waiting to run
CI / unit_tests (push) Waiting to run
CI / integration_tests (push) Waiting to run
CI / e2e_tests (push) Waiting to run
CI / coverage (push) Blocked by required conditions
CI / benchmark-regression (push) Blocked by required conditions
CI / benchmark-publish (push) Waiting to run
CI / build (push) Waiting to run
CI / docker (push) Blocked by required conditions
CI / helm (push) Waiting to run
CI / status-check (push) Blocked by required conditions
Reviewed and APPROVED. Closes #1860.
2026-04-05 21:14:07 +00:00
freemo f97847c24a fix(ci): update nightly workflow coverage minimum to 97% per project requirements
CI / lint (pull_request) Successful in 22s
CI / typecheck (pull_request) Successful in 52s
CI / quality (pull_request) Successful in 36s
CI / build (pull_request) Successful in 22s
CI / security (pull_request) Successful in 1m3s
CI / helm (pull_request) Successful in 23s
CI / unit_tests (pull_request) Successful in 6m42s
CI / coverage (pull_request) Successful in 10m51s
CI / docker (pull_request) Successful in 1m22s
CI / e2e_tests (pull_request) Successful in 17m16s
CI / integration_tests (pull_request) Successful in 23m11s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-publish (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 57m9s
Update the nightly workflow quality gates script invocation to use
--coverage-min 97 instead of --coverage-min 85, aligning it with the
project's required COVERAGE_THRESHOLD = 97 defined in noxfile.py.

Also update the consolidated_config.feature BDD scenario to assert
the nightly workflow uses at least 97% (not 85%) to properly enforce
the coverage threshold requirement.

ISSUES CLOSED: #2769
2026-04-05 07:05:02 +00:00
freemo 94d133c5bc perf(ci): optimize e2e_tests push job to reduce execution time
CI / lint (pull_request) Successful in 20s
CI / typecheck (pull_request) Successful in 48s
CI / security (pull_request) Successful in 1m3s
CI / helm (pull_request) Successful in 23s
CI / build (pull_request) Successful in 28s
CI / quality (pull_request) Successful in 3m42s
CI / unit_tests (pull_request) Successful in 6m50s
CI / e2e_tests (pull_request) Successful in 7m9s
CI / docker (pull_request) Successful in 1m33s
CI / integration_tests (pull_request) Successful in 22m21s
CI / coverage (pull_request) Successful in 10m15s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-publish (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 56m2s
- Replaced the e2e_tests nox session runner from sequential robot to the parallel pabot runner to shrink CI push times.
- Added _split_pabot_args and _pabot_parallel_args support to the e2e_tests session, mirroring the pattern used by integration_tests for consistent parallel execution control.
- CI workflow: added TEST_PROCESSES: "4" environment variable to the e2e_tests job to run four parallel workers. Rationale: E2E suites are IO-bound (LLM API calls) rather than CPU-bound, so increasing parallelism reduces wall-clock time without CPU contention.
- Updated the e2e_tests docstring to document parallelism control via the TEST_PROCESSES environment variable or the --processes positional argument.
- Pre-compiled bytecode comment updated to explain thundering-herd prevention for parallel workers.
- Template DB comment updated to explain the criticality of proper initialization for parallel pabot execution.

Key design decisions:
- Used pabot (robotframework-pabot>=4.0.0), a project-provided dependency, instead of introducing new tooling.
- Set TEST_PROCESSES=4 in CI (instead of the default min(cpu,2)) because E2E tasks are IO-bound and benefit from higher concurrency without CPU contention.
- Suite-level isolation via E2E Suite Setup (separate CLEVERAGENTS_HOME per suite) ensures workers do not share database state, enabling safe parallelism.
- Followed the exact same pattern as integration_tests for consistency and predictability.

Modules/components affected:
- e2e_tests nox session (parallelization logic and arg parsing)
- CI workflow (TEST_PROCESSES environment variable)
- E2E session docstring and related comments (documentation of parallelism and initialization)
- Inline comments for pre-compiled bytecode and template database initialization to reflect parallel execution considerations

ISSUES CLOSED: #1860
2026-04-05 04:13:34 +00:00
freemo 72e0db2592 chore(ci): capture nox output as CI artifacts and teach agents to read them
CI / lint (push) Has been cancelled
CI / security (push) Has been cancelled
CI / typecheck (push) Has been cancelled
CI / quality (push) Has been cancelled
CI / benchmark-publish (push) Has been cancelled
CI / status-check (push) Has been cancelled
CI / unit_tests (push) Has been cancelled
CI / integration_tests (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / coverage (push) Has been cancelled
CI / benchmark-regression (push) Has been cancelled
CI / build (push) Has been cancelled
CI / docker (push) Has been cancelled
CI / helm (push) Has been cancelled
All 8 nox-running CI jobs in .forgejo/workflows/ci.yml now capture
stdout+stderr to build/nox-<job>-output.log via `2>&1 | tee` and upload
the log as a named Forgejo artifact (if: always(), retention-days: 30).
Artifact names follow the pattern ci-logs-<job>:
  ci-logs-lint, ci-logs-typecheck, ci-logs-security, ci-logs-quality,
  ci-logs-unit-tests, ci-logs-integration-tests, ci-logs-e2e-tests,
  ci-logs-coverage

Seven agent definitions updated with a CI Log Artifacts section:
  ca-pr-checker.md: artifact table + curl download instructions; Step 2
    now downloads the relevant artifact before dispatching fix subagents.
  ca-lint-fixer.md, ca-typecheck-fixer.md, ca-unit-test-runner.md,
  ca-integration-test-runner.md, ca-coverage-checker.md,
  ca-pr-self-reviewer.md: each receives a section explaining which
    artifact corresponds to its domain and how to use it.

Design notes:
- tee (not redirect) preserves output in CI job logs AND captures to file
- if: always() ensures artifacts are available even when the job fails
- Multi-session jobs (lint, security) use tee -a to append to one file
- Existing coverage-reports artifact preserved alongside ci-logs-coverage

ISSUES CLOSED: #2750
2026-04-04 19:58:49 +00:00
freemo c38be2eed8 fix(ci): address review feedback on nightly-quality workflow
CI / lint (push) Failing after 41s
CI / security (push) Failing after 42s
CI / typecheck (push) Failing after 52s
CI / quality (push) Successful in 45s
CI / coverage (push) Has been skipped
CI / benchmark-regression (push) Has been skipped
CI / build (push) Successful in 34s
CI / helm (push) Successful in 23s
CI / unit_tests (push) Failing after 2m26s
CI / docker (push) Has been skipped
CI / integration_tests (push) Has been cancelled
CI / benchmark-publish (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / status-check (push) Has been cancelled
- Add missing 'nox -s format -- --check' step (parity with ci.yml)
- Add NOX_DEFAULT_VENV_BACKEND: uv to global env and each nox step
- Fix quality gates script invocation (was using invalid nox session '3.13')
- Fix report artifact paths to match actual nox session output locations
  (build/coverage.json and build/bandit-report.json instead of build/reports/)
- Add mkdir for build/reports before writing quality-trend.json

ISSUES CLOSED: #1537
2026-04-03 03:37:10 +00:00
freemo 36ac24f2dd chore(ci): refactor nightly-quality workflow to use nox sessions
- Replaced manual uv pip install with nox invocations for all quality checks
- Mapped workflow steps to nox sessions:
  - Lint: ruff format + ruff check → nox -s lint
  - Type checking: pyright → nox -s typecheck
  - Security: bandit + semgrep → nox -s security_scan
  - Dead code: vulture → nox -s dead_code
  - Complexity: radon → nox -s complexity
  - Tests + coverage: behave → nox -s unit_tests + coverage_report
- Removed explicit dependency installation steps (nox handles this)
- Removed RUFF_VERSION env var (nox uses pinned versions from pyproject.toml)
- Workflow now consistent with ci.yml approach

Fixes #1537
2026-04-03 03:37:10 +00:00
freemo 6228129919 Merge pull request 'ci(pipeline): parallelize lint, typecheck, security, and quality jobs' (#1633) from task/ci-parallelize-static-analysis into master
CI / benchmark-publish (push) Has been cancelled
CI / typecheck (push) Has been cancelled
CI / quality (push) Has been cancelled
CI / integration_tests (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / coverage (push) Has been cancelled
CI / benchmark-regression (push) Has been cancelled
CI / docker (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / security (push) Has been cancelled
CI / status-check (push) Has been cancelled
CI / unit_tests (push) Has been cancelled
CI / build (push) Has been cancelled
CI / helm (push) Has been cancelled
2026-04-03 01:08:43 +00:00
freemo 33f1978bd0 fix(ci): resolve repository push failure in CI pipeline
ci.yml / fix(ci): resolve repository push failure in CI pipeline (push) Failing after 0s
ci.yml / fix(ci): resolve repository push failure in CI pipeline (pull_request) Failing after 0s
Root cause: actions/checkout@v4 was not configured with explicit write
credentials (token + persist-credentials), and no git user identity
(user.name/user.email) was set. Both are required for any git push
operation in Forgejo Actions.

Changes:
- release.yml create-release job: add token: secrets.FORGEJO_TOKEN and
  fetch-depth: 0 to checkout; add 'Configure git identity for push
  operations' step using HTTPS credential store; add 'Smoke-test push
  access' step that validates write permission via Forgejo API before
  any push attempt
- ci.yml: add push-validation job that validates push credentials on
  every CI run using FORGEJO_TOKEN, including credential helper
  verification and API-based write permission check; add push-validation
  to status-check needs and result reporting
- docs/development/ci-cd.md: add FORGEJO_TOKEN, FORGEJO_URL, and
  CONTAINER_REGISTRY* secrets to the secrets table; add 'Repository
  Push Authentication' section documenting root cause, fix pattern,
  smoke-test step, setup instructions, and security notes; add
  push-validation to CI job dependency graph and quality gates table

Design decisions:
- HTTPS token authentication (not SSH deploy keys) -- simpler to manage
- ~/.git-credentials with chmod 600 for ephemeral, secure storage
- Smoke-test validates write permission via API before push attempts
- push-validation job is independent (no needs) -- runs in parallel
- No hardcoded credentials -- all secrets via Forgejo Secrets

ISSUES CLOSED: #1541
2026-04-02 23:54:52 +00:00
freemo 99aa459bad chore(ci): consolidate uv cache key across all workflow jobs
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Failing after 24s
CI / helm (pull_request) Successful in 32s
CI / typecheck (pull_request) Failing after 50s
CI / coverage (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Has been skipped
CI / security (pull_request) Failing after 53s
CI / unit_tests (pull_request) Failing after 1m51s
CI / docker (pull_request) Has been skipped
CI / build (pull_request) Successful in 3m19s
CI / quality (pull_request) Successful in 3m43s
CI / e2e_tests (pull_request) Failing after 15m3s
CI / integration_tests (pull_request) Failing after 20m57s
CI / status-check (pull_request) Failing after 1s
Replace per-job cache key prefixes (uv-lint-, uv-typecheck-, uv-security-,
uv-quality-, uv-tests-, uv-coverage-) with a single shared key
uv-${{ hashFiles('pyproject.toml') }} across all jobs in ci.yml.

Also add a missing uv cache step to the build job and add uv caching
to nightly-quality.yml, which previously had no cache at all.

All jobs now share the same cache entry when pyproject.toml is unchanged,
eliminating redundant package downloads and reducing CI wall-clock time.

ISSUES CLOSED: #1535
2026-04-02 23:20:11 +00:00
freemo 6f7ced1a19 ci(pipeline): parallelize lint, typecheck, security, and quality jobs
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Failing after 19s
CI / helm (pull_request) Successful in 23s
CI / build (pull_request) Successful in 30s
CI / security (pull_request) Failing after 48s
CI / typecheck (pull_request) Failing after 50s
CI / unit_tests (pull_request) Failing after 1m48s
CI / quality (pull_request) Successful in 3m44s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Has been skipped
CI / e2e_tests (pull_request) Failing after 13m56s
CI / integration_tests (pull_request) Failing after 20m50s
CI / status-check (pull_request) Failing after 1s
The lint, typecheck, security, and quality static analysis jobs already
run in parallel (no needs dependencies between them). However, downstream
jobs only gated on a subset of these jobs, allowing the pipeline to
proceed even when some static analysis checks failed.

Updated needs dependencies for downstream jobs:
- coverage: [lint, typecheck] → [lint, typecheck, security, quality]
- benchmark-regression: [lint, typecheck] → [lint, typecheck, security, quality]
- docker: [lint, typecheck, unit_tests, security] → [lint, typecheck, security, quality, unit_tests]

All four static analysis jobs (lint, typecheck, security, quality) now
run in parallel and all downstream jobs correctly gate on the full set,
ensuring no job proceeds unless all static analysis checks pass.

ISSUES CLOSED: #1536
2026-04-02 23:17:49 +00:00
freemo 4e3b4180fc feat(ci): add Helm chart lint and template validation to CI
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 14s
CI / helm (pull_request) Successful in 45s
CI / lint (pull_request) Successful in 3m18s
CI / quality (pull_request) Successful in 3m43s
CI / security (pull_request) Successful in 4m9s
CI / typecheck (pull_request) Successful in 4m25s
CI / unit_tests (pull_request) Successful in 9m27s
CI / docker (pull_request) Successful in 1m42s
CI / e2e_tests (pull_request) Failing after 15m11s
CI / coverage (pull_request) Successful in 13m27s
CI / integration_tests (pull_request) Successful in 25m8s
CI / status-check (pull_request) Failing after 1s
CI / benchmark-regression (pull_request) Successful in 54m54s
Add kubeconform manifest validation to the existing helm CI job.
The helm job already had helm lint and helm template steps (added in
#1085). This commit completes the optional acceptance criterion from
#1089 by adding kubeconform v0.7.0 to validate rendered manifests
against the Kubernetes 1.29.0 schema in strict mode.

Changes:
- Install kubeconform v0.7.0 in the helm CI job
- Add 'Validate rendered manifests with kubeconform' step after
  helm template smoke render (strict mode, ignore-missing-schemas,
  kubernetes-version 1.29.0)
- Add 5 BDD scenarios to ci_workflow_validation.feature covering:
  - helm job existence
  - helm lint step
  - helm template step
  - kubeconform validation step
  - status-check dependency on helm job

ISSUES CLOSED: #1089
2026-04-02 07:47:09 +00:00
brent.edwards 10df485401 test: add TDD bug-capture test for #1039 — missing validation YAML (#1132)
CI / build (push) Successful in 25s
CI / helm (push) Successful in 33s
CI / lint (push) Successful in 3m19s
CI / typecheck (push) Successful in 4m14s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 4m29s
CI / quality (push) Successful in 4m12s
CI / integration_tests (push) Successful in 7m29s
CI / unit_tests (push) Successful in 7m51s
CI / docker (push) Successful in 1m30s
CI / e2e_tests (push) Successful in 12m50s
CI / coverage (push) Successful in 12m19s
CI / status-check (push) Successful in 1s
CI / benchmark-publish (push) Has been cancelled
## Summary

This PR adds a Behave TDD bug-capture test that proves bug #1039 exists: the specification references `validations/unit-tests.yaml` as an example validation configuration file (Workflow Examples, Example 1, Step 1) but the file does not exist in the project's `examples/validations/` directory.

## Changes

- **New feature file:** `features/tdd_missing_validation_unit_tests_yaml.feature` — four scenarios tagged `@tdd_expected_fail @tdd_bug @tdd_bug_1039` that verify:
  1. The file `examples/validations/unit-tests.yaml` exists
  2. The YAML config contains `name: local/unit-tests`
  3. The validation mode is `required`
  4. The description field is non-empty
- **New step file:** `features/steps/tdd_missing_validation_unit_tests_yaml_steps.py` — step implementations that locate the project root and check file existence/content

All four scenarios currently fail with `AssertionError` (the file doesn't exist, proving the bug exists). The `@tdd_expected_fail` tag inverts the results so the test suite passes CI.

## Robot Integration Test

N/A — this bug is purely about a missing example file referenced by the specification. There is no integration-level behavior to test.

## Quality Gate Results

| Gate | Result |
|------|--------|
| `nox -s lint` | passed |
| `nox -s typecheck` | passed (0 errors) |
| `nox -s unit_tests` | 462 features, 12234 scenarios, 0 failures |
| `nox -s integration_tests` | 1672 tests, 0 failures |
| `nox -s e2e_tests` | 37 tests, 0 failures |
| `nox -s coverage_report` | 98% (>= 97% threshold) |

Closes #1103

Reviewed-on: #1132
Reviewed-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com>
Co-authored-by: Brent E. Edwards <brent.edwards@cleverthis.com>
Co-committed-by: Brent E. Edwards <brent.edwards@cleverthis.com>
2026-03-28 04:15:49 +00:00
brent.edwards b51df2ee0f feat(server): add Kubernetes Helm chart for server deployment (#1085)
CI / docker (push) Blocked by required conditions
CI / status-check (push) Blocked by required conditions
CI / build (push) Successful in 20s
CI / helm (push) Successful in 23s
CI / lint (push) Successful in 3m19s
CI / typecheck (push) Successful in 3m57s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 4m5s
CI / integration_tests (push) Successful in 7m25s
CI / unit_tests (push) Failing after 13m18s
CI / quality (push) Failing after 13m19s
CI / e2e_tests (push) Failing after 18m16s
CI / coverage (push) Failing after 19m20s
CI / benchmark-publish (push) Failing after 28m16s
## Summary

This PR adds Kubernetes Helm deployment support for the CleverAgents server.

Closes #928

### What this PR includes

- Helm chart under `k8s/` with Deployment, Service, optional Ingress, ConfigMap,
  ServiceAccount, Secrets, NOTES, and optional Redis subchart configuration.
- Multi-stage `Dockerfile.server` for server runtime deployment.
- Deployment-focused docs in `k8s/README.md`.
- Behave + Robot + benchmark coverage for chart/deployment wiring.

### Review fixes applied (cycle 11 — hurui200320 review #2687)

**Critical fix:**

1. **CI SHA256 checksum verification fixed** — All 3 Helm install blocks (`unit_tests`, `integration_tests`, `helm` jobs) now save the tarball using its original filename (`helm-v3.16.4-linux-amd64.tar.gz`) instead of `helm.tgz`, so the `.sha256sum` file can correctly locate and verify it. This was causing all 3 CI Helm jobs to fail with "No such file or directory".

**Major fixes (test coverage gaps):**

2. **405 Allow header now tested** — The existing "POST to known path returns method not allowed" scenario now asserts that the `Allow: GET` header is present. Added a second 405 scenario testing `POST /live` for broader `_KNOWN_PATHS` coverage (review item #11).
3. **Security-hardening headers now tested** — New scenario "HTTP responses include security-hardening headers" verifies `content-length`, `x-content-type-options: nosniff`, and `cache-control: no-store` headers are present on HTTP responses.
4. **Lifespan warning logging now tested** — New scenario "Unrecognised lifespan message type logs warning and continues" queues `lifespan.startup` → `lifespan.bogus` → `lifespan.shutdown` and verifies: (a) the app completes the lifespan cycle cleanly, (b) a warning is logged mentioning the unrecognised type.

### Review fixes applied (cycle 10)

**Critical/Major fixes (from hurui200320's prior REQUEST_CHANGES):**

1. **Rebased branch onto master** — Removed merge commit per CONTRIBUTING.md rebase-only policy. Clean linear history restored.
2. **Fixed commit message body** — Replaced literal `\n` sequences with actual newlines. `ISSUES CLOSED: #928` footer is now on its own line after a blank separator.
3. **Moved uvicorn import to module top level** — `from uvicorn import run as uvicorn_run` is now at the top of `src/cleveragents/cli/commands/server.py` per Import Guidelines. Updated test mock target from `uvicorn.run` to `cleveragents.cli.commands.server.uvicorn_run`.
4. **Added SHA256 checksum verification** — All three Helm CLI install blocks in `.forgejo/workflows/ci.yml` now download and verify `helm.sha256sum` before extracting the binary.

**Minor fixes:**

5. **Added `Dockerfile.server` build to CI** — New "Build Docker image (Server)" step in the `docker` job validates the server Dockerfile.
6. **ASGI 405 Method Not Allowed** — Known paths (`/`, `/live`, `/ready`, `/health`) now return 405 with `Allow: GET` header for non-GET methods, per RFC 9110 §15.5.6. Added `_KNOWN_PATHS` frozenset.
7. **WebSocket close protocol fix** — App now calls `await receive()` to consume the `websocket.connect` event before closing. Changed close code from 1000 (Normal Closure) to 1008 (Policy Violation).
8. **Lifespan handler logging** — Unrecognised lifespan message types are now logged as warnings instead of silently consumed.
9. **Security-hardening headers** — `_send_response` now includes `content-length`, `x-content-type-options: nosniff`, and `cache-control: no-store` on all HTTP responses.
10. **`.dockerignore` credential patterns** — Added `*.pem`, `*.key`, `*.p12`, `*.pfx`, `credentials*.json`.
11. **`--log-level` validation** — Constrained to `click.Choice(["critical", "error", "warning", "info", "debug", "trace"])` for clean CLI validation errors.
12. **Reverted unrelated semgrep pre-commit change** — `pass_filenames` and `entry` restored to original values per atomic commit hygiene.
13. **Removed unused `ReceiveCallable` type alias** and `Callable`/`Awaitable` imports from `asgi_app_steps.py`.
14. **Fixed redundant `shutil.which("helm")` check** — `_skip_if_helm_missing` now returns `bool` to eliminate the duplicate check in `_render_chart`.
15. **Improved test deque error handling** — Lifespan test receive mock now raises descriptive `AssertionError` instead of opaque `IndexError`.
16. **Scope type dispatch** — Changed `if/if/if` to `if/elif/elif` for mutually exclusive ASGI scope types.
17. **Dockerfile.server base image** — Standardised to `python:3.13-slim` (floating minor) consistent with CLI Dockerfile.
18. **Dockerfile layer caching** — Split `uv pip install build` and `python -m build` into separate `RUN` instructions.
19. **Removed extraneous double blank line** in Dockerfile.server.

### Deferred items (acknowledged, not in scope)

- PodDisruptionBudget, HorizontalPodAutoscaler, NetworkPolicy — Follow-up for production hardening.
- `appVersion: "1.0.0"` placeholder — Needs tracking issue for release versioning alignment.
- Readiness probe with downstream dependency checks — Documented limitation.
- Cross-system test for probe paths matching ASGI routes — Test enhancement.
- Improved benchmarks (helm template timing vs PyYAML parsing) — Benchmark quality improvement.
- CI DRY violation (Helm install 3×) — Code quality improvement, consider composite action.
- File length limits exceeded (`k8s_helm_chart_steps.py` 551 lines, `helper_k8s_helm_chart.py` 678 lines) — Non-blocking, can be split in follow-up.
- `runAsGroup: 1000` in pod security context — Defense-in-depth improvement.
- HEAD method support on known paths — RFC compliance, does not affect K8s probes.
- `click.Choice` log-level validation via CLI runner test — Test gap.

### Scope note: status-check CI gate

The `status-check` job now includes `integration_tests`, `e2e_tests`, and `helm` in its `needs` list. The `helm` job is new in this PR. The `integration_tests` and `e2e_tests` additions fix previously-missing gate checks — included here since this PR modifies both of those jobs to install Helm.

### Quality gates

- `nox -e lint` 
- `nox -e typecheck` 
- `nox -e unit_tests`  (12,321 scenarios passed, 4 skipped)
- `nox -e integration_tests` — 3 pre-existing failures in unrelated areas (plan correction, resource types)
- `nox -e e2e_tests` — pre-existing failures (LLM API keys not available in local env)
- `nox -e coverage_report`  (**97.7%**)

Reviewed-on: #1085
Reviewed-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com>
Co-authored-by: Brent E. Edwards <brent.edwards@cleverthis.com>
Co-committed-by: Brent E. Edwards <brent.edwards@cleverthis.com>
2026-03-27 23:53:22 +00:00
brent.edwards 00897be24a feat(ci): CI/CD pipeline definitions (#983)
CI / build (push) Successful in 21s
CI / lint (push) Successful in 3m30s
CI / typecheck (push) Successful in 3m55s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 3m57s
CI / quality (push) Successful in 3m59s
CI / integration_tests (push) Successful in 5m52s
CI / e2e_tests (push) Successful in 8m15s
CI / coverage (push) Failing after 13m33s
CI / unit_tests (push) Failing after 17m29s
CI / benchmark-publish (push) Successful in 19m11s
CI / docker (push) Has been skipped
CI / status-check (push) Failing after 3s
## Summary

Complete CI/CD pipeline definitions: release workflow, caching, status-check consolidation, and documentation.

### Changes

**New: Release pipeline** (`.forgejo/workflows/release.yml`):
- Triggered on `v*` tags
- 3 jobs: `build-wheel` → `build-docker` → `create-release`
- Builds wheel via `nox -s build`, Docker image via multi-stage Dockerfile
- Creates Forgejo release via API with wheel artifact attached
- Configurable registry push via `REGISTRY_*` secrets

**Updated: CI pipeline** (`.forgejo/workflows/ci.yml`):
- Added `actions/cache@v3` for `~/.cache/uv` on all 8 primary jobs (keyed on `pyproject.toml` hash)
- Added `status-check` consolidation job depending on all required checks — single gate for branch protection

**Updated: CONTRIBUTING.md**:
- New CI/CD section: pipeline overview, job table, required merge checks, release process, secrets documentation

**Tests**:
- 13 new Behave scenarios validating workflow YAML structure, tag triggers, job definitions, dependencies
- 9 new Robot tests validating file existence, content, nox session references

### Quality Gates

| Session | Result |
|---|---|
| `nox -s lint` | PASS |
| `nox -s typecheck` | PASS (0 errors) |
| `nox -s unit_tests` | PASS (10,819 scenarios) |
| `nox -s coverage_report` | 97.9% (>= 97%) |

Closes #858

Reviewed-on: #983
Co-authored-by: Brent E. Edwards <brent.edwards@cleverthis.com>
Co-committed-by: Brent E. Edwards <brent.edwards@cleverthis.com>
2026-03-21 00:29:49 +00:00
CoreRasurae d206b0c5e6 ci: Use docker-benchmark runner for benchmark-publish job
CI / build (pull_request) Successful in 21s
CI / lint (pull_request) Successful in 25s
CI / typecheck (pull_request) Successful in 43s
CI / quality (pull_request) Successful in 53s
CI / security (pull_request) Successful in 1m0s
CI / benchmark-publish (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 2m58s
CI / unit_tests (pull_request) Successful in 3m20s
CI / docker (pull_request) Successful in 1m2s
CI / e2e_tests (pull_request) Successful in 5m23s
CI / coverage (pull_request) Successful in 8m3s
CI / benchmark-regression (pull_request) Successful in 36m31s
CI / lint (push) Successful in 14s
CI / quality (push) Successful in 26s
CI / build (push) Successful in 17s
CI / typecheck (push) Successful in 38s
CI / security (push) Successful in 38s
CI / benchmark-regression (push) Has been skipped
CI / integration_tests (push) Successful in 2m53s
CI / unit_tests (push) Successful in 3m0s
CI / docker (push) Successful in 1m3s
CI / e2e_tests (push) Successful in 5m32s
CI / benchmark-publish (push) Failing after 29m1s
CI / coverage (push) Successful in 6m8s
Job takes more time to run,  needing a dedicated runner

ISSUES CLOSED: #1083
2026-03-20 19:33:18 +00:00
CoreRasurae 2809b72b48 ci: Use docker-benchmark runner for benchmark-regression jon
CI / lint (pull_request) Successful in 33s
CI / typecheck (pull_request) Successful in 1m2s
CI / security (pull_request) Successful in 45s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 29s
CI / build (pull_request) Successful in 33s
CI / unit_tests (pull_request) Successful in 4m0s
CI / integration_tests (pull_request) Successful in 4m15s
CI / e2e_tests (pull_request) Successful in 5m41s
CI / docker (pull_request) Successful in 1m8s
CI / coverage (pull_request) Successful in 8m27s
CI / benchmark-regression (pull_request) Successful in 35m57s
Job takes longes and uses a dedicated runner

ISSUES CLOSED: #1081
2026-03-20 17:23:16 +00:00
freemo ce722ed0ea ops(ci): configure LLM API keys in Forgejo CI for integration test execution
CI / lint (pull_request) Successful in 20s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 36s
CI / typecheck (pull_request) Successful in 40s
CI / e2e_tests (pull_request) Successful in 36s
CI / build (pull_request) Successful in 36s
CI / security (pull_request) Successful in 1m3s
CI / unit_tests (pull_request) Successful in 3m14s
CI / docker (pull_request) Successful in 9s
CI / integration_tests (pull_request) Successful in 3m49s
CI / coverage (pull_request) Successful in 5m54s
CI / lint (push) Successful in 32s
CI / quality (push) Successful in 33s
CI / typecheck (push) Successful in 45s
CI / benchmark-regression (push) Has been skipped
CI / build (push) Successful in 23s
CI / e2e_tests (push) Successful in 1m0s
CI / security (push) Successful in 1m12s
CI / unit_tests (push) Successful in 3m23s
CI / integration_tests (push) Successful in 3m41s
CI / docker (push) Successful in 1m6s
CI / coverage (push) Successful in 6m15s
CI / benchmark-publish (push) Successful in 20m11s
CI / benchmark-regression (pull_request) Successful in 38m40s
Updated CI pipeline to inject ANTHROPIC_API_KEY and OPENAI_API_KEY
secrets as environment variables during Robot Framework integration
test execution. Added CI setup documentation.

ISSUES CLOSED: #701
2026-03-14 22:34:18 +00:00
freemo d4a1a0d87b test(e2e): set up E2E test infrastructure — nox session, CI job, Robot Framework @E2E tag
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 18s
CI / e2e_tests (pull_request) Successful in 29s
CI / typecheck (pull_request) Successful in 39s
CI / lint (push) Successful in 12s
CI / security (pull_request) Successful in 41s
CI / build (push) Successful in 19s
CI / quality (push) Successful in 22s
CI / security (push) Successful in 36s
CI / typecheck (push) Successful in 40s
CI / benchmark-regression (push) Has been skipped
CI / e2e_tests (push) Successful in 53s
CI / unit_tests (push) Successful in 3m13s
CI / integration_tests (pull_request) Successful in 4m5s
CI / docker (push) Successful in 42s
CI / unit_tests (pull_request) Successful in 4m31s
CI / docker (pull_request) Successful in 40s
CI / integration_tests (push) Successful in 5m7s
CI / coverage (pull_request) Successful in 5m41s
CI / coverage (push) Successful in 5m39s
CI / benchmark-publish (push) Has been cancelled
CI / benchmark-regression (pull_request) Successful in 37m35s
Added dedicated E2E test infrastructure completely separate from the existing
integration test suite. E2E tests use zero mocking — they exercise the real
CleverAgents CLI with real LLM API keys.

Key changes:
- New e2e_tests nox session running Robot Framework with --include E2E tag
  filter against robot/e2e/ directory. Uses sequential robot (not pabot)
  since E2E tests hit real API endpoints with rate limits. Propagates
  ANTHROPIC_API_KEY, OPENAI_API_KEY, and GOOGLE_API_KEY from environment.
  Output goes to build/reports/robot-e2e/ to avoid artifact collisions.
- Existing integration_tests session now excludes E2E-tagged tests via
  --exclude E2E on the pabot invocation.
- New robot/e2e/common_e2e.resource provides shared E2E keywords: suite
  setup/teardown with per-suite isolation (no mock AI), graceful skip when
  LLM API keys are absent, CLI runner keyword, flexible output assertions,
  and temporary git repo fixture creation.
- Minimal smoke test (robot/e2e/smoke_test.robot) validates the harness by
  running agents --version and agents --help. Does not require LLM keys.
- Dedicated e2e_tests CI job in .forgejo/workflows/ci.yml injects LLM API
  keys from Forgejo secrets. Runs independently (no needs dependencies)
  and does not block regular CI.
- e2e_tests is deliberately NOT in the default nox sessions list since it
  requires real API keys not present in all environments.

ISSUES CLOSED: #740
2026-03-12 21:11:37 +00:00
freemo 74772280e6 perf(tests): optimize coverage instrumentation and reporting pipeline
Replace coverage.py (sys.settrace-based) with slipcover (bytecode-based
instrumentation) for significantly faster coverage collection:

- Each behave-parallel worker runs under slipcover, producing per-feature
  JSON coverage files with unique UUIDs to avoid write contention.
- After all workers finish, slipcover --merge combines per-worker data
  into a single build/coverage.json report.
- XML report generated via slipcover --merge --xml for CI tooling.
- Terminal report with --fail-under=97 threshold enforcement.
- Robust JSON key-fallback logic handles both slipcover and coverage.py
  output formats.
- CI workflow (ci.yml, nightly-quality.yml) updated with defensive key
  lookup instead of hardcoded coverage.py format.
- Documentation updated to reflect slipcover as the coverage tool.
- CHANGELOG.md updated.

ISSUES CLOSED: #482
2026-03-02 02:01:27 +00:00
CoreRasurae d37cfbe769 test(robot): fix failing integration tests related to safe.directory config and git version
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 17s
CI / build (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 18s
CI / typecheck (pull_request) Successful in 31s
CI / security (pull_request) Successful in 38s
CI / integration_tests (pull_request) Successful in 3m58s
CI / unit_tests (pull_request) Successful in 5m59s
CI / docker (pull_request) Successful in 38s
CI / benchmark-regression (pull_request) Successful in 16m0s
CI / coverage (pull_request) Successful in 16m29s
CI / lint (push) Successful in 14s
CI / build (push) Successful in 15s
CI / quality (push) Successful in 17s
CI / security (push) Successful in 32s
CI / typecheck (push) Successful in 37s
CI / benchmark-regression (push) Has been skipped
CI / integration_tests (push) Successful in 2m44s
CI / unit_tests (push) Successful in 5m27s
CI / docker (push) Successful in 39s
CI / benchmark-publish (push) Successful in 9m11s
CI / coverage (push) Successful in 16m23s
2026-02-21 18:11:31 +00:00
brent.edwards 53902ba718 ci(CI.yml): code changes against develop will run CI
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 20s
CI / build (pull_request) Successful in 20s
CI / security (pull_request) Successful in 30s
CI / typecheck (pull_request) Successful in 35s
CI / integration_tests (pull_request) Successful in 3m32s
CI / unit_tests (pull_request) Successful in 4m32s
CI / docker (pull_request) Successful in 8s
CI / benchmark-regression (pull_request) Successful in 8m49s
CI / coverage (pull_request) Successful in 10m56s
Added `develop-*` to the list of things that run CI
2026-02-19 22:50:30 +00:00
mngrif f727baf5ea testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / quality (pull_request) Successful in 17s
CI / build (pull_request) Successful in 22s
CI / typecheck (pull_request) Successful in 32s
CI / security (pull_request) Successful in 37s
CI / integration_tests (pull_request) Successful in 2m21s
CI / unit_tests (pull_request) Successful in 6m27s
CI / docker (pull_request) Successful in 9s
CI / benchmark-regression (pull_request) Successful in 8m45s
CI / coverage (pull_request) Successful in 13m38s
2026-02-19 13:24:00 -05:00
mngrif 65efa4bc9e testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 21s
CI / security (pull_request) Successful in 27s
CI / typecheck (pull_request) Successful in 43s
CI / integration_tests (pull_request) Successful in 3m5s
CI / unit_tests (pull_request) Successful in 4m35s
CI / docker (pull_request) Successful in 1m0s
CI / benchmark-regression (pull_request) Failing after 8m46s
CI / coverage (pull_request) Has been cancelled
2026-02-19 12:17:03 -05:00
mngrif d5af40eefd Merge branch 'master' into mngrif-asv-test
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 16s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 20s
CI / security (pull_request) Successful in 28s
CI / typecheck (pull_request) Successful in 37s
CI / integration_tests (pull_request) Failing after 2m15s
CI / unit_tests (pull_request) Successful in 4m34s
CI / docker (pull_request) Successful in 50s
CI / benchmark-regression (pull_request) Successful in 9m9s
CI / coverage (pull_request) Successful in 9m39s
2026-02-19 00:03:54 +00:00
mngrif 805a4b9374 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 17s
CI / build (pull_request) Successful in 18s
CI / security (pull_request) Successful in 23s
CI / typecheck (pull_request) Successful in 30s
CI / unit_tests (pull_request) Successful in 3m35s
CI / docker (pull_request) Successful in 9s
CI / integration_tests (pull_request) Successful in 5m17s
CI / benchmark-regression (pull_request) Successful in 6m22s
CI / coverage (pull_request) Successful in 8m20s
2026-02-18 18:49:45 -05:00
mngrif e25d73cca0 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 22s
CI / quality (pull_request) Successful in 23s
CI / security (pull_request) Successful in 27s
CI / typecheck (pull_request) Successful in 30s
CI / unit_tests (pull_request) Successful in 3m30s
CI / docker (pull_request) Successful in 8s
CI / integration_tests (pull_request) Successful in 4m21s
CI / coverage (pull_request) Has been cancelled
CI / benchmark-regression (pull_request) Has been cancelled
2026-02-18 18:40:44 -05:00
mngrif c4c4fd1544 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / quality (pull_request) Successful in 18s
CI / build (pull_request) Successful in 17s
CI / typecheck (pull_request) Successful in 28s
CI / security (pull_request) Successful in 29s
CI / benchmark-regression (pull_request) Failing after 43s
CI / unit_tests (pull_request) Successful in 3m23s
CI / docker (pull_request) Successful in 37s
CI / integration_tests (pull_request) Successful in 4m24s
CI / coverage (pull_request) Successful in 7m16s
2026-02-18 17:57:27 -05:00
mngrif f9f4503c6c testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 13s
CI / quality (pull_request) Successful in 16s
CI / build (pull_request) Successful in 16s
CI / security (pull_request) Successful in 25s
CI / typecheck (pull_request) Successful in 27s
CI / benchmark-regression (pull_request) Failing after 1m5s
CI / unit_tests (pull_request) Successful in 3m27s
CI / docker (pull_request) Successful in 37s
CI / integration_tests (pull_request) Successful in 4m18s
CI / coverage (pull_request) Successful in 7m29s
2026-02-18 17:45:07 -05:00
mngrif 3960385491 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / quality (pull_request) Successful in 17s
CI / build (pull_request) Successful in 18s
CI / security (pull_request) Successful in 22s
CI / typecheck (pull_request) Successful in 28s
CI / benchmark-regression (pull_request) Failing after 32s
CI / unit_tests (pull_request) Has been cancelled
CI / integration_tests (pull_request) Has been cancelled
CI / coverage (pull_request) Has been cancelled
CI / docker (pull_request) Has been cancelled
2026-02-18 17:41:45 -05:00
mngrif de447d4bd7 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / build (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 21s
CI / typecheck (pull_request) Successful in 27s
CI / security (pull_request) Successful in 33s
CI / benchmark-regression (pull_request) Failing after 40s
CI / docker (pull_request) Has been cancelled
CI / unit_tests (pull_request) Has been cancelled
CI / integration_tests (pull_request) Has been cancelled
CI / coverage (pull_request) Has been cancelled
2026-02-18 17:33:45 -05:00
mngrif 114c798e61 testing airspeedvelocity
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Failing after 14s
CI / quality (pull_request) Successful in 16s
CI / build (pull_request) Successful in 15s
CI / security (pull_request) Successful in 25s
CI / typecheck (pull_request) Successful in 30s
CI / coverage (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Has been skipped
CI / unit_tests (pull_request) Successful in 3m30s
CI / docker (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 4m10s
2026-02-18 15:22:22 -05:00
mngrif 05f4007462 testing airspeedvelocity 2026-02-18 15:21:22 -05:00
mngrif e9530ffae0 testing airspeedvelocity 2026-02-18 15:13:22 -05:00
mngrif 7c30e5bb6e testing airspeedvelocity 2026-02-18 15:09:39 -05:00
mngrif 8ea70953e9 testing airspeedvelocity
ci.yml / testing airspeedvelocity (push) Has been cancelled
2026-02-18 15:02:15 -05:00
mngrif 41e02ca01c testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 3m17s
2026-02-18 12:51:02 -05:00
mngrif 86604db0d1 testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 3m22s
2026-02-18 10:04:27 -05:00
mngrif 2f74726509 testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 52s
2026-02-18 09:57:50 -05:00
mngrif 642f757d02 testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 50s
2026-02-17 15:59:21 -05:00
mngrif fb055193c5 testing airspeedvelocity
asv / asv-pr (push) Failing after 1s
asv / asv-publish (push) Failing after 48s
2026-02-17 15:43:46 -05:00
mngrif 033bfd04a7 testing airspeedvelocity
asv / asv-pr (push) Has been cancelled
asv / asv-publish (push) Has been cancelled
2026-02-17 15:30:07 -05:00
mngrif 1f0db6e43a testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 51s
2026-02-17 14:36:07 -05:00
mngrif f07afb23c7 testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Failing after 21s
2026-02-17 14:15:04 -05:00
mngrif 8e2cd0f2e8 testing airspeedvelocity
asv / asv-pr (push) Has been skipped
asv / asv-publish (push) Has been skipped
2026-02-17 14:12:52 -05:00
mngrif 4b4df78ff9 testing airspeedvelocity 2026-02-17 14:10:16 -05:00