Skip to content

chore(deps): bump minijinja from 2.20.0 to 2.21.0 (#496) #2067

chore(deps): bump minijinja from 2.20.0 to 2.21.0 (#496)

chore(deps): bump minijinja from 2.20.0 to 2.21.0 (#496) #2067

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-Dwarnings"
permissions:
contents: read
jobs:
check:
name: fmt + clippy + test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
# Needed for friction-log checks that diff/scan commit history.
fetch-depth: 0
- name: Install toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Install nextest
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest
- name: fmt
run: cargo fmt --all -- --check
- name: clippy
run: cargo clippy --workspace --all-targets -- -D warnings
- name: clippy (convergio-embed --features fastembed)
# ADR-0038 F1-β: opt-in real-model code path. Default workspace
# build does not pull `fastembed-rs` (heavy ONNX dep); this
# step ensures the feature still compiles + lints clean.
run: cargo clippy -p convergio-embed --features fastembed --all-targets -- -D warnings
- name: test (nextest)
# Faster than `cargo test`. Runs unit, integration, and e2e
# tests; doc tests are not in scope for nextest, so they
# run separately below.
run: cargo nextest run --workspace --no-fail-fast
- name: doc tests
run: cargo test --workspace --doc
- name: file-size guard (300 lines max)
run: |
fail=0
while IFS= read -r f; do
lines=$(wc -l < "$f" | tr -d ' ')
if [ "$lines" -gt 300 ]; then
echo "::error file=$f::has $lines lines (max 300)"
fail=1
fi
done < <(git ls-files '*.rs')
exit $fail
- name: agent context budget
# CONSTITUTION § 13. Hard-fail on >10k lines/crate; soft-warn
# on >5k. CI surfaces the soft-warn to the PR but does not
# block on it.
# GitHub Actions runs each `run:` block under `bash --noprofile
# --norc -eo pipefail`, so a non-zero exit aborts before we
# can inspect $?. Capture the exit code via `||` to keep the
# block alive on exit 2 (soft-warn).
run: |
rc=0
./scripts/check-context-budget.sh || rc=$?
if [ "$rc" -eq 2 ]; then
echo "::warning::context-budget soft cap exceeded (advisory)"
exit 0
fi
exit $rc
- name: friction-log mirrored in daemon
# Closes F40. Every new actionable F## row in the friction
# log must declare a daemon task UUID in the
# "Daemon task mirror" section of the same file. See
# AGENTS.md § Friction log ↔ daemon mirror.
run: BASE_REF=origin/${{ github.base_ref || 'main' }} ./scripts/check-friction-log-mirror.sh
- name: ADR coherence (advisory)
# T1.17 / Tier-2 retrieval. Soft-warn only: CI surfaces drift
# between ADR frontmatter, the README index, and workspace
# members — it does not block.
run: |
cargo run -q -p convergio-cli -- coherence check || \
echo "::warning::cvg coherence check found drift (advisory)"
- name: route-table coherence (advisory)
# T1.18 / Tier-2 retrieval. Diffs actual axum routes under
# `crates/convergio-server/src/routes/` against the
# `### Endpoints` table in ARCHITECTURE.md and the HTTP
# routes bullet list in AGENTS.md. Soft-warn only while the
# doc surface re-converges with code (PR #138 just synced
# ARCHITECTURE; ambiguous multi-path table rows still
# surface as method_mismatch noise — see PR description).
run: |
cargo run -q -p convergio-cli -- coherence routes --output plain || \
echo "::warning::cvg coherence routes found drift (advisory)"
- name: cvg coherence adrs is current (strict)
run: cargo run -p convergio-cli -- coherence adrs --strict --output plain
- name: cvg coherence agents (advisory)
# Flags merged PRs whose author skipped the multi-agent
# protocol (no agent_registry entry / no heartbeat in window /
# no coordination messages). Advisory only — we do not flip
# `--strict` here until the SessionStart hook (sister PR
# `feat/session-register-and-poll-hook`) has bedded in for
# ~2 weeks. Until then this is a regression-tracking signal,
# not a hard gate. Daemon is unreachable in CI by design, so
# the verifier degrades gracefully (`daemon_reachable=false`)
# and emits no findings.
run: cargo run -p convergio-cli -- coherence agents --since 7d --output plain || true
- name: cvg coherence handshake (E2E loop smoke test)
# F1 / 5th verifier. Boots a temporary daemon (tempdir DB so
# migrations run cleanly), runs two synthetic agents through
# register → publish → poll → ack, asserts the round-trip
# closes within 10s. Catches regressions in any of those
# four seams.
run: |
export CONVERGIO_DB="sqlite:///tmp/convergio-handshake-ci.db?mode=rwc"
rm -f /tmp/convergio-handshake-ci.db /tmp/convergio-handshake-ci.db-wal /tmp/convergio-handshake-ci.db-shm
# Build server + cli binaries first so the cargo run below
# only takes the time to start, not to compile (CI cargo
# run can take 20-30s on cold cache, racing the probe loop).
cargo build -q -p convergio-server -p convergio-cli
cargo run -q -p convergio-server -- start --bind 127.0.0.1:18421 &
DAEMON_PID=$!
trap 'kill $DAEMON_PID 2>/dev/null || true; rm -f /tmp/convergio-handshake-ci.db*' EXIT
# Probe up to 120s (240 × 0.5s) — health + the bootstrap
# action catalog used by MCP/CLI discovery. /v1/api/actions is
# intentionally exempt from purpose binding so this smoke check
# cannot create durable rows while waiting for the daemon.
ready=0
for _ in $(seq 1 240); do
if curl -fsS -H 'x-purpose-id: 00000000-0000-4000-8000-000000000443' http://127.0.0.1:18421/v1/health >/dev/null 2>&1 \
&& curl -fsS http://127.0.0.1:18421/v1/api/actions >/dev/null 2>&1; then
ready=1
break
fi
sleep 0.5
done
if [ "$ready" != "1" ]; then
echo "::error::daemon never became ready after 120s; aborting handshake"
exit 1
fi
cargo run -q -p convergio-cli -- coherence handshake \
--daemon http://127.0.0.1:18421 --timeout-seconds 10
- name: legibility audit
# CONSTITUTION § 16. Combines static caps + index density +
# audit chain integrity into a 0-100 score. Advisory only:
# CI never blocks on legibility (it is a regression-tracking
# signal, not a hard gate). Floor is 70; target 85.
run: |
rc=0
./scripts/legibility-audit.sh || rc=$?
if [ "$rc" -eq 1 ]; then
echo "::warning::legibility score below 50/100 — repo may be hard for an agent to follow (CONSTITUTION § 16)"
elif [ "$rc" -eq 2 ]; then
echo "::warning::legibility score 50-69/100 — under target floor of 70/100 (CONSTITUTION § 16)"
fi
# Advisory only: never fail CI on legibility (gate is
# static caps + supply chain).
exit 0
docs-drift:
name: Docs drift (advisory)
# Advisory only — surfaces AUTO-block + docs/INDEX.md drift
# without blocking PR merges. Per ADR-0015 § Drift policy, the
# nightly cron in `.github/workflows/auto-blocks-drift.yml` is
# the canonical reconciliation mechanism, eliminating the
# O(N²) cascade caused by per-PR regen gates (retro 544e78cc
# P2-9).
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Install toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: docs AUTO blocks (advisory)
run: |
cargo run -q -p convergio-cli -- docs regenerate --check || \
echo "::warning::AUTO blocks drift detected (advisory; reconciled nightly)"
- name: docs INDEX (advisory)
run: |
./scripts/generate-docs-index.sh --check || \
echo "::warning::docs/INDEX.md drift detected (advisory; reconciled nightly)"
supply-chain:
name: cargo deny + audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
# friction-log mirror check needs git diff against base
fetch-depth: 0
- name: Install toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Install supply-chain tools
uses: taiki-e/install-action@v2
with:
tool: cargo-deny,cargo-audit
env:
RUSTFLAGS: ""
- name: cargo deny
run: cargo deny --locked check advisories bans licenses sources
- name: cargo audit
run: cargo audit