Context
End-to-end regression against a live Ollama daemon (issue #11 GPU/CPU work merged in PR #155) ahead of the 0.1.1 release ("full production-level Ollama support"). Unit 109 passed, integration 3 passed, e2e 16 passed, ruff/mypy/format clean — but manual exercise of the public surface surfaced blocker bugs.
Blocker bugs (must fix before 0.1.1)
B1 — Cannot load/info/install any model not in the bundled catalog
LifecycleOrchestrator.load() (src/modeldock/core/lifecycle.py:61-62) and ModelManager.info()/install() validate every name against BundledRegistry, which only knows catalog entries (codellama, llama3, ...). A model already installed locally (llama2:latest, mistral:latest) is rejected with ModelNotFoundError.
md.load('llama2:latest') -> ModelNotFoundError
md.info('llama2:latest') -> ModelNotFoundError
modeldock load load llama2:latest -> same
modeldock info llama2 -> same
md.update('llama2:latest') -> same
A user who pulls a model outside ModelDock can never manage it. Fix: fall back to the runtime's installed refs when the catalog lookup misses.
B2 — cache.path() returns the literal string "<cache>"
CacheService.path() (src/modeldock/core/cache.py:36-39) calls get_record("__none__") and falls back to "<cache>". CachePort has no path() method (src/modeldock/ports/cache.py) and FilesystemCache never exposes _cache_dir. So md.cache.path() and modeldock cache path both print <cache>. Broken API.
High-severity
H1 — load() silently ignores the backend argument
src/modeldock/__init__.py:56-58: the if backend is not None: branch is dead — both branches call _manager().load(name, auto_install=auto_install) and never pass backend. Same dead-branch pattern in install/update/remove/verify (they take backend but ignore it).
H2 — SDK has no run() export
ModelManager.run() exists and modeldock run (CLI) works, but modeldock.run is missing from __all__ (src/modeldock/__init__.py). Public SDK surface is inconsistent with the CLI and the documented API in CONTEXT.md.
H3 — info() installed-tags feature (issue #10) is effectively dead
info() intersects installed refs with the catalog name, but the bundled catalog and locally-installed models share no names (catalog: codellama/llama3; installed: llama2/mistral/cloud). installed_tags is always [] for real installed models.
Medium / edge-case
- M1 —
remove() on a cloud model (tag contains cloud) is slow / can hang (>60s) before 404ing; should short-circuit with a clear error.
- M2 —
update() does remove() then pull() with no confirmation / size guard; re-downloads gigabytes.
- M3 —
FilesystemCache.clean() looks for {name}.bin artifacts that are never written, so it would wipe all manifest entries; cache manifest is also never populated by the Ollama flow (unreachable due to B1).
- M4 — Version not bumped:
__version__ and pyproject.toml still 0.1.0; need 0.1.1.
What works
installed(), list(), search(), categories(), recommend(), CLI run (streams tokens), GPU/CPU device detection (issue #11, integration test passes live), verify(). Quality gates clean.
Recommendation
Do not release 0.1.1 until B1 + B2 are fixed (small, well-scoped: catalog fallback + a path() on the cache port/adapter) and H1 + H2 are addressed. Then re-run the regression and bump to 0.1.1.
Context
End-to-end regression against a live Ollama daemon (issue #11 GPU/CPU work merged in PR #155) ahead of the 0.1.1 release ("full production-level Ollama support"). Unit 109 passed, integration 3 passed, e2e 16 passed, ruff/mypy/format clean — but manual exercise of the public surface surfaced blocker bugs.
Blocker bugs (must fix before 0.1.1)
B1 — Cannot load/info/install any model not in the bundled catalog
LifecycleOrchestrator.load()(src/modeldock/core/lifecycle.py:61-62) andModelManager.info()/install()validate every name againstBundledRegistry, which only knows catalog entries (codellama,llama3, ...). A model already installed locally (llama2:latest,mistral:latest) is rejected withModelNotFoundError.md.load('llama2:latest')-> ModelNotFoundErrormd.info('llama2:latest')-> ModelNotFoundErrormodeldock load load llama2:latest-> samemodeldock info llama2-> samemd.update('llama2:latest')-> sameA user who pulls a model outside ModelDock can never manage it. Fix: fall back to the runtime's installed refs when the catalog lookup misses.
B2 —
cache.path()returns the literal string"<cache>"CacheService.path()(src/modeldock/core/cache.py:36-39) callsget_record("__none__")and falls back to"<cache>".CachePorthas nopath()method (src/modeldock/ports/cache.py) andFilesystemCachenever exposes_cache_dir. Somd.cache.path()andmodeldock cache pathboth print<cache>. Broken API.High-severity
H1 —
load()silently ignores thebackendargumentsrc/modeldock/__init__.py:56-58: theif backend is not None:branch is dead — both branches call_manager().load(name, auto_install=auto_install)and never passbackend. Same dead-branch pattern ininstall/update/remove/verify(they takebackendbut ignore it).H2 — SDK has no
run()exportModelManager.run()exists andmodeldock run(CLI) works, butmodeldock.runis missing from__all__(src/modeldock/__init__.py). Public SDK surface is inconsistent with the CLI and the documented API in CONTEXT.md.H3 —
info()installed-tags feature (issue #10) is effectively deadinfo()intersects installed refs with the catalog name, but the bundled catalog and locally-installed models share no names (catalog: codellama/llama3; installed: llama2/mistral/cloud).installed_tagsis always[]for real installed models.Medium / edge-case
remove()on a cloud model (tagcontainscloud) is slow / can hang (>60s) before 404ing; should short-circuit with a clear error.update()doesremove()thenpull()with no confirmation / size guard; re-downloads gigabytes.FilesystemCache.clean()looks for{name}.binartifacts that are never written, so it would wipe all manifest entries; cache manifest is also never populated by the Ollama flow (unreachable due to B1).__version__andpyproject.tomlstill0.1.0; need0.1.1.What works
installed(),list(),search(),categories(),recommend(), CLIrun(streams tokens), GPU/CPU device detection (issue #11, integration test passes live),verify(). Quality gates clean.Recommendation
Do not release 0.1.1 until B1 + B2 are fixed (small, well-scoped: catalog fallback + a
path()on the cache port/adapter) and H1 + H2 are addressed. Then re-run the regression and bump to 0.1.1.