Skip to content

chore(ci): add the CI workflow with a single quality gate and Dependabot - #47

Merged
lucaosti merged 2 commits into
mainfrom
feat/4-ci
Oct 22, 2026
Merged

lucaosti merged 2 commits into
mainfrom
feat/4-ci

Conversation

@lucaosti

Copy link
Copy Markdown
Collaborator

What

  • .github/workflows/ci.yml:
    • Triggers: pull_request (any base branch, so stacked PRs are checked too) and push to main.
    • Concurrency cancels runs that have been superseded.
    • Jobs:
      • lint
      • typecheck
      • import-contracts
      • test, which writes a coverage summary
      • quality-gate, which runs with if: always() and fails when any required job failed, was cancelled or was skipped
  • .github/dependabot.yml:
    • Ecosystems uv and github-actions.
    • Weekly on Mondays, Europe/Rome.
    • Minor and patch updates grouped; major updates as separate PRs.
    • The npm entry for services/qvac-worker comes with E3.

Why

M0-3 of the backlog. The single gate is what M0-6 (#7) will mark as the only required check on main.

Closes #4

How verified

  • Both files validate against the GitHub workflow and Dependabot JSON schemas (check-jsonschema).
  • On this PR, all five jobs run and must be green. See the checks below.
  • I opened a throwaway draft PR with a deliberate ruff violation to confirm that quality-gate fails. The result is linked in a comment below.

Reviewer notes

Encode the quality rules from spec section 9 and the dependency rules from ADR-0001.

- ruff targets py311 with a line length of 100 and the rule sets E, F, W, I, B, UP, SIM, RUF and D (Google docstrings). Docstring rules are relaxed under tests.
- mypy runs in strict mode on packages/.
- pytest measures coverage for both packages, with an 80% floor.
- import-linter enforces three contracts:
  - types and ports never import adapters;
  - the engine never imports agentic_rag_code;
  - the engine follows the layer order from the spec.
- Skeleton engine subpackages exist so that the contracts resolve.

The middle layer lists ingest, retrieval, generation, agent and eval as non-independent siblings (`:`), because the agent runtime and the eval runner have to call retrieval.

Refs #3
Every pull request and every push to main runs four jobs:

- lint: ruff check and format;
- typecheck: mypy;
- import-contracts: import-linter;
- test: pytest with coverage, plus a markdown coverage summary.

The quality-gate job aggregates them and fails if any of them did not succeed. It is meant to be the only required status check.

Dependabot updates uv dependencies and GitHub Actions weekly on Mondays (Europe/Rome). Minor and patch updates are grouped, and major updates arrive as separate PRs.

Refs #4
@lucaosti

Copy link
Copy Markdown
Collaborator Author

Gate verification:

@lucaosti

Copy link
Copy Markdown
Collaborator Author

Merged without an approving review by maintainer decision, to unblock contributors: this is the foundation chain everything else depends on. Verified locally on the combined chain (#1, #45, #46, #47, #49, #50 merged together, no conflicts): uv sync --locked, ruff check and format, mypy, import-linter (3 contracts kept), pytest with 100% coverage.

@lucaosti
lucaosti merged commit 1be700f into main Oct 22, 2026
5 checks passed
@lucaosti
lucaosti deleted the feat/4-ci branch October 22, 2026 16:18
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.

CI workflow with a single quality gate, plus Dependabot

1 participant