Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@ This project follows [Semantic Versioning](https://semver.org/).

## [Unreleased]

## 0.4.4 - 2026-10-31

### Added

- Agentic Chaos 0.9.0 (roadmap v0.9 Resilience Probes & Resilience Score)
compatibility: `chaos.export_aios_run` passes a scored report's derived
`resilience_score` measurement and its probe/score producer extension
through unchanged (`tests/test_chaos_aios_export.py`). Probes, scoring and
run history stay Python/CLI capabilities; no new MCP tool, and hosted HTTP
still rejects `chaos.run_experiment`. See `docs/chaos-0.9.md`.

### Changed

- Hosted images pin `agentic-chaos==0.9.0` and `agentic-sidecar==0.9.1`;
`tests/test_hosted_image.py` requires Chaos 0.9.0 or later.

## 0.4.3 - 2026-10-31

### Added
Expand Down
37 changes: 36 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ and `chaos.export_aios_run` behave the same hosted as locally. Only

Both need `agenticlens>=0.7.0`; with an older install they return a clear
"unavailable" error and every other Lens tool keeps working. The hosted images
pin `agenticlens==0.11.0` (since MCP 0.4.3) and `agentic-chaos==0.8.0` (since MCP 0.3.13).
pin `agenticlens==0.11.0` (since MCP 0.4.3) and `agentic-chaos==0.9.0` (since MCP 0.4.4).

## AgenticLens 0.8.0 suite tools (MCP 0.3.9)

Expand Down Expand Up @@ -697,3 +697,38 @@ See [operator compatibility and ownership](docs/tower-0.8-live-operations.md) fo
periodic detection, durable alerts, acknowledgements and joined incident console
views. Existing native contracts and optional dependency ranges remain compatible;
no runtime or patch release is required here.

## Chaos 0.9.0 interoperability

Chaos 0.9.0 adds:

- resilience probes: `HttpProbe`, `ResponseQualityProbe`, `LatencyProbe` and
`FunctionProbe` check steady state before chaos, while faults are active and
after recovery. By default no fault is injected when a pre-chaos probe
fails; `require_steady_state=False` runs the chaos anyway and leaves the
score inconclusive
- a 0-100 resilience score built from recovery, probe, latency,
retry-efficiency and cost evidence, with per-fault verdicts. Components a
run cannot show (for example latency without a baseline) are left out and
the remaining weights renormalized. The score is inconclusive (`null`) after
a failed pre-chaos probe, for dry runs, when no fault fired, or when no
component can be computed
- a local run-history store for score trends, with `max_runs` and
`max_age_days` retention, and a `--min-score` CI gate
- probes and scoring on chaos workflows, experiment files and the pytest marker

Native event IDs and fault types are unchanged. `ChaosReport.probes`,
`ChaosReport.resilience` and the matching `WorkflowReport` fields are optional
and additive. When a score was computed, AIOS exports add a derived
`resilience_score` measurement; inconclusive runs export none. Probe results
and the score breakdown stay in the `io.deepagentlabs.agentic-chaos`
producer extension.

See the [v0.9 guide](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/docs/v0.9.md)
and the [offline demo](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/examples/chaos_resilience_demo.py).
The resilience score summarizes the evidence of one chaos run. It is not an
Evals score, a release-gate decision, a deployment health signal or proof of
containment. No new shared schema, automatic adapter or hosted execution
capability is introduced.

MCP 0.4.4 pins the published images to Chaos 0.9.0. `chaos.export_aios_run` passes the `resilience_score` measurement and the producer extension through unchanged, and the existing registry discovers faults. Probes, scoring and history are Python/CLI capabilities, not new MCP tools. Hosted HTTP continues to reject `chaos.run_experiment`, so the hosted service neither executes experiment targets nor calls probe endpoints.
35 changes: 35 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -872,3 +872,38 @@ and incident console views. Existing local authenticated tower.* investigation/r

See [compatibility and operator example](docs/tower-0.8-live-operations.md).
No sibling runtime change or patch release is required.

## Chaos 0.9.0 interoperability

Chaos 0.9.0 adds:

- resilience probes: `HttpProbe`, `ResponseQualityProbe`, `LatencyProbe` and
`FunctionProbe` check steady state before chaos, while faults are active and
after recovery. By default no fault is injected when a pre-chaos probe
fails; `require_steady_state=False` runs the chaos anyway and leaves the
score inconclusive
- a 0-100 resilience score built from recovery, probe, latency,
retry-efficiency and cost evidence, with per-fault verdicts. Components a
run cannot show (for example latency without a baseline) are left out and
the remaining weights renormalized. The score is inconclusive (`null`) after
a failed pre-chaos probe, for dry runs, when no fault fired, or when no
component can be computed
- a local run-history store for score trends, with `max_runs` and
`max_age_days` retention, and a `--min-score` CI gate
- probes and scoring on chaos workflows, experiment files and the pytest marker

Native event IDs and fault types are unchanged. `ChaosReport.probes`,
`ChaosReport.resilience` and the matching `WorkflowReport` fields are optional
and additive. When a score was computed, AIOS exports add a derived
`resilience_score` measurement; inconclusive runs export none. Probe results
and the score breakdown stay in the `io.deepagentlabs.agentic-chaos`
producer extension.

See the [v0.9 guide](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/docs/v0.9.md)
and the [offline demo](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/examples/chaos_resilience_demo.py).
The resilience score summarizes the evidence of one chaos run. It is not an
Evals score, a release-gate decision, a deployment health signal or proof of
containment. No new shared schema, automatic adapter or hosted execution
capability is introduced.

MCP 0.4.4 pins the published images to Chaos 0.9.0. `chaos.export_aios_run` passes the `resilience_score` measurement and the producer extension through unchanged, and the existing registry discovers faults. Probes, scoring and history are Python/CLI capabilities, not new MCP tools. Hosted HTTP continues to reject `chaos.run_experiment`, so the hosted service neither executes experiment targets nor calls probe endpoints.
8 changes: 5 additions & 3 deletions deploy/docker/Dockerfile.aws
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ FROM python:3.12-slim
WORKDIR /app
COPY pyproject.toml README.md ./
COPY src ./src
# Pairs: Lens 0.10.0 (diagnosis, suites, ModelFit, advisory routing),
# Chaos 0.8.0 (AIOS run export; extension carries call counts and workflow summaries),
# Pairs: Lens 0.11.0 (diagnosis, suites, ModelFit, advisory routing, optimization analysis),
# Chaos 0.9.0 (AIOS run export; extension carries call counts, workflow summaries, probe
# results and the resilience score, plus a derived resilience_score measurement),
# Sidecar 0.9.1,
# Evals 0.10.0 (the producer of the native report/gate schemas bundled for evals.validate_artifact;
# unchanged since 0.9.0) and of AIOS evaluation evidence that spec.validate_artifact checks.
# Chaos is installed for its exporter and fault catalog only; HTTP always
Comment on lines 11 to 12

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: both Dockerfiles' Pairs comments now describe Lens 0.11.0, Chaos 0.9.0 (including the resilience export) and Sidecar 0.9.1.

# rejects chaos.run_experiment, so no target script is ever executed here.
RUN pip install --no-cache-dir ".[http]" "agenticlens==0.11.0" "agentic-chaos==0.8.0" "agentic-evals==0.10.0" "agentic-sidecar==0.9.0"
RUN pip install --no-cache-dir ".[http]" "agenticlens==0.11.0" "agentic-chaos==0.9.0" "agentic-evals==0.10.0" "agentic-sidecar==0.9.1"
COPY scripts/fetch_schema_assets.py /tmp/fetch_schema_assets.py
RUN python /tmp/fetch_schema_assets.py /opt/workspace/ai-operations-spec
RUN useradd --create-home --uid 10001 mcp
Expand Down
8 changes: 5 additions & 3 deletions deploy/docker/Dockerfile.render
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ FROM python:3.12-slim
WORKDIR /app
COPY pyproject.toml README.md ./
COPY src ./src
# Pairs: Lens 0.10.0 (diagnosis, suites, ModelFit, advisory routing),
# Chaos 0.8.0 (AIOS run export; extension carries call counts and workflow summaries),
# Pairs: Lens 0.11.0 (diagnosis, suites, ModelFit, advisory routing, optimization analysis),
# Chaos 0.9.0 (AIOS run export; extension carries call counts, workflow summaries, probe
# results and the resilience score, plus a derived resilience_score measurement),
# Sidecar 0.9.1,
# Evals 0.10.0 (the producer of the native report/gate schemas bundled for evals.validate_artifact;
# unchanged since 0.9.0) and of AIOS evaluation evidence that spec.validate_artifact checks.
# Chaos is installed for its exporter and fault catalog only; HTTP always
Comment on lines 11 to 12

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: both Dockerfiles' Pairs comments now describe Lens 0.11.0, Chaos 0.9.0 (including the resilience export) and Sidecar 0.9.1.

# rejects chaos.run_experiment, so no target script is ever executed here.
RUN pip install --no-cache-dir ".[http]" "agenticlens==0.11.0" "agentic-chaos==0.8.0" "agentic-evals==0.10.0" "agentic-sidecar==0.9.0"
RUN pip install --no-cache-dir ".[http]" "agenticlens==0.11.0" "agentic-chaos==0.9.0" "agentic-evals==0.10.0" "agentic-sidecar==0.9.1"
COPY scripts/fetch_schema_assets.py /tmp/fetch_schema_assets.py
RUN python /tmp/fetch_schema_assets.py /opt/workspace/ai-operations-spec
RUN useradd --create-home --uid 10001 mcp
Expand Down
2 changes: 1 addition & 1 deletion deploy/docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ python3 scripts/build_container.py --target workspace --tag deep-agentic-core-mc

`workspace` is the default and needs sibling `agenticlens`, `agentic-chaos`
and `ai-operations-spec` checkouts. AWS and Render builds use this repository's
source, published `agenticlens==0.11.0` and `agentic-chaos==0.8.0`, and
source, published `agenticlens==0.11.0` and `agentic-chaos==0.9.0`, and
checksum-verified `ai-operations-spec` v0.5.1 assets (schemas plus the
conformance and compatibility catalogs) fetched by `scripts/fetch_schema_assets.py`.
Agentic Chaos is present only for its AIOS exporter and fault catalog; the HTTP
Expand Down
36 changes: 36 additions & 0 deletions docs/chaos-0.9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Chaos 0.9 compatibility

## Chaos 0.9.0 interoperability

Chaos 0.9.0 adds:

- resilience probes: `HttpProbe`, `ResponseQualityProbe`, `LatencyProbe` and
`FunctionProbe` check steady state before chaos, while faults are active and
after recovery. By default no fault is injected when a pre-chaos probe
fails; `require_steady_state=False` runs the chaos anyway and leaves the
score inconclusive
- a 0-100 resilience score built from recovery, probe, latency,
retry-efficiency and cost evidence, with per-fault verdicts. Components a
run cannot show (for example latency without a baseline) are left out and
the remaining weights renormalized. The score is inconclusive (`null`) after
a failed pre-chaos probe, for dry runs, when no fault fired, or when no
component can be computed
- a local run-history store for score trends, with `max_runs` and
`max_age_days` retention, and a `--min-score` CI gate
- probes and scoring on chaos workflows, experiment files and the pytest marker

Native event IDs and fault types are unchanged. `ChaosReport.probes`,
`ChaosReport.resilience` and the matching `WorkflowReport` fields are optional
and additive. When a score was computed, AIOS exports add a derived
`resilience_score` measurement; inconclusive runs export none. Probe results
and the score breakdown stay in the `io.deepagentlabs.agentic-chaos`
producer extension.

See the [v0.9 guide](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/docs/v0.9.md)
and the [offline demo](https://github.com/DeepAgentLabs/agentic-chaos/blob/v0.9.0/examples/chaos_resilience_demo.py).
The resilience score summarizes the evidence of one chaos run. It is not an
Evals score, a release-gate decision, a deployment health signal or proof of
containment. No new shared schema, automatic adapter or hosted execution
capability is introduced.

MCP 0.4.4 pins the published images to Chaos 0.9.0. `chaos.export_aios_run` passes the `resilience_score` measurement and the producer extension through unchanged, and the existing registry discovers faults. Probes, scoring and history are Python/CLI capabilities, not new MCP tools. Hosted HTTP continues to reject `chaos.run_experiment`, so the hosted service neither executes experiment targets nor calls probe endpoints.
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ nav:
- Unified Workflows: unified-workflows.md
- Chaos 0.7 Compatibility: chaos-0.7.md
- Chaos 0.8 Compatibility: chaos-0.8.md
- Chaos 0.9 Compatibility: chaos-0.9.md
- Evals CLI Compatibility: evals-0.8-cli.md
- Evals Report Contract: evals-report-contract.md
- Evals 0.9 Judge Reliability: evals-0.9-judge-reliability.md
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "deep-agentic-core-mcp"
version = "0.4.3"
version = "0.4.4"
description = "Unified MCP server for AgenticLens and Agentic Chaos workflows."
readme = "README.md"
requires-python = ">=3.10"
Expand Down
4 changes: 2 additions & 2 deletions server.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "io.github.DeepAgentLabs/deep-agentic-core-mcp",
"title": "Deep Agentic Core MCP",
"description": "Unified MCP server for AgenticLens and Agentic Chaos capabilities.",
"version": "0.4.3",
"version": "0.4.4",
"repository": {
"url": "https://github.com/DeepAgentLabs/mcp-server",
"source": "github"
Expand All @@ -12,7 +12,7 @@
{
"registryType": "pypi",
"identifier": "deep-agentic-core-mcp",
"version": "0.4.3",
"version": "0.4.4",
"transport": {
"type": "stdio"
}
Expand Down
2 changes: 1 addition & 1 deletion src/deep_agentic_core_mcp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

__all__ = ["__version__"]

__version__ = "0.4.3"
__version__ = "0.4.4"
46 changes: 46 additions & 0 deletions tests/test_chaos_aios_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,49 @@ async def test_export_tool_is_offered_over_remote_transport(

assert "chaos.export_aios_run" in names
assert "chaos.run_experiment" not in names


def _chaos_version() -> tuple[int, ...]:
from importlib.metadata import PackageNotFoundError, version

try:
return tuple(int(part) for part in version("agentic-chaos").split(".")[:2])
except (PackageNotFoundError, ValueError):
return (0, 0)


@pytest.mark.skipif(_chaos_version() < (0, 9), reason="resilience scores need agentic-chaos>=0.9")
async def test_export_tool_passes_the_chaos_resilience_score_through() -> None:
report = {
"id": "report-9",
"name": "scored",
"start_time": "2026-10-31T12:00:00Z",
"end_time": "2026-10-31T12:00:01Z",
"chaos_events": [
{
"id": "e1",
"fault_type": "rate_limit_storm",
"step_name": "llm",
"outcome": "errored",
"message": "429",
"timestamp": "2026-10-31T12:00:00.5Z",
}
],
"probes": [{"probe": "ping", "phase": "post", "status": "passed"}],
"resilience": {"version": "1.0", "score": 88, "status": "scored", "grade": "B"},
}

payload = await _call("chaos.export_aios_run", {"report": report, "session_id": "aios"})

assert payload["ok"] is True
run = payload["aios_run"]
measurements = {m["name"]: m for m in run["measurements"]}
assert measurements["resilience_score"] == {
"name": "resilience_score",
"value": 88,
"unit": "score",
"kind": "derived",
}
extension = run["extensions"]["io.deepagentlabs.agentic-chaos"]
assert extension["resilience"]["grade"] == "B"
assert extension["probes"][0]["probe"] == "ping"
8 changes: 4 additions & 4 deletions tests/test_hosted_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
# (agenticlens 0.7.0 adds lens.diagnose_run and lens.score_analysis; 0.8.0 adds
# lens.suite_from_traces and lens.suite_check; 0.9.0 adds lens.modelfit_recommend;
# 0.10.0 adds lens.routing_decide; 0.11.0 adds lens.optimization_analyze).
REQUIRED_PINS = {"agenticlens": (0, 11, 0), "agentic-chaos": (0, 5, 1)}
REQUIRED_PINS = {"agenticlens": (0, 11, 0), "agentic-chaos": (0, 9, 0)}

# Spec-root-relative paths the ai_operations_spec adapter reads.
SPEC_ASSETS = {
Expand All @@ -47,13 +47,13 @@ def test_standalone_images_pin_phase3_sibling_versions(dockerfile: str) -> None:
assert _version(match.group(1)) >= minimum, f"{dockerfile} pins {package} too old"


# Exact sibling releases the current hosted images ship (0.4.3: Lens 0.11.0, Chaos 0.8.0,
# Exact sibling releases the current hosted images ship (0.4.4: Lens 0.11.0, Chaos 0.9.0,
# Evals 0.10.0, whose native schemas are the 0.9.0 documents bundled here).
HOSTED_PINS = {
"agenticlens": "0.11.0",
"agentic-chaos": "0.8.0",
"agentic-chaos": "0.9.0",
"agentic-evals": "0.10.0",
"agentic-sidecar": "0.9.0",
"agentic-sidecar": "0.9.1",
}


Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading