Dependency inventory¶
Status: state after implementation first, then the audit baseline for spec 042. Re-inspected 2026-11-10 at commit 00d1ed4, after the dependency upgrades in #419–#431. The first audit was 2026-09-06 at 3e59e1d. This is a declaration, import and lockfile audit. It is not a measured clean-install footprint. Versions come from uv.lock; upstream "latest" claims are dated and sourced in the selection evidence.
State after implementation (2026-11-10)¶
Written from pyproject.toml and uv.lock at commit 536cad9, the tip of the 042 stack after T23. The sections below this one record the audit that led to the work and are not rewritten. Where they disagree with this section, this section is current.
Result: Semantic Kernel, azure-ai-evaluation and evaluate are in no install profile. The lock has 329 [[package]] entries (376 before the work, 347 after the Semantic Kernel removal). The base install resolves 143 packages (264 before). Measured sizes and start-up times are in the baseline measurements. requires-python is >=3.11.
Base install ([project].dependencies, 35 declarations)¶
| Dependency | Purpose |
|---|---|
pydantic, pyyaml, jinja2, python-dotenv, click, inquirerpy |
Agent models and validation, YAML, templates, environment files, the CLI and its prompts |
jsonschema[format-nongpl], referencing, lark, bkflow-feel, python-ulid |
Schema gates, FEEL decision tables, identifiers |
claude-agent-sdk (pinned) |
Claude backend (Anthropic and Ollama providers) |
litellm |
Embeddings and contextual-retrieval chat |
mcp (>=1.30.0,<3) |
MCP servers and bridges |
fastapi, starlette, uvicorn[standard], ag-ui-protocol, werkzeug |
holodeck serve and the AG-UI protocol |
opentelemetry-sdk, opentelemetry-exporter-otlp-proto-grpc, opentelemetry-exporter-otlp-proto-http |
Telemetry and OTLP export |
markitdown[pdf,docx,pptx,xlsx], openpyxl, pandas, pdfminer.six, python-pptx, pypdf |
File parsing for retrieval and multimodal inputs |
tiktoken |
Token counts for the plain text splitter |
rank-bm25 |
The in-process BM25 index used for lexical and hybrid search |
httpx, aiohttp, urllib3, authlib, azure-core, cryptography |
HTTP clients, authentication and transport (several carry security lower bounds) |
The base install carries no vector store client, no evaluation library, no optimizer and no docs or release tooling.
Extras ([project.optional-dependencies])¶
| Extra | Installs | Feature |
|---|---|---|
eval |
deepeval, anthropic, ollama |
DeepEval metrics and judge models |
nlp |
nltk, rouge-score, sacrebleu |
BLEU, ROUGE and METEOR |
optimizer |
optuna |
holodeck test optimize |
opensearch |
opensearch-py |
OpenSearch keyword index |
qdrant, chromadb, postgres, pinecone, weaviate, azure-ai-search, azure-cosmos |
One native client each (qdrant-client, chromadb, psycopg[binary,pool] and pgvector, pinecone 10, weaviate-client, azure-search-documents and azure-identity, azure-cosmos) |
Vector store providers |
vectorstores |
All seven store extras | All vector stores |
openai-agents |
openai-agents, openai 3 |
OpenAI and Azure OpenAI backend |
dashboard |
dash, plotly, pandas |
holodeck test view |
temporal |
temporalio |
Temporal worker and activities |
deploy, deploy-aws, deploy-gcp, deploy-azure, deploy-all |
docker, boto3, google-cloud-run, azure-mgmt-appcontainers and azure-identity |
holodeck deploy and its targets |
s3, azure-blob, all-sources |
boto3, azure-storage-blob |
Remote file sources |
otel-prometheus, otel-azmon, otel-all, claude-otel |
Exporters and the Claude Agent SDK instrumentation | Extra telemetry |
all |
Every runtime extra above | Everything except dev |
dev |
Test, lint and type tools, mkdocs-material, mkdocstrings, twine, audit tools |
Development only |
A command that needs a missing extra stops early and prints the install command (MissingExtraError).
Removed¶
- Semantic Kernel and what only it needed:
azure-ai-agents,azure-ai-projects,aiortc,av,scipy,openapi-core,pranceand others. Thefaiss,sql-serverandazure-cosmos-mongoproviders went with it. - Microsoft AI evaluation (
azure-ai-evaluation,ruamel-yaml) and Hugging Faceevaluate(withdatasets,pyarrow,dill,multiprocess,xxhash). markitdown[all]: ten packages, among themazure-ai-documentintelligence,azure-ai-contentunderstanding,youtube-transcript-api,speechrecognitionandpydub.- Unused or duplicate direct declarations:
requests(HTTPX replaces it),aiofiles,python-dateutil,absl-py,ml-dtypes, the stalesentry-sdkconstraint. - Moved out of the base install: DeepEval,
anthropic,ollama, NLTK,rouge-score,sacrebleu,optuna,opensearch-py(now extras);mkdocs-materialandtwine(nowdevonly). - Dependabot ignore for Pinecone majors, and the
tool.uv.prereleasesetting.
Constraints still in [tool.uv]¶
override-dependencies:pytz>=2024.bkflow-feelpinspytz<2024, which would downgradepytzandoptuna; the FEEL conformance tests intests/unit/workflow/cover the newerpytz.constraint-dependencies(23 entries) are security lower bounds on transitive packages, each with its advisory in a comment inpyproject.toml:filelock,jaraco-context,nltk,pillow,protobuf,python-multipart,markdown,pygments,aiohttp,pyjwt,pip,msgpack,pydantic-settings,joserfc,soupsieve,setuptools,pymdown-extensions,anyio,certifi,fsspec,multidict,oauthlib,opentelemetry-api. Remove one when the packages that need it require a fixed version themselves.- No cap comes from Semantic Kernel any more.
mcpallows 2.x (locked 2.3.0) andpineconeis 10.x. One cap comes from a client:weaviate-clientneedsgrpcio<1.80, so the lock holdsgrpcio1.78.2 for it. - Known issue: the locked
pypdfium25.15.1 is yanked on PyPI (reason given there: closing of remaining objects on interpreter exit is broken); 5.15.2 exists. See the technical debt tracker.
Audit baseline before the work¶
The rest of this file is the audit as it stood at 00d1ed4.
What changed since 2026-09-06¶
requires-pythonis now>=3.11(was>=3.10). CI runs 3.11 and 3.13. FR-006 must be read against 3.11.- Upgraded: openai-agents 0.17 → 0.24 with openai 3, LiteLLM 1.88 → 1.108, DeepEval 3.8 → 4.3, claude-agent-sdk 0.2.82 → 0.2.179, chromadb → 1.5, temporalio 1.32 → 1.35, opensearch-py 2 → 3, dash 3 → 4, twine 6 → 7, azure-mgmt-appcontainers 4 → 5, pypdf 6 → 7, optuna 4 → 5, MarkItDown 0.1.5b1 → 0.1.9 (stable), Semantic Kernel 1.43 → 1.47.
- SK is now the only package that holds back
mcp2 (it requiresmcp<2.0) and newer Pinecone (~=7.0). Both native agent SDKs allowmcp<3. - The CLI imports each command lazily (#430), so a heavy dependency no longer slows unrelated commands. Profile isolation (FR-005) still needs installed-wheel tests.
- The lock has 370 packages. The base install (core dependencies only) resolves 269; all extras resolve 368.
Measured removal effect on the base install¶
Computed from uv.lock by removing a root and counting packages that nothing else in the base install requires. These are package counts, not bytes or import time (FR-008 still requires those).
| Root removed | Packages that leave the base install |
|---|---|
semantic-kernel |
26 |
markitdown[all] → selective extras |
up to 26 (depends on the extras kept) |
deepeval → evaluation profile |
17 |
mkdocs-material → docs tooling |
14 |
twine → release tooling |
14 |
evaluate |
5 |
azure-ai-evaluation |
3 |
| SK + azure-ai-evaluation + evaluate + mkdocs-material + twine together | 71 (269 → 198) |
Direct runtime declarations¶
All 50 [project].dependencies declarations are accounted for. "No import" is evidence for review, not proof that a dependency is safe to remove: dynamic loading, upstream requirements and security constraints must be checked. Paths are relative to src/holodeck/ unless stated otherwise.
| Dependency constraint | Locked version | Observed role | Proposed disposition |
|---|---|---|---|
requests>=2.32.5,<3.0.0 |
2.34.2 |
lib/file_processor.py, services/mcp_registry.py. |
Move both sites to HTTPX and drop the direct declaration. No blocker found; set follow_redirects=True, because HTTPX does not follow redirects by default. Requests stays in the graph through MarkItDown, tiktoken, DeepEval and OpenAI Agents. |
pydantic>=2.11.0 |
2.13.5 |
46 source files: models, config validation, backend output, workflow and serving. | Retain as HoloDeck schema/contract boundary. SK caps pydantic<2.14; the cap goes away with SK. |
pyyaml>=6.0.0 |
6.0.3 |
Config loader/manager, templates, workflows, optimizer output. | Retain. |
click>=8.3.3,<9.0.0 |
8.3.3 |
13 CLI source files. Commands load lazily since #430. | Retain; preserve security lower bound. |
jinja2>=3.0.0,<4.0.0 |
3.1.6 |
lib/template_engine.py, deploy/dockerfile.py. |
Retain. |
python-dotenv>=1.0.0 |
1.2.4 |
cli/main.py. |
Retain. |
python-dateutil>=2.8.0 |
2.9.0.post0 |
No import in src/ or tests/. Required by bkflow-feel, botocore, opensearch-py and others. |
Remove the direct declaration; it stays as a transitive dependency. |
urllib3>=2.8.0,<3.0.0 |
2.8.0 |
No direct source import; security floor. | Move the floor to resolver constraints and published-wheel policy; do not lose it. |
cryptography>=50.0.0,<51.0.0 |
50.0.2 |
No direct source import; security floor. | Same as urllib3: keep the floor, review where it is declared. |
mkdocs-material>=9.7.7,<10.0.0 |
9.8.1 |
Documentation tooling; no runtime import. Brings 14 packages that nothing else needs. | Move out of runtime into docs tooling. |
twine>=6.2.0,<8.0.0 |
7.0.0 |
Release tooling; no runtime import. Brings 14 packages that nothing else needs. 7.x reads metadata 2.5 wheels (#431). | Move out of runtime into release tooling. |
jsonschema[format-nongpl]>=4.18.0,<5.0.0 |
4.26.0 |
lib/workflow/edge.py, native backend output validation. |
Retain format-nongpl extra and >=4.18 registry semantics. |
referencing>=0.36.0,<1.0.0 |
0.36.2 |
lib/workflow/edge.py. |
Retain explicit direct dependency. |
lark>=1.1.0,<2.0.0 |
1.3.1 |
lib/workflow/feel.py. |
Retain explicit direct dependency. |
semantic-kernel>=1.39.4,<2.0.0 |
1.47.0 |
Two importing files: lib/vector_store.py (record contracts, 11 dynamically imported connectors) and lib/text_chunker.py. Also telemetry helper names, logging namespaces and 10 test files. Brings 26 packages that nothing else needs (aiortc, av, azure-ai-agents, azure-ai-projects, scipy, openapi-core, prance, pybars4 and others). Its metadata caps mcp<2.0, pydantic<2.14 and pinecone~=7.0. |
Remove. Replace with HoloDeck-owned adapters on native store clients and an in-house tiktoken splitter; see the selection evidence. |
markitdown[all]>=0.1.4,<0.2.0 |
0.1.9 |
lib/file_processor.py. Now a stable release (was 0.1.5b1). [all] brings 26 packages that nothing else needs, including audio/speech, YouTube, Azure Document Intelligence and azure-ai-contentunderstanding>=1.2.0b1, which has only prerelease versions. |
Retain MarkItDown; replace [all] with [pdf,docx,pptx,xlsx] (add xls/outlook only on evidence). Base MarkItDown still requires magika, which pulls onnxruntime. Declare directly imported openpyxl, pdfminer.six and python-pptx. Verify with format fixtures (FR-021). |
pypdf>=6.21.4 |
7.0.0 |
lib/pdf_processor/page_extractor.py. Now on 7.x. |
Retain; preserve security floor. |
azure-ai-evaluation>=1.13.0,<2.0.0 |
1.18.11 |
lib/evaluators/azure_ai.py. Own closure is 61 packages; only 3 are exclusive (msrest, oauthlib, requests-oauthlib). |
Remove completely (FR-030–031, AC-13). Unchanged decision. |
evaluate>=0.4.6,<0.5.0 |
0.4.6 |
lib/evaluators/nlp_metrics.py: only ROUGE and METEOR use evaluate.load, which fetches metric scripts from the Hugging Face Hub at first use. No release since 2025-09. Brings datasets, pyarrow, dill, multiprocess, xxhash. |
Remove. Call rouge_score and NLTK METEOR directly; freeze fixtures first to prove equal scores (FR-025). Drops the datasets and pyarrow constraints if no other package needs them. |
aiofiles>=25.1.0,<26.0.0 |
25.1.0 |
No import in src/ or tests/; only HoloDeck requires it. |
Remove. |
rouge-score>=0.1.2,<0.2.0 |
0.1.2 |
ROUGE backend, reached through evaluate today. Last release 2022, sdist only; requires absl-py, nltk, numpy, six. |
Retain and call directly. No maintained drop-in found. |
absl-py>=2.3.1,<3.0.0 |
2.5.1 |
No direct import; rouge-score already requires it. | Remove the direct declaration. |
sacrebleu>=2.5.1,<3.0.0 |
2.6.0 |
lib/evaluators/nlp_metrics.py, called directly for BLEU. |
Retain. |
anthropic>=0.72.0,<2.7.0 |
2.6.0 |
No import in src/ or tests/; only HoloDeck requires it. DeepEval does not declare it. The <2.7.0 cap excludes 2.7.0, which moves to httpx2. |
Remove after a Claude backend and DeepEval-on-Anthropic test run without it. |
ollama>=0.4,<1.0 |
0.6.3 |
No import in src/ or tests/; only HoloDeck requires it. |
Remove after Ollama runtime and embedding tests run without it. |
deepeval>=4.3.3,<5 |
4.3.3 |
Eight evaluator modules under lib/evaluators/deepeval/. Now 4.x. Still requires pytest, pytest-asyncio, pytest-xdist, pytest-repeat, pytest-rerunfailures and posthog at runtime; no slim extra exists. No longer declares sentry-sdk. |
Retain (FR-025, AC-09). Move to an evaluation profile so the base host does not install pytest and posthog. |
python-ulid>=3.1.0,<5.0.0 |
4.1.0 |
Claude backend and serve sessions/protocols/models. Now 4.x. | Retain. |
ml-dtypes>=0.4.0,<0.7.0 |
0.6.0 |
No direct import; only HoloDeck requires it. Cap widened to <0.7 in #431. |
Remove the direct declaration unless a reverse dependency appears after SK removal. |
mcp>=1.30.0,<2 |
1.30.0 |
Consumed by native SDKs and tool bridges. Latest upstream is 2.3.0. SK requires mcp<2.0. claude-agent-sdk 0.2.179 and openai-agents 0.24.0 both allow mcp<3. |
Retain. Lift the <2 cap after SK removal, and only after the Claude backend passes on MCP 2: the manifest comment records a past Server.list_tools failure. |
inquirerpy>=0.3.4,<0.4.0 |
0.3.4 |
cli/utils/wizard.py. |
Retain. |
fastapi>=0.115.0,<1.0.0 |
0.162.2 |
serve/server.py, REST protocol, middleware, tool-init routes. |
Retain; consider explicit serving profile. |
starlette>=1.3.1 |
1.10.0 |
serve/middleware.py; also FastAPI/MCP dependency. |
Retain with security floor. |
uvicorn[standard]>=0.34.0,<1.0.0 |
0.54.0 |
cli/commands/serve.py. |
Retain. |
ag-ui-protocol>=0.1.18,<1.0.0 |
0.1.22 |
Chat executor, Claude backend, AG-UI server/protocol. Upstream 1.0 needs a multimodal migration (Dependabot #413). | Retain; 1.0 migration is separate work. |
werkzeug>=3.1.9 |
3.1.9 |
No direct import; security floor. Required by dash and flask (dashboard) and by openapi-core (SK). | Move the floor to the dashboard profile/constraints after SK removal. |
opentelemetry-sdk>=1.20.0,<2.0.0 |
1.45.2 |
Observability providers, exporters, serving, optimizer, SDK tracing. | Retain. |
opentelemetry-exporter-otlp-proto-grpc>=1.20.0,<2.0.0 |
1.45.2 |
lib/observability/exporters/otlp.py. |
Retain. |
opentelemetry-exporter-otlp-proto-http>=1.20.0,<2.0.0 |
1.45.2 |
lib/observability/exporters/otlp.py. |
Retain. |
rank-bm25>=0.2.2,<0.3.0 |
0.2.2 |
lib/keyword_search.py sparse fallback. Last release 2022; numpy only; works on Python 3.14. |
Retain. bm25s 0.3.16 is active but has no mode that reproduces BM25Okapi's idf floor, so rankings would change. Fallback if maintenance fails: vendor BM25Okapi (about 60 lines). |
opensearch-py>=2.0.0,<4.0.0 |
3.2.0 |
lib/keyword_search.py production keyword index. Now 3.x, verified against OpenSearch 2.19 (#431). |
Optionalize as a provider capability. |
tiktoken>=0.12.0 |
0.14.0 |
lib/structured_chunker.py, contextual generation paths. |
Retain; also the token counter for the replacement plain splitter. |
aiohttp>=3.14.4 |
3.14.5 |
No direct import; LiteLLM/DeepEval transport; security floor. | Keep the floor; review direct vs constraint scope. |
httpx>=0.27 |
0.28.1 |
lib/source_resolver.py. |
Retain; becomes the single HTTP client. |
authlib>=1.9.1 |
1.9.5 |
No direct import; only HoloDeck requires it. | Review: either a security floor for a dependency that has since left the graph, or dead. Remove if no reverse dependency remains. |
azure-core>=1.38.0 |
1.41.0 |
deploy/deployers/azure_containerapps.py, lib/source_resolver.py. |
Move with the Azure deploy/source capabilities. |
claude-agent-sdk==0.2.179 |
0.2.179 |
Claude backend, hooks, tool/MCP adapters, lib/claude_context_generator.py. |
Retain native agent execution and exact pin. |
python-frontmatter>=1.1,<2.0 |
1.3.0 |
lib/prompt_version.py. |
Retain. |
optuna>=4.8.0 |
5.0.0 |
optimizer/proposers/numeric.py. Now 5.x; brings sqlalchemy 2.1 and alembic. |
Optionalize with the optimizer. |
litellm>=1.108.3,<1.109 |
1.108.3 |
lib/litellm_support.py, lib/llm_context_generator.py, telemetry instrumentation. Pinned to one minor (<1.109). |
Retain as the embedding/context inference boundary. |
bkflow-feel==1.2.0 |
1.2.0 |
lib/workflow/feel.py. |
Retain exact pin. |
Optional capabilities¶
| Extra | Declared packages (locked) | Evidence and disposition |
|---|---|---|
dev |
pytest>=9.0.3 (9.2.0), pytest-cov>=4.1.0 (7.1.0), pytest-asyncio>=0.21.0 (1.4.1.post1), pytest-mock>=3.11.0 (3.17.0), pytest-xdist>=3.8.0 (3.8.0), black>=26.10.1 (26.10.1), ruff>=0.17.4 (0.17.4), mypy>=2.4.1 (2.4.1), pre-commit>=3.3.0 (4.7.0), tox>=4.0.0 (4.67.13), bandit[toml]>=1.8.0 (1.9.4), pip-audit>=2.7.0 (2.10.1), detect-secrets>=1.4.0 (1.5.0), types-PyYAML>=6.0.12 (6.0.12.20261103), mkdocstrings[python]>=0.25.0 (1.0.8), mkdocs-llmstxt>=0.4 (0.5.1) |
Tests, linters, type checking, security and docs tooling; keep separate from production profiles. |
pinecone |
pinecone[asyncio,grpc]~=7.0 (7.0.2.dev1) |
Held at 7.x only by SK (7.0.2.dev1, a dev build, is what the ~=7.0 pin resolves to; 7.1+ needs packaging<25). Latest client is 10.3.0. SK's connector fails to import with 8+. Dependabot ignores Pinecone majors until SK is removed. |
postgres |
psycopg[binary,pool]~=3.2 (3.3.8) |
SK connector plus native filtered reads in lib/collection_filter.py; preserve record layout and filters. |
qdrant |
qdrant-client>=1.18,<2.0 (1.20.0) |
Native async client in four files as well as the SK connector; live verify coverage. Preserve full-text hybrid/RRF and payload indexes. |
chromadb |
chromadb>=0.5,<1.6 (1.5.9) |
SK connector plus native client setup. Now 1.5.x with a live verify case (#425). SK caps chromadb<1.6. |
vectorstores |
pinecone[asyncio,grpc]~=7.0 (7.0.2.dev1), psycopg[binary,pool]~=3.2 (3.3.8), qdrant-client>=1.18,<2.0 (1.20.0), chromadb>=0.5,<1.6 (1.5.9) |
Convenience union of four provider extras; eleven connector names exist. |
otel-prometheus |
opentelemetry-exporter-prometheus>=0.60b0,<1.0.0 (0.66b2), prometheus-client>=0.17.0,<1.0.0 (0.26.0) |
Declared/configured; no exporter implementation module found. Must not claim installation yields a working exporter. |
otel-azmon |
azure-monitor-opentelemetry-exporter>=1.0.0b24,<2.0.0 (1.0.0b59) |
Declared/configured; no exporter implementation module found. Resolve supported status before packaging promise. |
otel-all |
opentelemetry-exporter-prometheus>=0.60b0,<1.0.0 (0.66b2), prometheus-client>=0.17.0,<1.0.0 (0.26.0), azure-monitor-opentelemetry-exporter>=1.0.0b24,<2.0.0 (1.0.0b59) |
Convenience group for the two exporters above; same implementation gap. |
claude-otel |
otel-instrumentation-claude-agent-sdk>=0.0.6,<0.1.0 (0.0.6) |
Lazily imported by the Claude backend; retain tracing/redaction behaviour. |
openai-agents |
openai-agents==0.24.0 (0.24.0), openai>=3,<4 (3.48.0) |
Native OpenAI/Azure backend. Now on the openai 3 stack (#424); openai is declared here, which closes the earlier hidden-import gap. |
dashboard |
dash>=3.0,<5.0 (4.5.0), plotly>=5.20,<8.0 (7.1.0), pandas>=2.0 (2.3.3) |
Dash 4 (#431), Plotly 7, pandas. Retain as a separate profile. |
deploy |
docker>=7.0.0 (7.2.0) |
Docker SDK used by deploy/builder.py. |
deploy-aws |
boto3>=1.42.0 (1.43.126) |
AWS deployer is unimplemented; boto3 is actually used by the S3 source resolver. |
s3 |
boto3>=1.42.0 (1.43.126) |
boto3 source resolution in lib/source_resolver.py. |
azure-blob |
azure-storage-blob>=12.19 (12.32.0b1) |
Azure Blob source resolution in lib/source_resolver.py. The lock resolves a beta (12.32.0b1) because prereleases are allowed. |
all-sources |
boto3>=1.42.0 (1.43.126), azure-storage-blob>=12.19 (12.32.0b1) |
Convenience union of implemented source resolvers. |
deploy-gcp |
google-cloud-run>=0.13.0 (0.16.1) |
GCP deployer is unimplemented; no google-cloud-run import found. |
deploy-azure |
azure-mgmt-appcontainers>=5.1.0,<6 (5.1.0), azure-identity>=1.15.0 (1.27.0) |
Implemented deploy/deployers/azure_containerapps.py; azure-mgmt-appcontainers moved to 5.x (#426). |
deploy-all |
docker>=7.0.0 (7.2.0), boto3>=1.42.0 (1.43.126), google-cloud-run>=0.13.0 (0.16.1), azure-mgmt-appcontainers>=5.1.0,<6 (5.1.0), azure-identity>=1.15.0 (1.27.0) |
Includes implemented Docker/Azure and unimplemented AWS/GCP declarations; resolve advertised support. |
temporal |
temporalio==1.35.0 (1.35.0) |
Durable activity/worker implementation; exact pin, moved to 1.35 with live tests (#431). |
Vector store providers: what works today¶
Checked in the full development environment (all extras installed) at 00d1ed4 by importing each SK connector module. "Repo use" counts files under sample/, docs/examples, docs/guides and templates that set the provider.
| Provider | SK connector imports | HoloDeck extra for the client | Repo use | Live verify |
|---|---|---|---|---|
qdrant |
Yes | qdrant |
10 | Yes |
chromadb |
Yes | chromadb |
22 | Yes |
postgres |
Yes | postgres |
8 | No |
pinecone |
Yes (7.x only) | pinecone |
4 | No |
in-memory |
Yes | none needed | 1 | No |
sql-server |
Yes (module only; needs pyodbc, not installed) |
none | 0 | No |
azure-ai-search |
No: azure.search missing |
none | 0 | No |
weaviate |
No: weaviate missing |
none | 0 | No |
faiss |
No: faiss missing |
none | 0 | No |
azure-cosmos-nosql |
No: azure.cosmos missing |
none | 0 | No |
azure-cosmos-mongo |
No: azure.cosmos missing |
none | 0 | No |
Six of the eleven provider names cannot run from any documented HoloDeck install. A user must install the client by hand. This is evidence for the provider-scope decision in the spec (FR-014); it is not a decision to retire them.
Build and dependency groups¶
- Build:
hatchling,hatch-vcs; retain VCS version/wheel behaviour. [dependency-groups].dev:pyasn1>=0.6.5,types-requests>=2.32.4.20250913,virtualenv>=21.14.9; distinct from the publisheddevextra. Reconcile contributor/CI install commands.tool.uv.prerelease = "allow": the manifest comment names SK'sazure-ai-agents. MarkItDown[all]also needs it (azure-ai-contentunderstandinghas only prereleases). The setting lets other packages resolve prereleases: the lock holdspinecone 7.0.2.dev1,azure-storage-blob 12.32.0b1,lxml 7.0.0b1andwrapt 1.17.4rc1. Removing SK and MarkItDown[all]should allowprerelease = "if-necessary-or-explicit"; OTel 0.x beta packages are explicit pins.tool.uv.override-dependencies:pytz>=2024overrides bkflow-feel's old cap. Preserve FEEL conformance evidence.- The published wheel carries no
readme, so the PyPI page has no description (twine warns). Fix with the packaging changes.
Hidden direct imports and transitive ownership¶
- Imported but not declared in core:
openpyxl,pdfminer,pptx(all through MarkItDown[all]),grpc(through the OTLP gRPC exporter),pandas(dashboard extra; in the base install it arrives only through azure-ai-evaluation andevaluate),weaviate(no extra). Each needs an owning declaration before its current carrier is removed. openaiis now declared in theopenai-agentsextra.semantic_kernelappears as imports in two source files, and as connector path strings, telemetry helper names (enable_semantic_kernel_telemetry), logging namespaces and default filter namespaces in six more. Import counting alone understates removal scope.
High-impact locked transitive clusters¶
| Root (locked) | Selected dependencies and implication |
|---|---|
semantic-kernel 1.47.0 |
Own closure 98 packages; 26 exclusive: aiortc, aioice, av, pylibsrtp, azure-ai-agents, azure-ai-projects, scipy, openapi-core, prance, pybars4, cloudevents and others. Caps mcp<2.0, pydantic<2.14. |
markitdown 0.1.9 with all |
26 exclusive: magika, onnxruntime, pdfminer-six, pdfplumber, python-pptx, openpyxl, mammoth, speechrecognition, pydub, youtube-transcript-api, azure-ai-documentintelligence, azure-ai-contentunderstanding (prerelease). |
azure-ai-evaluation 1.18.11 |
Own closure 61; only msrest, oauthlib, requests-oauthlib are exclusive. It is one of two carriers of pandas and NLTK into the base install. |
evaluate 0.4.6 |
datasets, pyarrow, dill, multiprocess, xxhash exclusive. Downloads metric scripts at runtime. |
deepeval 4.3.3 |
17 exclusive: pytest and four pytest plugins, posthog, questionary, pyfiglet, setuptools, wheel. |
litellm 1.108.3 |
9 exclusive: boto3/botocore/s3transfer, tokenizers, h2 stack. Keep one inference-owner boundary. |
optuna 5.0.0 |
sqlalchemy 2.1.8, alembic, mako, colorlog. sqlalchemy 2.1 conflicts with the LlamaIndex Postgres connector (sqlalchemy<2.1). |
claude-agent-sdk 0.2.179 / openai-agents 0.24.0 |
Both allow mcp<3. Retaining both native runtimes preserves shared packages after SK removal. |
Audit limits and acceptance implications¶
- This audit inspects declarations, AST import sites, dynamic connector paths, lock entries and connector imports in one developer environment. It does not certify that a provider is licensed, vulnerability-free or behaviour-compatible.
- Exclusive-package counts follow required dependencies and requested extras in
uv.lock. Platform markers are ignored, so a count can differ by one or two per platform. - Fresh isolated installs must exercise CLI, provider initialization, tool ingestion/retrieval, serving and evaluation profiles.
Non-Python hosting and build prerequisites¶
Sources: base image, local-wheel image, image generator, runtime validation, and Claude backend.
| Dependency | Inspected behavior | Disposition / owner |
|---|---|---|
| Python and Linux base image | Both Dockerfiles now use python:3.13-slim; published base defaults to latest PyPI HoloDeck when no version argument is supplied. |
Packaging: record supported Python/OS/architecture and immutable build inputs; test actual images. |
| Claude executable | Claude Agent SDK bundles a CLI binary; the backend runs it as a subprocess. Node is not required solely because the provider is Anthropic. | Backend: retain SDK executable provisioning, platform wheels, startup and lifecycle checks. |
| Node.js / NodeSource | Generator conditionally installs Node 22 through NodeSource; validator requires Node >=18 for MCP commands node, npx, yarn, or pnpm. Some generator comments still incorrectly attribute the need to Claude itself. |
Backend/packaging: preserve conditional installation, verify supported versions and bootstrap provenance; correct comments during implementation. |
| MCP launchers and server packages | Selected stdio tools may require Node package managers, uv/uvx, Python or other configured executables and server packages. These are agent-specific dependencies, not all universal requirements. |
Tool/deployment maintainers: inventory the selected agent's command/args and package versions, provide missing-launcher errors, do not install arbitrary user tool dependencies globally. |
uv |
Base images install via https://astral.sh/uv/install.sh; generated extras install uses --prerelease=allow. |
Packaging: pin/review bootstrap and resolver inputs; record the actual installed graph. |
curl, ca-certificates, bubblewrap, shell utilities |
Both base images install the first three. Curl supplies bootstrap and health checks; Dockerfile documents bubblewrap for Claude subprocess environment scrubbing. | Deployment/security: verify runtime need and platform support; preserve TLS, health and credential isolation. |
| Docker daemon / build engine and registry | Docker SDK drives image builds; generated images default to ghcr.io/justinbarias/holodeck-base:latest. |
Deployment: retain supported workflow, record base/agent digest, candidate version, extras and package/system manifest. |
| External services | Configured model APIs, vector stores, MCP servers, OTel collectors, optional OpenSearch/Temporal and cloud source/deployment services. | Respective adapter owners: compatibility and availability tests; distinguish service dependency from installed library. |
The generator currently installs unversioned holodeck-ai[extras] independently of the audited lock. This can change the candidate graph even after a successful local wheel test. FR-029/AC-11 require reproducible base, agent, and worker image identity and resolved dependency evidence. There is no repository-owned Node package.json outside ignored samples in this baseline; sample frontend dependencies are not universal hosting dependencies.
Ownership and disposition gates¶
Owners apply to the rows in their domain; the spec acceptance IDs are the exit gates. Unresolved dispositions stay open until those gates provide evidence.
| Domain | Owner | Gate |
|---|---|---|
| Config, CLI, native SDKs, MCP and shared utilities | Backend maintainers | AC-01–03; isolated imports and both native backend contracts |
| Retrieval, readers, tokenization and provider extras | Retrieval maintainers | AC-04–08; all-provider operations, stored data and format fixtures |
| HTTP, serving and deployment/source packages | Serving/deployment maintainers | AC-03/06/11; lifecycle, async I/O, actual deployer support |
| Evaluation and Optuna | Evaluation/optimizer maintainers | AC-09, AC-13; retain DeepEval and deterministic/code graders, remove Microsoft/legacy evaluation, verify migration and optional installs |
| OTel, exporter extras and telemetry dependencies | Observability maintainers | AC-10; actual exporter implementation, routing and redaction |
| Security floors, transitive-only declarations, docs/release/build/dev and profile resolution | Packaging/security maintainers | AC-01/02/11/12; reverse graph, clean wheels and reviewed constraints |
| FEEL/Temporal/schema primitives | Workflow maintainers | AC-09; conformance, replay and sandbox safety |
Complete resolver constraints¶
These are current declarations (28; 20 at the first audit), not newly verified vulnerability claims. uv constraints do not constrain a downstream pip installation of a published wheel.
| Constraint | Proposed disposition / gate |
|---|---|
sentry-sdk>=2.0.0,<3.0.0 |
Stale: sentry-sdk is no longer in the lock (DeepEval 4 dropped it). Remove after confirming no profile resolves it. |
filelock>=4.2.1 |
Retain until AC-11 reviews the candidate graph. |
jaraco-context>=6.1.0 |
Retain until AC-11 reviews the candidate graph. |
nltk>=3.10.4 |
Still needed: rouge-score requires NLTK, and METEOR uses it. The scoped security exception stays. |
pyopenssl>=26.0.0 |
Retain until AC-11 reviews the candidate graph. |
pillow>=13.0.0 |
Retain until AC-11 reviews the candidate graph. |
protobuf>=5.29.6 |
Retain until AC-11 reviews the candidate graph. |
python-multipart>=0.0.31 |
Retain until AC-11 reviews the candidate graph. |
pyarrow>=23.0.1 |
Needed only while evaluate is installed; remove with it if no reverse dependency remains. |
markdown>=3.10.2 |
Retain until AC-11 reviews the candidate graph. |
pygments>=2.20.0 |
Retain until AC-11 reviews the candidate graph. |
aiohttp>=3.14.4 |
Retain until AC-11 reviews the candidate graph. |
pyjwt>=2.15.0 |
Retain until AC-11 reviews the candidate graph. |
pip>=26.1.2 |
Retain until AC-11 reviews the candidate graph. |
msgpack>=1.2.3 |
Retain until AC-11 reviews the candidate graph. |
pydantic-settings>=2.14.2 |
Retain until AC-11 reviews the candidate graph. |
joserfc>=1.7.6 |
Retain until AC-11 reviews the candidate graph. |
soupsieve>=2.8.4 |
Retain until AC-11 reviews the candidate graph. |
setuptools>=84.1.0 |
Retain until AC-11 reviews the candidate graph. |
pymdown-extensions>=11.0.0 |
Retain until AC-11 reviews the candidate graph. |
anyio>=4.14.2 |
Retain until AC-11 reviews the candidate graph. |
certifi>=2026.10.18 |
Retain until AC-11 reviews the candidate graph. |
dnspython>=2.9.0 |
Retain until AC-11 reviews the candidate graph. |
fsspec>=2026.6.0 |
Retain until AC-11 reviews the candidate graph. |
multidict>=6.9.1 |
Retain until AC-11 reviews the candidate graph. |
oauthlib>=4.0.1 |
Retain until AC-11 reviews the candidate graph. |
opentelemetry-api>=1.45.1 |
Retain until AC-11 reviews the candidate graph. |
datasets>=5.0.1 |
Needed only while evaluate is installed; remove with it if no reverse dependency remains. |
pyproject.toml and uv.lock remain the executable source of truth. Candidate changes must update this inventory with measured evidence.