ananke-plexus 0.3.0__tar.gz → 0.3.2__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.
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/PKG-INFO +4 -1
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/README.md +2 -0
- ananke_plexus-0.3.2/docs/assets/ananke_plexus_architecture_overview.png +0 -0
- ananke_plexus-0.3.2/docs/assets/ananke_plexus_governed_software_architecture.png +0 -0
- ananke_plexus-0.3.2/docs/assets/branding/ananke-logo-offline.png +0 -0
- ananke_plexus-0.3.2/docs/assets/branding/ananke-logo.png +0 -0
- ananke_plexus-0.3.2/docs/assets/code_graph_intelligence_infographic.png +0 -0
- ananke_plexus-0.3.2/docs/assets/from_intent_to_implementation.png +0 -0
- ananke_plexus-0.3.2/docs/assets/governed_agentic_execution_pipeline.png +0 -0
- ananke_plexus-0.3.2/docs/assets/open_ecosystem_getting_started.png +0 -0
- ananke_plexus-0.3.2/docs/assets/verifiable_pipeline_for_autonomous_engineering.png +0 -0
- ananke_plexus-0.3.2/docs/assets/why_adlc_matters_governed_autonomous_development.png +0 -0
- ananke_plexus-0.3.2/docs/concepts/architecture.md +172 -0
- ananke_plexus-0.3.2/docs/concepts/bmad.md +196 -0
- ananke_plexus-0.3.2/docs/concepts/evaluation.md +147 -0
- ananke_plexus-0.3.2/docs/concepts/graph.md +201 -0
- ananke_plexus-0.3.2/docs/concepts/mcp-apm.md +246 -0
- ananke_plexus-0.3.2/docs/concepts/policy-security.md +220 -0
- ananke_plexus-0.3.2/docs/concepts/registry.md +302 -0
- ananke_plexus-0.3.2/docs/concepts/testing.md +85 -0
- ananke_plexus-0.3.2/docs/concepts/why-ananke.md +144 -0
- ananke_plexus-0.3.2/docs/guides/getting-started.md +303 -0
- ananke_plexus-0.3.2/docs/guides/implementation-log.md +145 -0
- ananke_plexus-0.3.2/docs/guides/registry-guide.md +332 -0
- ananke_plexus-0.3.2/docs/guides/release.md +156 -0
- ananke_plexus-0.3.2/docs/guides/setup-and-capabilities.md +289 -0
- ananke_plexus-0.3.2/docs/guides/workflows.md +124 -0
- ananke_plexus-0.3.2/docs/index.md +145 -0
- ananke_plexus-0.3.2/docs/reference/commands.md +298 -0
- ananke_plexus-0.3.2/docs/reference/configuration.md +121 -0
- ananke_plexus-0.3.2/docs/reference/eval-harness.md +308 -0
- ananke_plexus-0.3.2/docs/reference/policy.md +137 -0
- ananke_plexus-0.3.2/docs/reference/registry.md +355 -0
- ananke_plexus-0.3.2/docs/reference/test-harness.md +87 -0
- ananke_plexus-0.3.2/hatch_build.py +54 -0
- ananke_plexus-0.3.2/mkdocs.yml +93 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/pyproject.toml +12 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/cli/app.py +223 -0
- ananke_plexus-0.3.2/src/ananke/plexus/docs_site.py +164 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/base.py +14 -1
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/common.py +57 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/filesystem.py +119 -20
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/registry.py +25 -2
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/version.py +1 -1
- ananke_plexus-0.3.2/src/ananke/plexus/workflows/__init__.py +29 -0
- ananke_plexus-0.3.2/src/ananke/plexus/workflows/models.py +42 -0
- ananke_plexus-0.3.2/src/ananke/plexus/workflows/presets.py +128 -0
- ananke_plexus-0.3.2/src/ananke/plexus/workflows/runner.py +168 -0
- ananke_plexus-0.3.2/src/ananke/plexus/workflows/storage.py +68 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/.gitignore +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/LICENSE +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/NOTICE +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/ananke_plexus_architecture_overview.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/ananke_plexus_governed_software_architecture.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/branding/ananke-logo.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/code_graph_intelligence_infographic.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/from_intent_to_implementation.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/governed_agentic_execution_pipeline.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/open_ecosystem_getting_started.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/verifiable_pipeline_for_autonomous_engineering.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/assets/why_adlc_matters_governed_autonomous_development.png +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/__main__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/api.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/audit.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/bundle.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/cli.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/importers/copilot.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/installer.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/lockfile.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/manifest.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/provenance.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/resolver.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/apm/sandbox.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/architecture/calm.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/amazon_q.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/copilot.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/fake.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/generic_cli.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/hermes.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/adapters/kiro.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/capabilities.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/backends/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/cli/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/cli/rendering.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/credentials.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/loader.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/migration.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/config/secrets.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/contracts/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/contracts/architecture.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/contracts/behavior.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/contracts/bmad.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/contracts/model.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/core/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/core/ids.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/core/paths.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/core/result.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/core/workflow_audit.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/agentevals/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/agentevals/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/deepeval/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/deepeval/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/inspect_ai/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/inspect_ai/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/mlflow/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/mlflow/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/openevals/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/openevals/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/ragas/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/adapters/ragas/adapter.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/api.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/context.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/datasets/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/datasets/loader.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/datasets/validator.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/datasets/versioning.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/architecture/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/architecture/engineering.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/efficiency/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/efficiency/budget.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/meta/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/meta/calibration.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/multi_agent/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/multi_agent/coordination.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/outcome/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/outcome/exact.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/planning/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/planning/plan.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/resilience/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/resilience/recovery.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/retrieval/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/retrieval/rag.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/safety/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/safety/governance.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/tool_use/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/tool_use/tools.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/trajectory/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/evaluators/trajectory/matching.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/exceptions.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/judges/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/judges/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/judges/calibration.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/judges/ensemble.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/judges/gateway.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/baseline.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/case.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/dataset.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/report.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/rubric.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/score.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/suite.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/models/trace.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/policy/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/policy/decisions.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/policy/thresholds.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/regression/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/regression/compare.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/regression/policy.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/regression/statistics.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/reports/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/reports/console.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/reports/json.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/reports/junit.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/reports/markdown.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/runner.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/traces/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/traces/exporters.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/traces/importers.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/traces/normalize.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evals/traces/otel.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/events/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/events/bus.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/events/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/events/subscribers.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evidence/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evidence/bundle.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evidence/hash.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evidence/retention.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/evidence/sarif.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/approvals.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/checkpoint.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/compensation.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/plan.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/scheduler.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/execution/state.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/gates/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/gates/runner.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/code_review_graph.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/graphifyy.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/native.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/providers/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/graph/service.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/hooks/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/hooks/manager.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/hooks/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/hooks/runner.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/hooks/stages.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/adapters.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/compensation.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/confluence.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/evidence.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/git.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/http_client.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/issues.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/pr_evidence.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/scm.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/store.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/telemetry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/lifecycle/worktree.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/auth.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/http.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/prompts.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/resources.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/server.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/mcp/tools.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/plugins/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/plugins/discovery.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/plugins/metadata.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/policy/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/policy/engine.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/policy/packs.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/activation.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/bench.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/cache.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/cas.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/cli.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/compression.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/diff.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/assets.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/builder.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/markdown.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/model.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/render.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/docsgen/svg.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/duplicates.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/ed25519.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/errors.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/events.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/evidence.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/gc.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/hashing.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/framework.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/manifest.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/mcp.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/python_pkg.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/rust_crate.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/importers/vcs_archive.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/introspect.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/jsonschema_util.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/learn.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/lockfile.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/mcp_interface.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/payload.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/policy.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/portable.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/present.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/quality.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/remote.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/reports.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/resolver.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/schemas.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/search.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/secrets.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/semantic.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/semver.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/server.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/signing.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/sources.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/store.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/sync.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/tomlw.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/translate.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/verify.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/views.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/registry/watcher.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/lock.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/models.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/pipeline.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/providers/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/providers/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/providers/native.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/providers/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/providers/speckit.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/specs/service.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/base.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/cargo_fuzz.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/hypothesis.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/kani.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/mutmut.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/nextest.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/pytest.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/adapters/schemathesis.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/api.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/compilers/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/compilers/spec.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/context.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/discovery.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/evidence.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/contract.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/fuzz.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/performance.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/profile.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/property.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/result.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/security.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/state.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/suite.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/models/test.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/policy/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/policy/gates.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/policy/thresholds.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/registry.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/__init__.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/console.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/json.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/junit.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/markdown.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/reports/sarif.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/runner.py +0 -0
- {ananke_plexus-0.3.0 → ananke_plexus-0.3.2}/src/ananke/plexus/testing/selection.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ananke-plexus
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: A local-first ADLC control plane for governed agentic software engineering.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Neo-Pragnya/Ananke-Plexus
|
|
6
6
|
Project-URL: Documentation, https://neo-pragnya.github.io/Ananke-Plexus/
|
|
@@ -55,6 +55,7 @@ Requires-Dist: pytest>=8; extra == 'all'
|
|
|
55
55
|
Requires-Dist: watchfiles>=0.21; extra == 'all'
|
|
56
56
|
Requires-Dist: zstandard>=0.22; extra == 'all'
|
|
57
57
|
Provides-Extra: dev
|
|
58
|
+
Requires-Dist: hatchling>=1.26; extra == 'dev'
|
|
58
59
|
Requires-Dist: mypy>=1.15; extra == 'dev'
|
|
59
60
|
Requires-Dist: pre-commit>=4; extra == 'dev'
|
|
60
61
|
Requires-Dist: pytest-asyncio>=0.25; extra == 'dev'
|
|
@@ -770,6 +771,8 @@ ananke doctor [--json] # environment diagnostics
|
|
|
770
771
|
ananke verify # full local gate suite
|
|
771
772
|
ananke config show # show effective config
|
|
772
773
|
ananke config migrate [--apply] # migrate config schema
|
|
774
|
+
ananke docs build | serve # offline docs site (bundled — no PyPI/GitHub needed)
|
|
775
|
+
ananke workflow install-pack setup && ananke workflow run setup # bundle commands, run together
|
|
773
776
|
```
|
|
774
777
|
|
|
775
778
|
### `ananke spec` — specification lifecycle
|
|
@@ -623,6 +623,8 @@ ananke doctor [--json] # environment diagnostics
|
|
|
623
623
|
ananke verify # full local gate suite
|
|
624
624
|
ananke config show # show effective config
|
|
625
625
|
ananke config migrate [--apply] # migrate config schema
|
|
626
|
+
ananke docs build | serve # offline docs site (bundled — no PyPI/GitHub needed)
|
|
627
|
+
ananke workflow install-pack setup && ananke workflow run setup # bundle commands, run together
|
|
626
628
|
```
|
|
627
629
|
|
|
628
630
|
### `ananke spec` — specification lifecycle
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# System Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Ananke Plexus follows a **core + ports + adapters** hexagonal architecture. The stable center contains Ananke's governance semantics. External tooling remains fully replaceable.
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
flowchart TB
|
|
9
|
+
subgraph Entry["👤 Entrypoints"]
|
|
10
|
+
CLI["⌨️ ananke CLI"]
|
|
11
|
+
APMCLI["📦 apm CLI"]
|
|
12
|
+
HOOKS["🪝 Git Hooks"]
|
|
13
|
+
MCP["🔌 MCP Clients"]
|
|
14
|
+
CI["⚙️ CI/CD"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subgraph Core["⚖️ Ananke Core"]
|
|
18
|
+
CONFIG["⚙️ Config"]
|
|
19
|
+
POLICY["🛡️ Policy Engine"]
|
|
20
|
+
EXEC["🤖 Execution Director"]
|
|
21
|
+
EVENTS["📡 Event Bus"]
|
|
22
|
+
TELEMETRY["📊 Telemetry"]
|
|
23
|
+
PERM["🔐 Permissions"]
|
|
24
|
+
STATE["🔁 Run State Machine"]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
subgraph Domain["🧠 Domain Subsystems"]
|
|
28
|
+
SPEC["📜 Spec / BMAD"]
|
|
29
|
+
CALM["🏗️ CALM Architecture"]
|
|
30
|
+
GRAPH["🕸️ Graph Intelligence"]
|
|
31
|
+
APM["📦 APM"]
|
|
32
|
+
REGISTRY["🗂️ Skill & Agent Registry"]
|
|
33
|
+
GATES["🧪 Verification Gates"]
|
|
34
|
+
EVIDENCE["🧾 Evidence"]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
subgraph Adapters["🔌 Adapters"]
|
|
38
|
+
JIRA["Jira"]
|
|
39
|
+
SCM["GitHub / Bitbucket"]
|
|
40
|
+
GRAPHIFY["Graphifyy"]
|
|
41
|
+
CRG["Code Review Graph"]
|
|
42
|
+
COPILOT["Copilot"]
|
|
43
|
+
Q["Amazon Q"]
|
|
44
|
+
KIRO["Kiro"]
|
|
45
|
+
HERMES["Hermes"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
Entry --> Core
|
|
49
|
+
Core --> Domain
|
|
50
|
+
Domain --> Adapters
|
|
51
|
+
Adapters -. Results .-> Domain
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Package layout
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
ananke-plexus/
|
|
60
|
+
└── src/ananke/plexus/
|
|
61
|
+
├── cli/ — Typer CLI entrypoints (ananke + apm)
|
|
62
|
+
├── core/ — IDs, result types, path helpers, workflow audit
|
|
63
|
+
├── config/ — Config models, loader, migration, secrets resolver
|
|
64
|
+
├── contracts/ — BMAD compiler: behavior, model, architecture
|
|
65
|
+
├── specs/ — Spec models, service, providers, lock, drift
|
|
66
|
+
├── architecture/ — CALM loader, validation, delta, Mermaid rendering
|
|
67
|
+
├── graph/ — Canonical graph models, providers (native/Graphifyy/CRG)
|
|
68
|
+
├── policy/ — Policy engine, rule schema, builtin packs
|
|
69
|
+
├── gates/ — Gate runner, adapters (ruff, mypy, pytest, semgrep...)
|
|
70
|
+
├── execution/ — Plan DAG, scheduler, checkpoint, approvals, compensation
|
|
71
|
+
├── backends/ — AgentBackend protocol, Copilot/Q/Kiro/Hermes/fake adapters
|
|
72
|
+
├── lifecycle/ — Git service, worktrees, Jira, Bitbucket, PR evidence
|
|
73
|
+
├── hooks/ — Git hook manager, stages, runner
|
|
74
|
+
├── mcp/ — MCP server, tools, resources, prompts, auth
|
|
75
|
+
├── apm/ — Skill manifests, registry, installer, sandbox, lockfile
|
|
76
|
+
├── evidence/ — Evidence bundle, SARIF 2.1.0, hash, retention (+ registry capability snapshot)
|
|
77
|
+
├── registry/ — Skill & Agent Registry: SQLite + content-addressed store, importers,
|
|
78
|
+
│ resolver, ananke.lock, activation, docs generator, HTTP server
|
|
79
|
+
├── evals/ — Enterprise evaluation harness: traces, evaluators, judges, regression
|
|
80
|
+
├── testing/ — Unified test & quality harness: adapters, profiles, quality gate
|
|
81
|
+
├── events/ — In-process event bus with JSONL audit log
|
|
82
|
+
├── telemetry/ — OpenTelemetry adapter, noop
|
|
83
|
+
└── plugins/ — Entry-point discovery, plugin metadata
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Design principles
|
|
89
|
+
|
|
90
|
+
### Local-first
|
|
91
|
+
|
|
92
|
+
Code, specs, graph state, verification, and evidence can remain entirely local. No hosted service is required.
|
|
93
|
+
|
|
94
|
+
### Ports and adapters
|
|
95
|
+
|
|
96
|
+
Every external integration is isolated behind a protocol/interface:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
GraphProvider → NativeGraphProvider | GraphifyyAdapter | CodeReviewGraphAdapter
|
|
100
|
+
AgentBackend → CopilotBackend | AmazonQBackend | KiroBackend | HermesBackend | FakeBackend
|
|
101
|
+
SCMPort → BitbucketAdapter | GitHubAdapter
|
|
102
|
+
IssuePort → JiraAdapter
|
|
103
|
+
ScannerPort → RuffAdapter | SemgrepAdapter | GitleaksAdapter | TrivyAdapter
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Immutable, content-addressed capabilities
|
|
107
|
+
|
|
108
|
+
Skills and agents live in the [registry](registry.md): every version is an immutable, hash-verified payload; mutable state (trust, channel, lifecycle) is separate and audited. Resolution is deterministic, policy-aware and explainable, and produces a reproducible `ananke.lock`.
|
|
109
|
+
|
|
110
|
+
### Fail closed for hard gates
|
|
111
|
+
|
|
112
|
+
When a configured hard gate cannot execute, the default result is **BLOCKED**, not "pass."
|
|
113
|
+
|
|
114
|
+
Soft gates return: `PASS | WARN | SKIPPED | UNAVAILABLE`
|
|
115
|
+
Hard gates return: `PASS | BLOCKED | ERROR`
|
|
116
|
+
|
|
117
|
+
### Evidence before mutation
|
|
118
|
+
|
|
119
|
+
Every mutating step records:
|
|
120
|
+
|
|
121
|
+
1. Requested intent
|
|
122
|
+
2. Policy decision
|
|
123
|
+
3. Preconditions
|
|
124
|
+
4. Execution result
|
|
125
|
+
5. Verification result
|
|
126
|
+
6. Artifact hashes
|
|
127
|
+
7. Audit record
|
|
128
|
+
|
|
129
|
+
### Capability discovery
|
|
130
|
+
|
|
131
|
+
Every backend declares a `BackendCapabilities` model. The orchestrator asks the registry for capabilities and constructs a compatible execution plan.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Configuration precedence
|
|
136
|
+
|
|
137
|
+
Highest wins:
|
|
138
|
+
|
|
139
|
+
1. CLI flags (`--project`, `--offline`, `--json`)
|
|
140
|
+
2. Process environment variables
|
|
141
|
+
3. `.ananke/config.local.toml`
|
|
142
|
+
4. `.ananke/config.toml`
|
|
143
|
+
5. User config
|
|
144
|
+
6. Built-in defaults
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Event system
|
|
149
|
+
|
|
150
|
+
Every subsystem emits typed domain events to an in-process event bus. Events are appended to `.ananke/evidence/*.jsonl` for audit trails.
|
|
151
|
+
|
|
152
|
+
Registry events (`artifact.registered`, `artifact.promoted`, `artifact.yanked`, `artifact.quarantined`, …) are also written to an append-only `registry_events` table.
|
|
153
|
+
|
|
154
|
+
Key events: `RequirementCaptured`, `SpecCreated`, `SpecLocked`, `GateCompleted`, `BackendInvoked`, `PullRequestCreated`, `EvidenceFinalized`, `ApprovalRequested`, `ApprovalGranted`
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Exit codes
|
|
159
|
+
|
|
160
|
+
| Code | Meaning |
|
|
161
|
+
|---|---|
|
|
162
|
+
| 0 | success |
|
|
163
|
+
| 1 | generic failure |
|
|
164
|
+
| 2 | invalid usage/config |
|
|
165
|
+
| 3 | policy blocked |
|
|
166
|
+
| 4 | verification failed |
|
|
167
|
+
| 5 | dependency/tool unavailable |
|
|
168
|
+
| 6 | integration failure |
|
|
169
|
+
| 7 | authentication/authorization |
|
|
170
|
+
| 8 | spec drift |
|
|
171
|
+
| 9 | architecture violation |
|
|
172
|
+
| 10 | cancelled |
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Ananke BMAD — Behavior, Model, Architecture
|
|
2
|
+
|
|
3
|
+
Within Ananke Plexus, **BMAD** means:
|
|
4
|
+
|
|
5
|
+
> **Behavior — Model — Architecture Driven Development**
|
|
6
|
+
|
|
7
|
+
These represent three distinct forms of engineering truth that must all align for a change to be considered proven.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart TB
|
|
11
|
+
SPEC["📜 Specification"]
|
|
12
|
+
B["🧪 Behavior<br/>What must happen?"]
|
|
13
|
+
M["🧱 Model<br/>What structures exist?"]
|
|
14
|
+
A["🏗️ Architecture<br/>How may they interact?"]
|
|
15
|
+
IMPL["💻 Implementation"]
|
|
16
|
+
|
|
17
|
+
SPEC --> B
|
|
18
|
+
SPEC --> M
|
|
19
|
+
SPEC --> A
|
|
20
|
+
|
|
21
|
+
B --> IMPL
|
|
22
|
+
M --> IMPL
|
|
23
|
+
A --> IMPL
|
|
24
|
+
|
|
25
|
+
IMPL -->|"Tests"| B
|
|
26
|
+
IMPL -->|"Schema Validation"| M
|
|
27
|
+
IMPL -->|"Graph Reconciliation"| A
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Compiling BMAD from a requirement
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Create a requirement with acceptance criteria
|
|
36
|
+
ananke spec create \
|
|
37
|
+
--id PROJ-101 \
|
|
38
|
+
--title "Add idempotent payment webhook" \
|
|
39
|
+
--acceptance "Duplicate events are deduplicated" \
|
|
40
|
+
--acceptance "Idempotency key is stored per transaction"
|
|
41
|
+
|
|
42
|
+
# Compile all BMAD artifacts
|
|
43
|
+
ananke bmad compile --feature-dir .ananke/specs/PROJ-101
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This produces:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
.ananke/specs/PROJ-101/
|
|
50
|
+
├── bmad.yaml — BMAD index
|
|
51
|
+
├── model-contract.yaml — API schema skeleton
|
|
52
|
+
├── architecture-contract.yaml — CALM + allow/deny rules
|
|
53
|
+
└── tests/
|
|
54
|
+
├── test_proj_101_behavior.py — Failing pytest skeleton
|
|
55
|
+
└── proj_101.feature — Gherkin scenarios
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Behavior contract
|
|
61
|
+
|
|
62
|
+
Behavior is expressed through failing tests and Gherkin scenarios. Every generated test records its full traceability chain:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
Requirement → Acceptance Criterion → Scenario → Test ID
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Generated pytest skeleton (`tests/test_proj_101_behavior.py`):
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
import pytest
|
|
72
|
+
|
|
73
|
+
# Traceability: PROJ-101 -> AC-1 -> test_ac_1_duplicate_events_are_deduplicated
|
|
74
|
+
@pytest.mark.requirement('PROJ-101')
|
|
75
|
+
@pytest.mark.ac('1')
|
|
76
|
+
def test_ac_1_duplicate_events_are_deduplicated() -> None:
|
|
77
|
+
"""AC-1: Duplicate events are deduplicated"""
|
|
78
|
+
# TODO: implement acceptance criterion assertion
|
|
79
|
+
pytest.fail('not implemented')
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Generated Gherkin feature:
|
|
83
|
+
|
|
84
|
+
```gherkin
|
|
85
|
+
Feature: Add idempotent payment webhook
|
|
86
|
+
# Requirement: PROJ-101
|
|
87
|
+
|
|
88
|
+
Scenario: AC-1 — Duplicate events are deduplicated
|
|
89
|
+
Given the system is in a known state
|
|
90
|
+
When the condition for AC-1 is met
|
|
91
|
+
Then the system satisfies the acceptance criterion
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Behavior principle
|
|
95
|
+
|
|
96
|
+
Never claim that an automatically generated test proves the requirement unless traceability exists. Every test records `Requirement → AC → Scenario → Test ID`.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Model contract
|
|
101
|
+
|
|
102
|
+
Model contracts define API schemas, event payloads, domain value objects, and compatibility rules.
|
|
103
|
+
|
|
104
|
+
Generated `model-contract.yaml`:
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
contract_id: model-proj-101
|
|
108
|
+
requirement_id: PROJ-101
|
|
109
|
+
title: Add idempotent payment webhook
|
|
110
|
+
schemas:
|
|
111
|
+
- name: proj-101_request
|
|
112
|
+
type: object
|
|
113
|
+
description: API request boundary for this requirement
|
|
114
|
+
- name: proj-101_response
|
|
115
|
+
type: object
|
|
116
|
+
description: API response boundary for this requirement
|
|
117
|
+
compatibility_policy: backward_compatible
|
|
118
|
+
boundary_types:
|
|
119
|
+
- api_request
|
|
120
|
+
- api_response
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Example domain model:
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
from pydantic import BaseModel
|
|
127
|
+
from datetime import datetime
|
|
128
|
+
from decimal import Decimal
|
|
129
|
+
from uuid import UUID
|
|
130
|
+
|
|
131
|
+
class PaymentWebhookPayload(BaseModel):
|
|
132
|
+
transaction_id: UUID
|
|
133
|
+
customer_id: UUID
|
|
134
|
+
amount: Decimal
|
|
135
|
+
currency: str
|
|
136
|
+
occurred_at: datetime
|
|
137
|
+
idempotency_key: str
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Architecture contract
|
|
143
|
+
|
|
144
|
+
Architecture contracts are checked against the CALM system document, graph provider facts, and component allow/deny rules.
|
|
145
|
+
|
|
146
|
+
Generated `architecture-contract.yaml`:
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
contract_id: arch-proj-101
|
|
150
|
+
requirement_id: PROJ-101
|
|
151
|
+
calm_ref: .ananke/architecture/system.calm.json
|
|
152
|
+
allowed_dependencies: []
|
|
153
|
+
denied_dependencies: []
|
|
154
|
+
invariant_ids: []
|
|
155
|
+
import_rules:
|
|
156
|
+
deny_cross_domain_imports: true
|
|
157
|
+
deny_circular_imports: true
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Verifying BMAD artifacts
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
ananke bmad verify --feature-dir .ananke/specs/PROJ-101
|
|
166
|
+
# exits 0 if all artifacts present, 4 if missing
|
|
167
|
+
|
|
168
|
+
ananke bmad show --feature-dir .ananke/specs/PROJ-101
|
|
169
|
+
# prints the bmad.yaml index
|
|
170
|
+
|
|
171
|
+
ananke bmad trace --feature-dir .ananke/specs/PROJ-101
|
|
172
|
+
# shows requirement → AC → test traceability
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## BMAD vs BMAD-METHOD
|
|
178
|
+
|
|
179
|
+
Ananke uses **Ananke BMAD** (Behavior, Model, Architecture) as its internal contract triad.
|
|
180
|
+
|
|
181
|
+
The external **BMAD-METHOD** ecosystem is separate. If supported, it lives under `ananke.plexus.integrations.bmad_method` to avoid semantic collision.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Drift detection
|
|
186
|
+
|
|
187
|
+
After locking the spec, Ananke detects when artifacts have changed:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
ananke spec lock --feature-dir .ananke/specs/PROJ-101
|
|
191
|
+
ananke spec diff --feature-dir .ananke/specs/PROJ-101
|
|
192
|
+
# → [] if no drift
|
|
193
|
+
# → ["HASH_MISMATCH:spec.md"] if spec changed after lock
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Drift types: `REQUIREMENT_DRIFT`, `SPEC_DRIFT`, `ARCHITECTURE_DRIFT`, `MODEL_DRIFT`, `POLICY_DRIFT`, `TOOLCHAIN_DRIFT`, `GRAPH_DRIFT`
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Enterprise Agent Evaluation Harness
|
|
2
|
+
|
|
3
|
+
The Ananke Plexus evaluation harness is the **quality-intelligence plane** of the ADLC. It provides enterprise-grade, runtime-neutral agent quality assurance — without making any single evaluation library a hard dependency.
|
|
4
|
+
|
|
5
|
+
## Design Philosophy
|
|
6
|
+
|
|
7
|
+
### Deterministic-First
|
|
8
|
+
Every native evaluator is deterministic: given identical inputs, it produces identical scores. Non-deterministic LLM judges are isolated behind the `JudgeGateway` and used only when no deterministic signal exists.
|
|
9
|
+
|
|
10
|
+
### Trace-Only Rescoring
|
|
11
|
+
Evaluations operate on `AgentTrace` — a canonical span model that normalises traces from Pydantic AI, Microsoft Agent Framework, Hermes, or any OTel-compliant system. You can **re-evaluate historical traces** without re-running the agent.
|
|
12
|
+
|
|
13
|
+
### Enterprise Dependency Policy
|
|
14
|
+
The core `ananke-plexus` package has zero evaluation-library dependencies. Every third-party adapter (`mlflow`, `deepeval`, `ragas`, etc.) is a **lazy import** activated only when the appropriate `[eval-*]` extra is installed:
|
|
15
|
+
|
|
16
|
+
| Extra | Activates |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `eval-otel` | OpenTelemetry trace export |
|
|
19
|
+
| `eval-mlflow` | MLflow experiment tracking (preferred enterprise backend) |
|
|
20
|
+
| `eval-deepeval` | DeepEval metrics |
|
|
21
|
+
| `eval-inspect` | Inspect AI |
|
|
22
|
+
| `eval-ragas` | Ragas RAG evaluators |
|
|
23
|
+
| `eval-openevals` | OpenEvals |
|
|
24
|
+
| `eval-agentevals` | AgentEvals trajectory matching |
|
|
25
|
+
| `eval-enterprise` | OTel + MLflow + jsonschema bundle |
|
|
26
|
+
|
|
27
|
+
## Canonical Trace Model
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from ananke.plexus.evals import AgentTrace, AgentSpan, SpanKind, Usage
|
|
31
|
+
|
|
32
|
+
trace = AgentTrace(
|
|
33
|
+
trace_id="t-001",
|
|
34
|
+
run_id="run-001",
|
|
35
|
+
runtime="pydantic-ai",
|
|
36
|
+
spans=[
|
|
37
|
+
AgentSpan(
|
|
38
|
+
span_id="s-001",
|
|
39
|
+
kind=SpanKind.TOOL,
|
|
40
|
+
name="read_file",
|
|
41
|
+
start_time=...,
|
|
42
|
+
end_time=...,
|
|
43
|
+
attributes={"file": "spec.md"},
|
|
44
|
+
)
|
|
45
|
+
],
|
|
46
|
+
usage=Usage(prompt_tokens=1200, completion_tokens=300, total_tokens=1500),
|
|
47
|
+
)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`SpanKind` values: `agent | model | planning | tool | retrieval | subagent | approval | verification | policy | filesystem | shell`
|
|
51
|
+
|
|
52
|
+
## Evaluation Domains
|
|
53
|
+
|
|
54
|
+
Ananke ships 80+ native evaluators across 9 quality dimensions:
|
|
55
|
+
|
|
56
|
+
| Domain | Example Evaluators |
|
|
57
|
+
|---|---|
|
|
58
|
+
| **Outcome** | ExactMatch, Regex, JsonEquality, SchemaConformance, TaskCompletion |
|
|
59
|
+
| **Trajectory** | StrictTrajectory, LoopDetection, ForbiddenStep, StepEfficiency |
|
|
60
|
+
| **Tool Use** | ToolSelection, ToolAllowlist, ToolDenylist, IdempotencyCheck |
|
|
61
|
+
| **Planning** | PlanCoverage, PlanDependency, PlanFeasibility, PlanAdherence |
|
|
62
|
+
| **Retrieval/RAG** | ContextPrecision, ContextRecall, Faithfulness, AnswerRelevance |
|
|
63
|
+
| **Safety/Governance** | PermissionBoundary, SecretLeakage, ApprovalGate, ShellPolicy |
|
|
64
|
+
| **Architecture** | SpecAdherence, BehaviorCoverage, ArchitectureConformance |
|
|
65
|
+
| **Efficiency** | TokenBudget, CostBudget, Latency, RetryCount, CacheEfficiency |
|
|
66
|
+
| **Resilience** | FailureRecognition, RecoveryPath, CheckpointUsage, Rollback |
|
|
67
|
+
|
|
68
|
+
Plus multi-agent (`DelegationAccuracy`, `HandoffCompleteness`) and meta-evaluation (`cohens_kappa`, `judge_human_agreement`, `detect_positional_bias`).
|
|
69
|
+
|
|
70
|
+
## Evaluation Status
|
|
71
|
+
|
|
72
|
+
Each `EvalScore` carries an `EvalStatus`:
|
|
73
|
+
|
|
74
|
+
| Status | Meaning |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `pass` | Meets threshold |
|
|
77
|
+
| `warn` | Marginal — review recommended |
|
|
78
|
+
| `review` | Human judgement required |
|
|
79
|
+
| `fail` | Below threshold |
|
|
80
|
+
| `error` | Evaluator threw an exception |
|
|
81
|
+
| `skipped` | Evaluator requires optional package not installed |
|
|
82
|
+
|
|
83
|
+
## Gate Policy
|
|
84
|
+
|
|
85
|
+
After evaluation, the policy engine converts `EvalScore[]` into an `EvalGateDecision`:
|
|
86
|
+
|
|
87
|
+
| Verdict | Meaning |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `PASS` | All hard requirements met |
|
|
90
|
+
| `WARN` | Soft thresholds missed; proceed with caution |
|
|
91
|
+
| `REVIEW` | Human approval required before merge |
|
|
92
|
+
| `BLOCK` | Hard failure; pipeline blocked |
|
|
93
|
+
|
|
94
|
+
Configure thresholds in `.ananke/evals/config.yaml`:
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
suites:
|
|
98
|
+
standard:
|
|
99
|
+
hard_fail_on: [safety, outcome]
|
|
100
|
+
warn_on: [efficiency, resilience]
|
|
101
|
+
pass_threshold: 0.8
|
|
102
|
+
warn_threshold: 0.6
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## LLM Judge Governance
|
|
106
|
+
|
|
107
|
+
The `EnterpriseJudgeGateway` ensures:
|
|
108
|
+
- Only approved providers are used (`azure | bedrock | anthropic | openai | local | custom`)
|
|
109
|
+
- Secret patterns are redacted before any text is sent to a provider
|
|
110
|
+
- Trusted rubrics are separated from untrusted agent output via `JudgeInputEnvelope.to_prompt()`
|
|
111
|
+
- Credentials are resolved from the Ananke secrets resolver — never hardcoded
|
|
112
|
+
|
|
113
|
+
## Baseline Regression
|
|
114
|
+
|
|
115
|
+
Compare a candidate run against an approved baseline:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
ananke eval baseline create --run my-run-id --id v1.0-baseline
|
|
119
|
+
ananke eval compare --baseline v1.0-baseline --run my-new-run
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Policy enforcement uses bootstrap confidence intervals to distinguish statistical noise from real regressions.
|
|
123
|
+
|
|
124
|
+
## Evidence Bundle
|
|
125
|
+
|
|
126
|
+
Every evaluation run writes a tamper-evident bundle:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
.ananke/evidence/<run-id>/eval/
|
|
130
|
+
scores.json # EvalScore[] with normalized values
|
|
131
|
+
policy-decision.json # EvalGateDecision
|
|
132
|
+
manifest.json # SHA-256 checksums
|
|
133
|
+
reports/
|
|
134
|
+
report.md # PR-ready Markdown table
|
|
135
|
+
summary.json # Machine-readable JSON
|
|
136
|
+
junit.xml # JUnit XML for CI integration
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## ADLC Integration
|
|
140
|
+
|
|
141
|
+
The evaluation harness is wired into the ADLC at the **Evaluation Gate**:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Spec → Plan → Implement → [Eval Gate] → Evidence → Deploy
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
When `gate_decision.blocks` is true, `ananke eval run` exits with code 1, blocking the pipeline. CI pipelines consume `junit.xml` for test result reporting.
|