llm-council-core 0.22.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- llm_council_core-0.22.0/.claude/skills/council-gate/SKILL.md +133 -0
- llm_council_core-0.22.0/.claude/skills/council-gate/references/ci-cd-rubric.md +356 -0
- llm_council_core-0.22.0/.claude/skills/council-review/SKILL.md +103 -0
- llm_council_core-0.22.0/.claude/skills/council-review/references/code-review-rubric.md +295 -0
- llm_council_core-0.22.0/.claude/skills/council-verify/SKILL.md +89 -0
- llm_council_core-0.22.0/.claude/skills/council-verify/references/rubrics.md +202 -0
- llm_council_core-0.22.0/.claude/skills/marketplace.json +50 -0
- llm_council_core-0.22.0/.devcontainer/devcontainer.json +52 -0
- llm_council_core-0.22.0/.env.example +90 -0
- llm_council_core-0.22.0/.github/CODEOWNERS +21 -0
- llm_council_core-0.22.0/.github/FUNDING.yml +15 -0
- llm_council_core-0.22.0/.github/ISSUE_TEMPLATE/bug_report.md +48 -0
- llm_council_core-0.22.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- llm_council_core-0.22.0/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
- llm_council_core-0.22.0/.github/PULL_REQUEST_TEMPLATE.md +40 -0
- llm_council_core-0.22.0/.github/dependabot.yml +43 -0
- llm_council_core-0.22.0/.github/dependency-review-config.yml +21 -0
- llm_council_core-0.22.0/.github/social-preview.png +0 -0
- llm_council_core-0.22.0/.github/workflows/ci.yml +93 -0
- llm_council_core-0.22.0/.github/workflows/docs.yml +56 -0
- llm_council_core-0.22.0/.github/workflows/publish.yml +72 -0
- llm_council_core-0.22.0/.github/workflows/release-security.yml +83 -0
- llm_council_core-0.22.0/.github/workflows/scorecard.yml +54 -0
- llm_council_core-0.22.0/.github/workflows/security.yml +193 -0
- llm_council_core-0.22.0/.github/workflows/validate-templates.yml +132 -0
- llm_council_core-0.22.0/.gitignore +67 -0
- llm_council_core-0.22.0/.gitleaks.toml +36 -0
- llm_council_core-0.22.0/.pre-commit-config.yaml +21 -0
- llm_council_core-0.22.0/.python-version +1 -0
- llm_council_core-0.22.0/.semgrep/llm-security.yaml +152 -0
- llm_council_core-0.22.0/CHANGELOG.md +1033 -0
- llm_council_core-0.22.0/CITATION.cff +27 -0
- llm_council_core-0.22.0/CLAUDE.md +804 -0
- llm_council_core-0.22.0/CODE_OF_CONDUCT.md +83 -0
- llm_council_core-0.22.0/CONTRIBUTING.md +209 -0
- llm_council_core-0.22.0/GOVERNANCE.md +144 -0
- llm_council_core-0.22.0/LICENSE +19 -0
- llm_council_core-0.22.0/Makefile +115 -0
- llm_council_core-0.22.0/PKG-INFO +1265 -0
- llm_council_core-0.22.0/README.md +1210 -0
- llm_council_core-0.22.0/SECURITY.md +136 -0
- llm_council_core-0.22.0/SUPPORT.md +75 -0
- llm_council_core-0.22.0/data/benchmark.json +268 -0
- llm_council_core-0.22.0/deploy/railway/Dockerfile +42 -0
- llm_council_core-0.22.0/deploy/railway/TEMPLATE_OVERVIEW.md +102 -0
- llm_council_core-0.22.0/docker-compose.yml +38 -0
- llm_council_core-0.22.0/docs/CNAME +1 -0
- llm_council_core-0.22.0/docs/adr/ADR-000-template.md +25 -0
- llm_council_core-0.22.0/docs/adr/ADR-001-Council-Summary.md +992 -0
- llm_council_core-0.22.0/docs/adr/ADR-007-scoring-methodology.md +279 -0
- llm_council_core-0.22.0/docs/adr/ADR-008-package-structure.md +227 -0
- llm_council_core-0.22.0/docs/adr/ADR-009-http-api-open-core-boundary.md +312 -0
- llm_council_core-0.22.0/docs/adr/ADR-010-consensus-mechanisms.md +360 -0
- llm_council_core-0.22.0/docs/adr/ADR-011-cost-tracking.md +424 -0
- llm_council_core-0.22.0/docs/adr/ADR-012-mcp-server-reliability.md +477 -0
- llm_council_core-0.22.0/docs/adr/ADR-013-secure-api-key-handling.md +376 -0
- llm_council_core-0.22.0/docs/adr/ADR-014-verbosity-penalty-prompts.md +202 -0
- llm_council_core-0.22.0/docs/adr/ADR-015-bias-auditing.md +437 -0
- llm_council_core-0.22.0/docs/adr/ADR-016-structured-rubric-scoring.md +503 -0
- llm_council_core-0.22.0/docs/adr/ADR-017-response-order-randomization.md +293 -0
- llm_council_core-0.22.0/docs/adr/ADR-018-cross-session-bias-aggregation.md +634 -0
- llm_council_core-0.22.0/docs/adr/ADR-019-outlook-email-itil-analysis.md +346 -0
- llm_council_core-0.22.0/docs/adr/ADR-020-not-diamond-integration-strategy.md +440 -0
- llm_council_core-0.22.0/docs/adr/ADR-021-quint-code-fpf-integration.md +567 -0
- llm_council_core-0.22.0/docs/adr/ADR-022-tiered-model-selection.md +446 -0
- llm_council_core-0.22.0/docs/adr/ADR-023-multi-router-gateway-support.md +1068 -0
- llm_council_core-0.22.0/docs/adr/ADR-024-unified-routing-architecture.md +863 -0
- llm_council_core-0.22.0/docs/adr/ADR-025-future-integration-capabilities.md +1076 -0
- llm_council_core-0.22.0/docs/adr/ADR-026-dynamic-model-intelligence.md +1227 -0
- llm_council_core-0.22.0/docs/adr/ADR-027-frontier-tier.md +334 -0
- llm_council_core-0.22.0/docs/adr/ADR-028-dynamic-candidate-discovery.md +455 -0
- llm_council_core-0.22.0/docs/adr/ADR-029-model-audition-mechanism.md +431 -0
- llm_council_core-0.22.0/docs/adr/ADR-030-scoring-refinements.md +525 -0
- llm_council_core-0.22.0/docs/adr/ADR-031-configuration-modernization.md +237 -0
- llm_council_core-0.22.0/docs/adr/ADR-032-complete-config-migration.md +629 -0
- llm_council_core-0.22.0/docs/adr/ADR-033-oss-community-infrastructure.md +793 -0
- llm_council_core-0.22.0/docs/adr/ADR-034-agent-skills-verification.md +1166 -0
- llm_council_core-0.22.0/docs/adr/ADR-035-devsecops-implementation.md +873 -0
- llm_council_core-0.22.0/docs/adr/ADR-036-output-quality-quantification.md +710 -0
- llm_council_core-0.22.0/docs/adr/ADR-037-n8n-workflow-integration.md +666 -0
- llm_council_core-0.22.0/docs/adr/ADR-038-one-click-deployment-strategy.md +481 -0
- llm_council_core-0.22.0/docs/adr/ADR-039-llmrouter-integration.md +293 -0
- llm_council_core-0.22.0/docs/announcements/agent-skills-launch.md +383 -0
- llm_council_core-0.22.0/docs/announcements/council-verification-integration.md +332 -0
- llm_council_core-0.22.0/docs/api.md +218 -0
- llm_council_core-0.22.0/docs/architecture/adrs.md +61 -0
- llm_council_core-0.22.0/docs/architecture/overview.md +77 -0
- llm_council_core-0.22.0/docs/blog/01-multi-model-architecture.md +186 -0
- llm_council_core-0.22.0/docs/blog/02-fault-tolerant-gateway.md +258 -0
- llm_council_core-0.22.0/docs/blog/03-voting-logic-borda.md +288 -0
- llm_council_core-0.22.0/docs/blog/04-latency-tax-parallel.md +298 -0
- llm_council_core-0.22.0/docs/blog/05-detecting-evaluator-bias.md +371 -0
- llm_council_core-0.22.0/docs/blog/06-accuracy-ceiling.md +282 -0
- llm_council_core-0.22.0/docs/blog/07-shadow-mode-auditions.md +386 -0
- llm_council_core-0.22.0/docs/blog/08-n8n-workflow-automation.md +347 -0
- llm_council_core-0.22.0/docs/blog/09-one-click-deployment.md +220 -0
- llm_council_core-0.22.0/docs/blog/10-agent-skills-introduction.md +257 -0
- llm_council_core-0.22.0/docs/blog/11-verification-security-architecture.md +302 -0
- llm_council_core-0.22.0/docs/blog/12-cicd-quality-gates.md +549 -0
- llm_council_core-0.22.0/docs/blog/13-council-deliberation-verification.md +305 -0
- llm_council_core-0.22.0/docs/contributing.md +33 -0
- llm_council_core-0.22.0/docs/deployment/index.md +84 -0
- llm_council_core-0.22.0/docs/deployment/local.md +218 -0
- llm_council_core-0.22.0/docs/deployment/railway.md +149 -0
- llm_council_core-0.22.0/docs/deployment/render.md +174 -0
- llm_council_core-0.22.0/docs/examples/n8n/code-review-workflow.json +137 -0
- llm_council_core-0.22.0/docs/examples/n8n/design-decision-workflow.json +153 -0
- llm_council_core-0.22.0/docs/examples/n8n/support-triage-workflow.json +245 -0
- llm_council_core-0.22.0/docs/getting-started/configuration.md +77 -0
- llm_council_core-0.22.0/docs/getting-started/installation.md +71 -0
- llm_council_core-0.22.0/docs/getting-started/quickstart.md +62 -0
- llm_council_core-0.22.0/docs/guides/creating-skills.md +299 -0
- llm_council_core-0.22.0/docs/guides/http-api.md +208 -0
- llm_council_core-0.22.0/docs/guides/mcp.md +85 -0
- llm_council_core-0.22.0/docs/guides/python.md +82 -0
- llm_council_core-0.22.0/docs/guides/skills.md +288 -0
- llm_council_core-0.22.0/docs/img/logo.png +0 -0
- llm_council_core-0.22.0/docs/img/logo.svg +64 -0
- llm_council_core-0.22.0/docs/index.md +63 -0
- llm_council_core-0.22.0/docs/integrations/index.md +62 -0
- llm_council_core-0.22.0/docs/integrations/n8n.md +331 -0
- llm_council_core-0.22.0/docs/stylesheets/extra.css +107 -0
- llm_council_core-0.22.0/llm_council.yaml +161 -0
- llm_council_core-0.22.0/mkdocs.yml +149 -0
- llm_council_core-0.22.0/pyproject.toml +109 -0
- llm_council_core-0.22.0/railway.json +14 -0
- llm_council_core-0.22.0/render.yaml +25 -0
- llm_council_core-0.22.0/sonar-project.properties +35 -0
- llm_council_core-0.22.0/src/llm_council/__init__.py +75 -0
- llm_council_core-0.22.0/src/llm_council/_version.py +34 -0
- llm_council_core-0.22.0/src/llm_council/audition/__init__.py +67 -0
- llm_council_core-0.22.0/src/llm_council/audition/selection.py +191 -0
- llm_council_core-0.22.0/src/llm_council/audition/store.py +128 -0
- llm_council_core-0.22.0/src/llm_council/audition/tracker.py +337 -0
- llm_council_core-0.22.0/src/llm_council/audition/types.py +216 -0
- llm_council_core-0.22.0/src/llm_council/audition/voting.py +55 -0
- llm_council_core-0.22.0/src/llm_council/bias_aggregation.py +812 -0
- llm_council_core-0.22.0/src/llm_council/bias_audit.py +406 -0
- llm_council_core-0.22.0/src/llm_council/bias_persistence.py +606 -0
- llm_council_core-0.22.0/src/llm_council/cache.py +242 -0
- llm_council_core-0.22.0/src/llm_council/cli.py +272 -0
- llm_council_core-0.22.0/src/llm_council/cost_ceiling.py +109 -0
- llm_council_core-0.22.0/src/llm_council/council.py +2143 -0
- llm_council_core-0.22.0/src/llm_council/dissent.py +274 -0
- llm_council_core-0.22.0/src/llm_council/evaluation.py +465 -0
- llm_council_core-0.22.0/src/llm_council/frontier_fallback.py +239 -0
- llm_council_core-0.22.0/src/llm_council/gateway/__init__.py +88 -0
- llm_council_core-0.22.0/src/llm_council/gateway/base.py +125 -0
- llm_council_core-0.22.0/src/llm_council/gateway/circuit_breaker.py +390 -0
- llm_council_core-0.22.0/src/llm_council/gateway/circuit_breaker_registry.py +182 -0
- llm_council_core-0.22.0/src/llm_council/gateway/direct.py +631 -0
- llm_council_core-0.22.0/src/llm_council/gateway/errors.py +89 -0
- llm_council_core-0.22.0/src/llm_council/gateway/ollama.py +513 -0
- llm_council_core-0.22.0/src/llm_council/gateway/openrouter.py +368 -0
- llm_council_core-0.22.0/src/llm_council/gateway/requesty.py +364 -0
- llm_council_core-0.22.0/src/llm_council/gateway/router.py +312 -0
- llm_council_core-0.22.0/src/llm_council/gateway/types.py +120 -0
- llm_council_core-0.22.0/src/llm_council/gateway_adapter.py +330 -0
- llm_council_core-0.22.0/src/llm_council/graduation.py +123 -0
- llm_council_core-0.22.0/src/llm_council/http_server.py +269 -0
- llm_council_core-0.22.0/src/llm_council/layer_contracts.py +496 -0
- llm_council_core-0.22.0/src/llm_council/mcp_server.py +523 -0
- llm_council_core-0.22.0/src/llm_council/metadata/__init__.py +145 -0
- llm_council_core-0.22.0/src/llm_council/metadata/cache.py +174 -0
- llm_council_core-0.22.0/src/llm_council/metadata/discovery.py +339 -0
- llm_council_core-0.22.0/src/llm_council/metadata/dynamic_provider.py +179 -0
- llm_council_core-0.22.0/src/llm_council/metadata/intersection.py +118 -0
- llm_council_core-0.22.0/src/llm_council/metadata/litellm_adapter.py +188 -0
- llm_council_core-0.22.0/src/llm_council/metadata/offline.py +56 -0
- llm_council_core-0.22.0/src/llm_council/metadata/openrouter_client.py +184 -0
- llm_council_core-0.22.0/src/llm_council/metadata/protocol.py +100 -0
- llm_council_core-0.22.0/src/llm_council/metadata/registry.py +281 -0
- llm_council_core-0.22.0/src/llm_council/metadata/scoring.py +282 -0
- llm_council_core-0.22.0/src/llm_council/metadata/selection.py +755 -0
- llm_council_core-0.22.0/src/llm_council/metadata/startup.py +177 -0
- llm_council_core-0.22.0/src/llm_council/metadata/static_registry.py +218 -0
- llm_council_core-0.22.0/src/llm_council/metadata/types.py +96 -0
- llm_council_core-0.22.0/src/llm_council/metadata/worker.py +122 -0
- llm_council_core-0.22.0/src/llm_council/models/registry.yaml +373 -0
- llm_council_core-0.22.0/src/llm_council/observability/__init__.py +30 -0
- llm_council_core-0.22.0/src/llm_council/observability/metrics_adapter.py +550 -0
- llm_council_core-0.22.0/src/llm_council/openrouter.py +272 -0
- llm_council_core-0.22.0/src/llm_council/performance/__init__.py +45 -0
- llm_council_core-0.22.0/src/llm_council/performance/integration.py +149 -0
- llm_council_core-0.22.0/src/llm_council/performance/store.py +105 -0
- llm_council_core-0.22.0/src/llm_council/performance/tracker.py +293 -0
- llm_council_core-0.22.0/src/llm_council/performance/types.py +96 -0
- llm_council_core-0.22.0/src/llm_council/reasoning/__init__.py +48 -0
- llm_council_core-0.22.0/src/llm_council/reasoning/tracker.py +127 -0
- llm_council_core-0.22.0/src/llm_council/reasoning/types.py +126 -0
- llm_council_core-0.22.0/src/llm_council/rubric.py +200 -0
- llm_council_core-0.22.0/src/llm_council/safety_gate.py +166 -0
- llm_council_core-0.22.0/src/llm_council/skills/__init__.py +50 -0
- llm_council_core-0.22.0/src/llm_council/skills/loader.py +449 -0
- llm_council_core-0.22.0/src/llm_council/telemetry.py +185 -0
- llm_council_core-0.22.0/src/llm_council/telemetry_client.py +226 -0
- llm_council_core-0.22.0/src/llm_council/tier_contract.py +333 -0
- llm_council_core-0.22.0/src/llm_council/triage/__init__.py +180 -0
- llm_council_core-0.22.0/src/llm_council/triage/complexity.py +234 -0
- llm_council_core-0.22.0/src/llm_council/triage/fast_path.py +446 -0
- llm_council_core-0.22.0/src/llm_council/triage/not_diamond.py +366 -0
- llm_council_core-0.22.0/src/llm_council/triage/prompt_optimizer.py +169 -0
- llm_council_core-0.22.0/src/llm_council/triage/rollback_metrics.py +390 -0
- llm_council_core-0.22.0/src/llm_council/triage/shadow_sampling.py +412 -0
- llm_council_core-0.22.0/src/llm_council/triage/types.py +94 -0
- llm_council_core-0.22.0/src/llm_council/triage/wildcard.py +232 -0
- llm_council_core-0.22.0/src/llm_council/unified_config.py +1616 -0
- llm_council_core-0.22.0/src/llm_council/verdict.py +366 -0
- llm_council_core-0.22.0/src/llm_council/verification/__init__.py +76 -0
- llm_council_core-0.22.0/src/llm_council/verification/api.py +661 -0
- llm_council_core-0.22.0/src/llm_council/verification/context.py +258 -0
- llm_council_core-0.22.0/src/llm_council/verification/formatting.py +133 -0
- llm_council_core-0.22.0/src/llm_council/verification/transcript.py +321 -0
- llm_council_core-0.22.0/src/llm_council/verification/types.py +222 -0
- llm_council_core-0.22.0/src/llm_council/verification/verdict_extractor.py +349 -0
- llm_council_core-0.22.0/src/llm_council/voting.py +94 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/__init__.py +89 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/_council_runner.py +164 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/dispatcher.py +276 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/event_bridge.py +332 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/hmac_auth.py +137 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/sse.py +122 -0
- llm_council_core-0.22.0/src/llm_council/webhooks/types.py +76 -0
- llm_council_core-0.22.0/tests/cassettes/.gitkeep +0 -0
- llm_council_core-0.22.0/tests/cassettes/TestExecuteWithFallback.test_returns_response_on_success.yaml +26 -0
- llm_council_core-0.22.0/tests/cassettes/TestOpenRouterClient.test_fetch_models_extracts_modalities.yaml +24 -0
- llm_council_core-0.22.0/tests/cassettes/TestOpenRouterClient.test_fetch_models_extracts_pricing_correctly.yaml +24 -0
- llm_council_core-0.22.0/tests/cassettes/TestOpenRouterClient.test_fetch_models_returns_model_list.yaml +24 -0
- llm_council_core-0.22.0/tests/cassettes/test_council_health_check_success.yaml +26 -0
- llm_council_core-0.22.0/tests/cassettes/test_query_model_with_status_success.yaml +26 -0
- llm_council_core-0.22.0/tests/cassettes/test_query_models_with_progress.yaml +50 -0
- llm_council_core-0.22.0/tests/cassettes/test_query_models_with_progress_no_callback.yaml +26 -0
- llm_council_core-0.22.0/tests/conftest.py +111 -0
- llm_council_core-0.22.0/tests/integration/__init__.py +1 -0
- llm_council_core-0.22.0/tests/integration/skills/__init__.py +0 -0
- llm_council_core-0.22.0/tests/integration/skills/test_council_gate.py +372 -0
- llm_council_core-0.22.0/tests/integration/skills/test_council_review.py +325 -0
- llm_council_core-0.22.0/tests/integration/skills/test_council_verify.py +252 -0
- llm_council_core-0.22.0/tests/integration/verification/__init__.py +1 -0
- llm_council_core-0.22.0/tests/integration/verification/test_api.py +402 -0
- llm_council_core-0.22.0/tests/integration/verification/test_council_integration.py +648 -0
- llm_council_core-0.22.0/tests/test_audition_observability.py +253 -0
- llm_council_core-0.22.0/tests/test_audition_selection.py +257 -0
- llm_council_core-0.22.0/tests/test_audition_tracker.py +251 -0
- llm_council_core-0.22.0/tests/test_audition_transitions.py +509 -0
- llm_council_core-0.22.0/tests/test_audition_types.py +269 -0
- llm_council_core-0.22.0/tests/test_audition_voting.py +132 -0
- llm_council_core-0.22.0/tests/test_bias_aggregation.py +91 -0
- llm_council_core-0.22.0/tests/test_bias_audit.py +623 -0
- llm_council_core-0.22.0/tests/test_bias_persistence.py +961 -0
- llm_council_core-0.22.0/tests/test_cache.py +195 -0
- llm_council_core-0.22.0/tests/test_circuit_breaker_enhanced.py +438 -0
- llm_council_core-0.22.0/tests/test_circuit_breaker_registry.py +354 -0
- llm_council_core-0.22.0/tests/test_circuit_breaker_selection.py +302 -0
- llm_council_core-0.22.0/tests/test_cli.py +154 -0
- llm_council_core-0.22.0/tests/test_config.py +165 -0
- llm_council_core-0.22.0/tests/test_cost_ceiling.py +181 -0
- llm_council_core-0.22.0/tests/test_cost_scoring.py +374 -0
- llm_council_core-0.22.0/tests/test_council.py +316 -0
- llm_council_core-0.22.0/tests/test_council_integration.py +178 -0
- llm_council_core-0.22.0/tests/test_council_reliability.py +499 -0
- llm_council_core-0.22.0/tests/test_deployment.py +522 -0
- llm_council_core-0.22.0/tests/test_devcontainer.py +93 -0
- llm_council_core-0.22.0/tests/test_discovery.py +377 -0
- llm_council_core-0.22.0/tests/test_dissent.py +319 -0
- llm_council_core-0.22.0/tests/test_docs_build.py +125 -0
- llm_council_core-0.22.0/tests/test_dynamic_provider.py +299 -0
- llm_council_core-0.22.0/tests/test_env_example.py +99 -0
- llm_council_core-0.22.0/tests/test_evaluation.py +239 -0
- llm_council_core-0.22.0/tests/test_event_bridge.py +523 -0
- llm_council_core-0.22.0/tests/test_fallback_integration.py +183 -0
- llm_council_core-0.22.0/tests/test_fast_path.py +383 -0
- llm_council_core-0.22.0/tests/test_frontier_fallback.py +202 -0
- llm_council_core-0.22.0/tests/test_frontier_observability.py +164 -0
- llm_council_core-0.22.0/tests/test_gateway_base.py +347 -0
- llm_council_core-0.22.0/tests/test_gateway_circuit_breaker.py +298 -0
- llm_council_core-0.22.0/tests/test_gateway_council_integration.py +129 -0
- llm_council_core-0.22.0/tests/test_gateway_direct.py +366 -0
- llm_council_core-0.22.0/tests/test_gateway_fallback.py +81 -0
- llm_council_core-0.22.0/tests/test_gateway_ollama.py +599 -0
- llm_council_core-0.22.0/tests/test_gateway_openrouter.py +347 -0
- llm_council_core-0.22.0/tests/test_gateway_requesty.py +336 -0
- llm_council_core-0.22.0/tests/test_gateway_router.py +331 -0
- llm_council_core-0.22.0/tests/test_graduation.py +311 -0
- llm_council_core-0.22.0/tests/test_http_server.py +377 -0
- llm_council_core-0.22.0/tests/test_layer_contracts.py +383 -0
- llm_council_core-0.22.0/tests/test_layer_integration.py +582 -0
- llm_council_core-0.22.0/tests/test_litellm_adapter.py +141 -0
- llm_council_core-0.22.0/tests/test_makefile.py +121 -0
- llm_council_core-0.22.0/tests/test_mcp_server.py +409 -0
- llm_council_core-0.22.0/tests/test_mcp_tier_integration.py +199 -0
- llm_council_core-0.22.0/tests/test_metadata_cache.py +260 -0
- llm_council_core-0.22.0/tests/test_metadata_integration.py +377 -0
- llm_council_core-0.22.0/tests/test_metadata_protocol.py +157 -0
- llm_council_core-0.22.0/tests/test_metadata_types.py +181 -0
- llm_council_core-0.22.0/tests/test_metrics_adapter.py +478 -0
- llm_council_core-0.22.0/tests/test_n8n_examples.py +238 -0
- llm_council_core-0.22.0/tests/test_not_diamond.py +291 -0
- llm_council_core-0.22.0/tests/test_observability.py +339 -0
- llm_council_core-0.22.0/tests/test_observability_wiring.py +159 -0
- llm_council_core-0.22.0/tests/test_offline_mode.py +170 -0
- llm_council_core-0.22.0/tests/test_openrouter.py +186 -0
- llm_council_core-0.22.0/tests/test_openrouter_client.py +317 -0
- llm_council_core-0.22.0/tests/test_performance_config.py +130 -0
- llm_council_core-0.22.0/tests/test_performance_integration.py +292 -0
- llm_council_core-0.22.0/tests/test_performance_tracker.py +510 -0
- llm_council_core-0.22.0/tests/test_performance_types.py +504 -0
- llm_council_core-0.22.0/tests/test_quality_percentile.py +285 -0
- llm_council_core-0.22.0/tests/test_quality_tier_scores.py +167 -0
- llm_council_core-0.22.0/tests/test_reasoning_config.py +339 -0
- llm_council_core-0.22.0/tests/test_reasoning_injection.py +278 -0
- llm_council_core-0.22.0/tests/test_reasoning_tracker.py +251 -0
- llm_council_core-0.22.0/tests/test_registry.py +348 -0
- llm_council_core-0.22.0/tests/test_rollback_metrics.py +252 -0
- llm_council_core-0.22.0/tests/test_rubric.py +717 -0
- llm_council_core-0.22.0/tests/test_safety_gate.py +219 -0
- llm_council_core-0.22.0/tests/test_secure_key_handling.py +440 -0
- llm_council_core-0.22.0/tests/test_security_configs.py +409 -0
- llm_council_core-0.22.0/tests/test_security_workflows.py +584 -0
- llm_council_core-0.22.0/tests/test_selection_metadata.py +382 -0
- llm_council_core-0.22.0/tests/test_shadow_integration.py +257 -0
- llm_council_core-0.22.0/tests/test_shadow_sampling.py +352 -0
- llm_council_core-0.22.0/tests/test_shadow_voting.py +282 -0
- llm_council_core-0.22.0/tests/test_sse_streaming.py +462 -0
- llm_council_core-0.22.0/tests/test_startup.py +164 -0
- llm_council_core-0.22.0/tests/test_static_registry.py +273 -0
- llm_council_core-0.22.0/tests/test_style_normalization.py +111 -0
- llm_council_core-0.22.0/tests/test_telemetry.py +152 -0
- llm_council_core-0.22.0/tests/test_telemetry_alignment.py +60 -0
- llm_council_core-0.22.0/tests/test_telemetry_config.py +262 -0
- llm_council_core-0.22.0/tests/test_tier_contract.py +377 -0
- llm_council_core-0.22.0/tests/test_tier_council_integration.py +239 -0
- llm_council_core-0.22.0/tests/test_tier_intersection.py +311 -0
- llm_council_core-0.22.0/tests/test_tier_model_pools.py +230 -0
- llm_council_core-0.22.0/tests/test_tier_selection.py +570 -0
- llm_council_core-0.22.0/tests/test_triage_complexity.py +232 -0
- llm_council_core-0.22.0/tests/test_triage_council_integration.py +257 -0
- llm_council_core-0.22.0/tests/test_triage_prompt_optimizer.py +263 -0
- llm_council_core-0.22.0/tests/test_triage_types.py +332 -0
- llm_council_core-0.22.0/tests/test_triage_wildcard.py +409 -0
- llm_council_core-0.22.0/tests/test_unified_config.py +2027 -0
- llm_council_core-0.22.0/tests/test_vcr_infrastructure.py +99 -0
- llm_council_core-0.22.0/tests/test_verdict.py +485 -0
- llm_council_core-0.22.0/tests/test_voting.py +137 -0
- llm_council_core-0.22.0/tests/test_webhook_integration.py +472 -0
- llm_council_core-0.22.0/tests/test_webhooks_dispatcher.py +366 -0
- llm_council_core-0.22.0/tests/test_webhooks_hmac.py +271 -0
- llm_council_core-0.22.0/tests/test_webhooks_sse.py +263 -0
- llm_council_core-0.22.0/tests/test_webhooks_types.py +186 -0
- llm_council_core-0.22.0/tests/test_worker.py +294 -0
- llm_council_core-0.22.0/tests/unit/__init__.py +1 -0
- llm_council_core-0.22.0/tests/unit/skills/__init__.py +1 -0
- llm_council_core-0.22.0/tests/unit/skills/test_loader.py +383 -0
- llm_council_core-0.22.0/tests/unit/skills/test_skill_format.py +346 -0
- llm_council_core-0.22.0/tests/unit/skills/test_skill_loader_robustness.py +486 -0
- llm_council_core-0.22.0/tests/unit/test_mcp_audit.py +313 -0
- llm_council_core-0.22.0/tests/unit/test_mcp_verify.py +417 -0
- llm_council_core-0.22.0/tests/unit/verification/__init__.py +1 -0
- llm_council_core-0.22.0/tests/unit/verification/test_async_file_fetch.py +491 -0
- llm_council_core-0.22.0/tests/unit/verification/test_context.py +319 -0
- llm_council_core-0.22.0/tests/unit/verification/test_formatting.py +258 -0
- llm_council_core-0.22.0/tests/unit/verification/test_transcript.py +430 -0
- llm_council_core-0.22.0/tests/unit/verification/test_types.py +411 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: council-gate
|
|
3
|
+
description: |
|
|
4
|
+
Quality gate using LLM Council multi-model consensus for CI/CD pipelines.
|
|
5
|
+
Use for automated approval workflows and pipeline quality checks.
|
|
6
|
+
Keywords: gate, CI, CD, pipeline, automated approval, quality gate, GitHub Actions
|
|
7
|
+
|
|
8
|
+
license: Apache-2.0
|
|
9
|
+
compatibility: "llm-council >= 2.0, mcp >= 1.0, github-actions >= 2.0"
|
|
10
|
+
metadata:
|
|
11
|
+
category: ci-cd
|
|
12
|
+
domain: devops
|
|
13
|
+
council-version: "2.0"
|
|
14
|
+
author: amiable-dev
|
|
15
|
+
repository: https://github.com/amiable-dev/llm-council
|
|
16
|
+
|
|
17
|
+
allowed-tools: "Read Grep mcp:llm-council/verify mcp:llm-council/audit"
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Council Gate Skill
|
|
21
|
+
|
|
22
|
+
Automated quality gate using multi-model consensus for CI/CD pipelines.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
- Add AI-powered quality checks to GitHub Actions
|
|
27
|
+
- Automate PR approval workflows
|
|
28
|
+
- Gate deployments on multi-model verification
|
|
29
|
+
- Enforce quality standards in pipelines
|
|
30
|
+
|
|
31
|
+
## Exit Codes
|
|
32
|
+
|
|
33
|
+
| Code | Verdict | CI/CD Behavior |
|
|
34
|
+
|------|---------|----------------|
|
|
35
|
+
| `0` | PASS | Pipeline continues |
|
|
36
|
+
| `1` | FAIL | Pipeline fails |
|
|
37
|
+
| `2` | UNCLEAR | Pipeline pauses for human review |
|
|
38
|
+
|
|
39
|
+
## Transcript Location
|
|
40
|
+
|
|
41
|
+
All deliberations are saved for audit:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
.council/logs/{timestamp}-{hash}/
|
|
45
|
+
├── request.json # Input snapshot
|
|
46
|
+
├── stage1.json # Model responses
|
|
47
|
+
├── stage2.json # Peer reviews
|
|
48
|
+
├── stage3.json # Synthesis
|
|
49
|
+
└── result.json # Final verdict
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## GitHub Actions Integration
|
|
53
|
+
|
|
54
|
+
```yaml
|
|
55
|
+
name: Council Quality Gate
|
|
56
|
+
|
|
57
|
+
on:
|
|
58
|
+
pull_request:
|
|
59
|
+
branches: [main, master]
|
|
60
|
+
|
|
61
|
+
jobs:
|
|
62
|
+
council-gate:
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/checkout@v4
|
|
66
|
+
with:
|
|
67
|
+
fetch-depth: 0
|
|
68
|
+
|
|
69
|
+
- name: Install LLM Council
|
|
70
|
+
run: pip install llm-council-core
|
|
71
|
+
|
|
72
|
+
- name: Run Council Gate
|
|
73
|
+
env:
|
|
74
|
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
|
75
|
+
run: |
|
|
76
|
+
llm-council gate \
|
|
77
|
+
--snapshot ${{ github.sha }} \
|
|
78
|
+
--rubric-focus Security \
|
|
79
|
+
--confidence-threshold 0.8
|
|
80
|
+
|
|
81
|
+
- name: Upload Transcript
|
|
82
|
+
if: always()
|
|
83
|
+
uses: actions/upload-artifact@v4
|
|
84
|
+
with:
|
|
85
|
+
name: council-transcript
|
|
86
|
+
path: .council/logs/
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Configuration
|
|
90
|
+
|
|
91
|
+
| Parameter | Default | Description |
|
|
92
|
+
|-----------|---------|-------------|
|
|
93
|
+
| `confidence_threshold` | 0.7 | Minimum confidence for PASS |
|
|
94
|
+
| `rubric_focus` | null | Focus area (Security, Performance) |
|
|
95
|
+
| `timeout` | 300s | Maximum execution time |
|
|
96
|
+
| `tier` | balanced | Council tier (quick, balanced, high) |
|
|
97
|
+
|
|
98
|
+
## Output Schema
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"verdict": "pass",
|
|
103
|
+
"confidence": 0.85,
|
|
104
|
+
"blocking_issues": [],
|
|
105
|
+
"rationale": "All models agreed...",
|
|
106
|
+
"exit_code": 0,
|
|
107
|
+
"transcript_path": ".council/logs/2025-12-31T..."
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Example Usage
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Basic gate check
|
|
115
|
+
council-gate --snapshot $(git rev-parse HEAD)
|
|
116
|
+
|
|
117
|
+
# Security-focused gate
|
|
118
|
+
council-gate --rubric-focus Security --confidence-threshold 0.9
|
|
119
|
+
|
|
120
|
+
# Quick tier for faster feedback
|
|
121
|
+
council-gate --tier quick --timeout 60
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Progressive Disclosure
|
|
125
|
+
|
|
126
|
+
- **Level 1**: This metadata (~200 tokens)
|
|
127
|
+
- **Level 2**: Full instructions above (~800 tokens)
|
|
128
|
+
- **Level 3**: See `references/ci-cd-rubric.md` for CI/CD-specific scoring
|
|
129
|
+
|
|
130
|
+
## Related Skills
|
|
131
|
+
|
|
132
|
+
- `council-verify`: General verification
|
|
133
|
+
- `council-review`: Code review with feedback
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# CI/CD Quality Gate Rubrics
|
|
2
|
+
|
|
3
|
+
Detailed scoring guidelines for LLM Council CI/CD quality gates. Each dimension uses a 1-10 scale with pipeline-specific behavioral anchors.
|
|
4
|
+
|
|
5
|
+
## Core Dimensions
|
|
6
|
+
|
|
7
|
+
### Accuracy (Weight: 30%)
|
|
8
|
+
|
|
9
|
+
Measures correctness of changes and absence of regressions.
|
|
10
|
+
|
|
11
|
+
| Score | Anchor | Description |
|
|
12
|
+
|-------|--------|-------------|
|
|
13
|
+
| 9-10 | **Excellent** | No regressions; all changes correct; passes all validation |
|
|
14
|
+
| 7-8 | **Good** | Minor issues that don't affect production; mostly correct |
|
|
15
|
+
| 5-6 | **Mixed** | Some issues present but core functionality intact |
|
|
16
|
+
| 3-4 | **Poor** | Significant issues; would cause production problems |
|
|
17
|
+
| 1-2 | **Critical** | Breaking changes; would cause outage or data loss |
|
|
18
|
+
|
|
19
|
+
**CI/CD Accuracy Checks:**
|
|
20
|
+
- No breaking API changes without versioning
|
|
21
|
+
- Database migrations are reversible
|
|
22
|
+
- Configuration changes are valid
|
|
23
|
+
- Dependency updates are compatible
|
|
24
|
+
- Environment variables are documented
|
|
25
|
+
|
|
26
|
+
**Accuracy Ceiling Rule**: Per ADR-016, accuracy acts as a ceiling on overall scores:
|
|
27
|
+
- Accuracy < 5: Overall score capped at 4.0 (blocking issues)
|
|
28
|
+
- Accuracy 5-6: Overall score capped at 7.0 (needs fixes)
|
|
29
|
+
- Accuracy ≥ 7: No ceiling applied
|
|
30
|
+
|
|
31
|
+
### Completeness (Weight: 25%)
|
|
32
|
+
|
|
33
|
+
Measures coverage of pipeline requirements and validation.
|
|
34
|
+
|
|
35
|
+
| Score | Anchor | Description |
|
|
36
|
+
|-------|--------|-------------|
|
|
37
|
+
| 9-10 | **Comprehensive** | All checks pass; full test coverage; complete validation |
|
|
38
|
+
| 7-8 | **Adequate** | Main checks pass; good coverage; minor gaps |
|
|
39
|
+
| 5-6 | **Partial** | Core checks pass; some gaps in coverage |
|
|
40
|
+
| 3-4 | **Incomplete** | Major checks failing; significant gaps |
|
|
41
|
+
| 1-2 | **Minimal** | Most checks failing; minimal validation |
|
|
42
|
+
|
|
43
|
+
**Completeness Checks:**
|
|
44
|
+
- All required tests passing
|
|
45
|
+
- Lint/format checks pass
|
|
46
|
+
- Type checking passes
|
|
47
|
+
- Security scans complete
|
|
48
|
+
- Coverage thresholds met
|
|
49
|
+
- Documentation updated
|
|
50
|
+
|
|
51
|
+
### Clarity (Weight: 20%)
|
|
52
|
+
|
|
53
|
+
Measures clarity of changes for review and rollback.
|
|
54
|
+
|
|
55
|
+
| Score | Anchor | Description |
|
|
56
|
+
|-------|--------|-------------|
|
|
57
|
+
| 9-10 | **Crystal Clear** | Changes well-documented; easy to review/rollback |
|
|
58
|
+
| 7-8 | **Clear** | Good documentation; straightforward changes |
|
|
59
|
+
| 5-6 | **Acceptable** | Understandable with effort; some confusion |
|
|
60
|
+
| 3-4 | **Unclear** | Poor documentation; hard to understand changes |
|
|
61
|
+
| 1-2 | **Opaque** | No documentation; unclear purpose |
|
|
62
|
+
|
|
63
|
+
**Clarity Checks:**
|
|
64
|
+
- Commit messages are descriptive
|
|
65
|
+
- PR description explains changes
|
|
66
|
+
- Breaking changes documented
|
|
67
|
+
- Migration steps provided
|
|
68
|
+
- Rollback procedure clear
|
|
69
|
+
|
|
70
|
+
### Conciseness (Weight: 15%)
|
|
71
|
+
|
|
72
|
+
Measures change scope and deployment risk.
|
|
73
|
+
|
|
74
|
+
| Score | Anchor | Description |
|
|
75
|
+
|-------|--------|-------------|
|
|
76
|
+
| 9-10 | **Optimal** | Focused changes; minimal blast radius |
|
|
77
|
+
| 7-8 | **Efficient** | Well-scoped; manageable risk |
|
|
78
|
+
| 5-6 | **Adequate** | Some scope creep; moderate risk |
|
|
79
|
+
| 3-4 | **Verbose** | Too many changes; high risk |
|
|
80
|
+
| 1-2 | **Bloated** | Massive changes; extreme risk |
|
|
81
|
+
|
|
82
|
+
**Conciseness Checks:**
|
|
83
|
+
- Single responsibility changes
|
|
84
|
+
- No unrelated refactoring
|
|
85
|
+
- Feature flags for large changes
|
|
86
|
+
- Incremental rollout supported
|
|
87
|
+
- Reasonable diff size
|
|
88
|
+
|
|
89
|
+
### Relevance (Weight: 10%)
|
|
90
|
+
|
|
91
|
+
Measures alignment with deployment requirements.
|
|
92
|
+
|
|
93
|
+
| Score | Anchor | Description |
|
|
94
|
+
|-------|--------|-------------|
|
|
95
|
+
| 9-10 | **Perfectly Aligned** | Matches deployment criteria exactly |
|
|
96
|
+
| 7-8 | **Well Aligned** | Meets requirements with minor additions |
|
|
97
|
+
| 5-6 | **Somewhat Aligned** | Core requirements met, some tangents |
|
|
98
|
+
| 3-4 | **Misaligned** | Partially addresses wrong criteria |
|
|
99
|
+
| 1-2 | **Off Target** | Does not meet deployment criteria |
|
|
100
|
+
|
|
101
|
+
**Relevance Checks:**
|
|
102
|
+
- Matches release criteria
|
|
103
|
+
- Appropriate for target environment
|
|
104
|
+
- Follows deployment schedule
|
|
105
|
+
- No unauthorized changes
|
|
106
|
+
|
|
107
|
+
## Exit Code Determination
|
|
108
|
+
|
|
109
|
+
### Exit Code 0: PASS
|
|
110
|
+
|
|
111
|
+
Pipeline continues when ALL conditions met:
|
|
112
|
+
- Confidence ≥ threshold (default 0.7)
|
|
113
|
+
- No blocking issues
|
|
114
|
+
- All critical checks pass
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"verdict": "pass",
|
|
119
|
+
"exit_code": 0,
|
|
120
|
+
"action": "Deploy proceeds"
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Exit Code 1: FAIL
|
|
125
|
+
|
|
126
|
+
Pipeline fails when ANY condition met:
|
|
127
|
+
- Blocking issues present
|
|
128
|
+
- Critical security vulnerabilities
|
|
129
|
+
- Breaking changes detected
|
|
130
|
+
- Required checks failing
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"verdict": "fail",
|
|
135
|
+
"exit_code": 1,
|
|
136
|
+
"action": "Pipeline halted, fix required"
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Exit Code 2: UNCLEAR
|
|
141
|
+
|
|
142
|
+
Pipeline pauses for human review when:
|
|
143
|
+
- Confidence < threshold but no blocking issues
|
|
144
|
+
- Conflicting reviewer opinions
|
|
145
|
+
- Edge cases requiring judgment
|
|
146
|
+
- Insufficient context
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"verdict": "unclear",
|
|
151
|
+
"exit_code": 2,
|
|
152
|
+
"action": "Human review required"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Domain-Specific Focus Areas
|
|
157
|
+
|
|
158
|
+
### Security Focus
|
|
159
|
+
|
|
160
|
+
When `rubric_focus: Security` is specified:
|
|
161
|
+
|
|
162
|
+
**Additional Checks:**
|
|
163
|
+
- No secrets in code or config
|
|
164
|
+
- Dependencies free of CVEs
|
|
165
|
+
- Security headers configured
|
|
166
|
+
- Input validation present
|
|
167
|
+
- Authentication/authorization correct
|
|
168
|
+
- Encryption properly implemented
|
|
169
|
+
|
|
170
|
+
**Red Flags (automatic FAIL):**
|
|
171
|
+
- Hardcoded secrets or API keys
|
|
172
|
+
- Known vulnerable dependencies (CVSS ≥ 7.0)
|
|
173
|
+
- Disabled security features
|
|
174
|
+
- SQL injection vulnerabilities
|
|
175
|
+
- Missing authentication
|
|
176
|
+
|
|
177
|
+
### Performance Focus
|
|
178
|
+
|
|
179
|
+
When `rubric_focus: Performance` is specified:
|
|
180
|
+
|
|
181
|
+
**Additional Checks:**
|
|
182
|
+
- No N+1 query introductions
|
|
183
|
+
- Bundle size within limits
|
|
184
|
+
- API response time acceptable
|
|
185
|
+
- Database query efficiency
|
|
186
|
+
- Memory usage reasonable
|
|
187
|
+
- Cache strategy appropriate
|
|
188
|
+
|
|
189
|
+
**Red Flags (automatic FAIL):**
|
|
190
|
+
- >50% regression in response time
|
|
191
|
+
- Memory leak potential
|
|
192
|
+
- Unbounded resource usage
|
|
193
|
+
- Missing pagination
|
|
194
|
+
|
|
195
|
+
### Compliance Focus
|
|
196
|
+
|
|
197
|
+
When `rubric_focus: Compliance` is specified:
|
|
198
|
+
|
|
199
|
+
**Additional Checks:**
|
|
200
|
+
- Audit logging present
|
|
201
|
+
- Data retention policies followed
|
|
202
|
+
- PII handling correct
|
|
203
|
+
- Access controls enforced
|
|
204
|
+
- License compliance met
|
|
205
|
+
|
|
206
|
+
**Red Flags (automatic FAIL):**
|
|
207
|
+
- GDPR/HIPAA/SOC2 violations
|
|
208
|
+
- Missing audit trail
|
|
209
|
+
- Unauthorized data exposure
|
|
210
|
+
- License violations
|
|
211
|
+
|
|
212
|
+
## Scoring Calculation
|
|
213
|
+
|
|
214
|
+
### Weighted Average Formula
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
overall_score = (
|
|
218
|
+
accuracy * 0.30 +
|
|
219
|
+
completeness * 0.25 +
|
|
220
|
+
clarity * 0.20 +
|
|
221
|
+
conciseness * 0.15 +
|
|
222
|
+
relevance * 0.10
|
|
223
|
+
)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Confidence to Exit Code Mapping
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
def determine_exit_code(confidence, blocking_issues, threshold=0.7):
|
|
230
|
+
if blocking_issues:
|
|
231
|
+
return 1 # FAIL
|
|
232
|
+
elif confidence >= threshold:
|
|
233
|
+
return 0 # PASS
|
|
234
|
+
else:
|
|
235
|
+
return 2 # UNCLEAR
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Pipeline Integration Patterns
|
|
239
|
+
|
|
240
|
+
### GitHub Actions
|
|
241
|
+
|
|
242
|
+
```yaml
|
|
243
|
+
- name: Council Gate
|
|
244
|
+
id: gate
|
|
245
|
+
run: llm-council gate --snapshot ${{ github.sha }}
|
|
246
|
+
continue-on-error: true
|
|
247
|
+
|
|
248
|
+
- name: Handle Unclear
|
|
249
|
+
if: steps.gate.outcome == 'failure' && steps.gate.outputs.exit_code == '2'
|
|
250
|
+
run: gh pr comment --body "⚠️ Council requires human review"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### GitLab CI
|
|
254
|
+
|
|
255
|
+
```yaml
|
|
256
|
+
council-gate:
|
|
257
|
+
script:
|
|
258
|
+
- llm-council gate --snapshot $CI_COMMIT_SHA
|
|
259
|
+
allow_failure:
|
|
260
|
+
exit_codes:
|
|
261
|
+
- 2 # UNCLEAR triggers manual approval
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Azure DevOps
|
|
265
|
+
|
|
266
|
+
```yaml
|
|
267
|
+
- task: Bash@3
|
|
268
|
+
displayName: 'Council Gate'
|
|
269
|
+
inputs:
|
|
270
|
+
targetType: 'inline'
|
|
271
|
+
script: |
|
|
272
|
+
llm-council gate --snapshot $(Build.SourceVersion)
|
|
273
|
+
if [ $? -eq 2 ]; then
|
|
274
|
+
echo "##vso[task.setvariable variable=needsReview]true"
|
|
275
|
+
fi
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Blocking Issues
|
|
279
|
+
|
|
280
|
+
Issues that automatically trigger FAIL (exit code 1):
|
|
281
|
+
|
|
282
|
+
### Critical Severity
|
|
283
|
+
- Security vulnerabilities (CVSS ≥ 7.0)
|
|
284
|
+
- Data loss potential
|
|
285
|
+
- Production-breaking changes
|
|
286
|
+
- Compliance violations
|
|
287
|
+
|
|
288
|
+
### Major Severity
|
|
289
|
+
- Required tests failing
|
|
290
|
+
- Missing security controls
|
|
291
|
+
- Performance regressions >50%
|
|
292
|
+
- Breaking API changes
|
|
293
|
+
|
|
294
|
+
## Transcript Format
|
|
295
|
+
|
|
296
|
+
All gate decisions include audit trail:
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
{
|
|
300
|
+
"verification_id": "abc123",
|
|
301
|
+
"timestamp": "2025-12-31T12:00:00Z",
|
|
302
|
+
"snapshot_id": "git-sha",
|
|
303
|
+
"verdict": "pass",
|
|
304
|
+
"confidence": 0.85,
|
|
305
|
+
"exit_code": 0,
|
|
306
|
+
"rubric_scores": {
|
|
307
|
+
"accuracy": 8.5,
|
|
308
|
+
"completeness": 8.0,
|
|
309
|
+
"clarity": 9.0,
|
|
310
|
+
"conciseness": 8.5,
|
|
311
|
+
"relevance": 9.0
|
|
312
|
+
},
|
|
313
|
+
"blocking_issues": [],
|
|
314
|
+
"reviewers": ["model-a", "model-b", "model-c"],
|
|
315
|
+
"consensus_method": "borda_count",
|
|
316
|
+
"transcript_path": ".council/logs/2025-12-31T12-00-00-abc123/"
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Rollback Support
|
|
321
|
+
|
|
322
|
+
When a gate fails after deployment:
|
|
323
|
+
|
|
324
|
+
1. **Transcript Available**: Full deliberation saved for post-mortem
|
|
325
|
+
2. **Snapshot Pinning**: Exact code state preserved
|
|
326
|
+
3. **Issue List**: Specific problems identified
|
|
327
|
+
4. **Remediation Hints**: Suggestions for fixes
|
|
328
|
+
|
|
329
|
+
## Example Gate Output
|
|
330
|
+
|
|
331
|
+
```json
|
|
332
|
+
{
|
|
333
|
+
"verdict": "fail",
|
|
334
|
+
"confidence": 0.72,
|
|
335
|
+
"exit_code": 1,
|
|
336
|
+
"rubric_scores": {
|
|
337
|
+
"accuracy": 5.5,
|
|
338
|
+
"completeness": 7.0,
|
|
339
|
+
"clarity": 8.0,
|
|
340
|
+
"conciseness": 8.5,
|
|
341
|
+
"relevance": 9.0
|
|
342
|
+
},
|
|
343
|
+
"weighted_score": 7.15,
|
|
344
|
+
"accuracy_ceiling_applied": true,
|
|
345
|
+
"final_score": 7.0,
|
|
346
|
+
"blocking_issues": [
|
|
347
|
+
{
|
|
348
|
+
"severity": "critical",
|
|
349
|
+
"category": "security",
|
|
350
|
+
"message": "Dependency lodash@4.17.15 has known prototype pollution vulnerability (CVE-2019-10744)",
|
|
351
|
+
"remediation": "Upgrade to lodash@4.17.21 or later"
|
|
352
|
+
}
|
|
353
|
+
],
|
|
354
|
+
"rationale": "Security vulnerability in dependencies blocks deployment. Recommend upgrading lodash before proceeding."
|
|
355
|
+
}
|
|
356
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: council-review
|
|
3
|
+
description: |
|
|
4
|
+
Multi-model code review with structured feedback using LLM Council peer evaluation.
|
|
5
|
+
Use for PR reviews, code quality checks, or implementation review.
|
|
6
|
+
Keywords: code review, PR, pull request, quality check, peer review, feedback
|
|
7
|
+
|
|
8
|
+
license: Apache-2.0
|
|
9
|
+
compatibility: "llm-council >= 2.0, mcp >= 1.0"
|
|
10
|
+
metadata:
|
|
11
|
+
category: code-review
|
|
12
|
+
domain: software-engineering
|
|
13
|
+
council-version: "2.0"
|
|
14
|
+
author: amiable-dev
|
|
15
|
+
repository: https://github.com/amiable-dev/llm-council
|
|
16
|
+
|
|
17
|
+
allowed-tools: "Read Grep Glob mcp:llm-council/verify mcp:llm-council/audit"
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Council Code Review Skill
|
|
21
|
+
|
|
22
|
+
Get multiple AI perspectives on code changes with structured, actionable feedback.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
- Review pull requests before merging
|
|
27
|
+
- Get code quality feedback on implementations
|
|
28
|
+
- Identify potential issues across multiple dimensions
|
|
29
|
+
- Validate changes against coding standards
|
|
30
|
+
|
|
31
|
+
## Workflow
|
|
32
|
+
|
|
33
|
+
1. **Prepare Input**: Provide file paths or git diff
|
|
34
|
+
2. **Invoke Review**: Call `mcp:llm-council/verify` with code-review rubric
|
|
35
|
+
3. **Process Feedback**: Receive structured scores and issue list
|
|
36
|
+
4. **Address Issues**: Fix blocking issues before proceeding
|
|
37
|
+
|
|
38
|
+
## Input Formats
|
|
39
|
+
|
|
40
|
+
Supports both:
|
|
41
|
+
- `file_paths`: List of files to review (full file analysis)
|
|
42
|
+
- `git_diff`: Unified diff format for change-focused review
|
|
43
|
+
- `snapshot_id`: Git commit SHA (required for reproducibility)
|
|
44
|
+
|
|
45
|
+
## Rubric (ADR-016)
|
|
46
|
+
|
|
47
|
+
| Dimension | Weight | Focus |
|
|
48
|
+
|-----------|--------|-------|
|
|
49
|
+
| Accuracy | 35% | Correctness, no bugs, logic errors |
|
|
50
|
+
| Completeness | 20% | All requirements addressed |
|
|
51
|
+
| Clarity | 20% | Readable, maintainable code |
|
|
52
|
+
| Conciseness | 15% | No unnecessary complexity |
|
|
53
|
+
| Relevance | 10% | Addresses stated requirements |
|
|
54
|
+
|
|
55
|
+
## Output Schema
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"verdict": "pass|fail|unclear",
|
|
60
|
+
"confidence": 0.82,
|
|
61
|
+
"rubric_scores": {
|
|
62
|
+
"accuracy": 7.5,
|
|
63
|
+
"completeness": 8.0,
|
|
64
|
+
"clarity": 9.0,
|
|
65
|
+
"conciseness": 8.5,
|
|
66
|
+
"relevance": 9.0
|
|
67
|
+
},
|
|
68
|
+
"blocking_issues": [
|
|
69
|
+
{
|
|
70
|
+
"severity": "major",
|
|
71
|
+
"file": "src/api.py",
|
|
72
|
+
"line": 42,
|
|
73
|
+
"message": "Missing input validation"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"suggestions": [...],
|
|
77
|
+
"rationale": "Overall, the code is well-structured..."
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Example Usage
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Review specific files
|
|
85
|
+
council-review --file-paths "src/main.py,src/utils.py" --snapshot abc123
|
|
86
|
+
|
|
87
|
+
# Review git diff
|
|
88
|
+
council-review --git-diff "$(git diff HEAD~1)" --snapshot $(git rev-parse HEAD)
|
|
89
|
+
|
|
90
|
+
# Review with custom focus
|
|
91
|
+
council-review --rubric-focus Security --file-paths "src/auth.py"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Progressive Disclosure
|
|
95
|
+
|
|
96
|
+
- **Level 1**: This metadata (~200 tokens)
|
|
97
|
+
- **Level 2**: Full instructions above (~800 tokens)
|
|
98
|
+
- **Level 3**: See `references/code-review-rubric.md` for detailed scoring anchors
|
|
99
|
+
|
|
100
|
+
## Related Skills
|
|
101
|
+
|
|
102
|
+
- `council-verify`: General verification
|
|
103
|
+
- `council-gate`: CI/CD quality gate
|