Stop tracking personal workflow artifacts at repo root, add CI and MIT license, align README and agent skills with artifacts/ defaults, and enable Ruff in dev/CI so releases are verifiable without local-only runs. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
14 KiB
VLM Issues Report
Source: Professional code and documentation review (2026-05-25)
Scope: src/vlm/, tests/, README.md, CHANGELOG.md, CLAUDE.md, AGENTS.md, skills/, repository hygiene
Baseline cited in docs: pytest -q → 517 passed (see CHANGELOG.md 2026-05-21)
This document lists actionable issues by priority. Use it for triage, GitHub issues, or a cleanup sprint. Items marked strength are not bugs; they are recorded for balance.
Summary
| Priority | Count | Theme |
|---|---|---|
| P0 — Critical | 1 | Committed personal library data |
| P1 — High | 4 | CI, license, doc drift, release metadata |
| P2 — Medium | 5 | CLI structure, imports, HTTP ops, doc accuracy |
| P3 — Low | 6 | Tooling, product gaps, minor code notes |
| Strengths | 5 | Keep; do not regress |
Overall: Core pipeline, safety model, and test depth are strong. The main gap is repository and release discipline, not domain logic.
P0 — Critical
ISSUE-001: Personal library artifacts committed to Git
| Field | Value |
|---|---|
| Priority | P0 |
| Category | Security / privacy / repository hygiene |
| Status | Open |
Description
Git tracks 36 workflow artifact files at the repository root (excluding .kiro/settings/mcp.json and .markdownlint.json), including:
inventory.csv,inventory_*.csvidentities.json,identities_*.jsonanalysis.json,analysis_*.jsonplan.json,plan_*.json,plan_*_manual_review.csv
These files contain real library paths (e.g. /mnt/Downloads/...), filenames, release groups, and metadata for thousands of entries (e.g. identities.json reports 4726 files).
.gitignore ignores artifacts/ and runs/ but not legacy root-level CSV/JSON. CHANGELOG (2026-02-16) moved defaults to artifacts/ without removing tracked root files.
Impact
- Privacy exposure if the repo is shared or published
- Repository bloat and slow clones
- Confusion between “fixtures” and a live library snapshot
- Risk of accidental reuse of stale plans/inventories in production workflows
Evidence
git ls-files '*.json' '*.csv'
Recommended actions
- Stop tracking root artifacts:
git rm --cachedfor all workflow CSV/JSON at repo root (keep only intentional fixtures). - Expand
.gitignorefor patterns such as/inventory*.csv,/identities*.json,/analysis*.json,/plan*.json,/plan*_manual_review.csvat repository root. - Add minimal synthetic fixtures under
tests/fixtures/if tests need sample artifacts. - If the repo was ever public, treat paths and titles as already exposed; consider
git filter-repofor history rewrite only if required. - Document migration in README: default outputs live under
artifacts/; do not commit generated files.
Acceptance criteria
git ls-filesshows no personal inventory/identity/analysis/plan artifacts at repo root.- CI and docs reference
artifacts/(orworkspace_dir) only. - Clone size and sensitive path leakage materially reduced.
P1 — High
ISSUE-002: No continuous integration
| Field | Value |
|---|---|
| Priority | P1 |
| Category | Release engineering |
| Status | Open |
Description
There is no .github/workflows/ (or equivalent) running tests on push/PR. The project claims 517 passing tests in README and CHANGELOG, but verification depends on local runs.
Impact
Regressions in safety-critical paths (executor, planner, path boundaries) can merge undetected.
Recommended actions
- Add a workflow: install with
uv, runuv run pytest -q. - Optional matrix: Python 3.10, 3.11, 3.12.
- Fail PRs on test failure; badge in README optional.
Acceptance criteria
- Every PR runs the full test suite automatically.
ISSUE-003: Missing license and placeholder release metadata
| Field | Value |
|---|---|
| Priority | P1 |
| Category | Legal / open source readiness |
| Status | Open |
Description
README.mdends with[Add your license here].pyproject.tomlhas nolicense,authors, orproject.urls.- README links use placeholders (
yourusername/video-library-manager).
Impact
Unclear redistribution terms; blocks confident external contributions and packaging.
Recommended actions
- Choose and add
LICENSE(e.g. MIT, Apache-2.0). - Set
licenseandproject.urlsinpyproject.toml. - Replace placeholder GitHub URLs in README.
Acceptance criteria
- License file present; README and pyproject agree on license identifier.
ISSUE-004: Documentation fragmentation and drift
| Field | Value |
|---|---|
| Priority | P1 |
| Category | Documentation |
| Status | Open |
Description
Multiple overlapping guides exist with inconsistent sync dates and paths:
| Document | Sync note | Drift |
|---|---|---|
README.md |
2026-04-07, 517 tests | Long; some tree/commands outdated |
CLAUDE.md |
2026-04-07 | Overlaps README command lists |
AGENTS.md |
2026-04-07 | Overlaps dev commands |
skills/vlm-library-workflow/SKILL.md |
2026-02-16 | Uses root inventory.csv paths, not artifacts/ |
README Development section suggests pytest without consistently documenting uv run pytest (project standard in CLAUDE.md).
README project tree omits modules that exist: duplicate_resolve.py, plan_review.py, plan_render.py, review_display.py, review_tui.py, transaction.py, cli_helpers.py, etc.
Recommended actions
- Single “documentation status” line driven by
CHANGELOG.md. - Short README → link to
docs/user-guide.md(optional split). - Update
skills/vlm-library-workflow/toartifacts/defaults and full review cycle (review-plan,apply-review). - Align all agent docs on
uv runfor commands.
Acceptance criteria
- No conflicting default artifact paths across active docs.
- Skills header date matches current baseline.
ISSUE-005: Version and packaging metadata under-specified
| Field | Value |
|---|---|
| Priority | P1 |
| Category | Release engineering |
| Status | Open |
Description
pyproject.toml declares version = "0.1.0" while the codebase has mature safety features, schema validation, review-apply cycle, and 517 tests. No versioning policy documented.
Recommended actions
- Document versioning (semver vs calver) in README or
CONTRIBUTING.md. - Bump version when artifact cleanup and CI land (e.g.
0.2.0). - Consider adding
[project.optional-dependencies]note forpytest-covif README documents coverage.
Acceptance criteria
- Version reflects release readiness; changelog entry per release.
P2 — Medium
ISSUE-006: cli.py remains large despite command extraction
| Field | Value |
|---|---|
| Priority | P2 |
| Category | Maintainability |
| Status | Open |
Description
Logic lives in src/vlm/commands/*, but cli.py is still ~1075 lines: Click options, help strings, and try/except wrappers for scan, parse, enrich, analyze, plan, execute, report, state, config.
Impact
Harder reviews and higher merge conflict rate on CLI changes.
Recommended actions
- Register command groups from
commands/modules (shared registry or Click group per module). - Target
cli.pyas thin registration + global options only (~200 lines).
Acceptance criteria
- New commands add one import/register line in
cli.py, not hundreds of lines.
ISSUE-007: Inconsistent import style across modules
| Field | Value |
|---|---|
| Priority | P2 |
| Category | Code style |
| Status | Open |
Description
executor.pyuses relative imports (.config,.models).planner.py,io.py, and most ofcommands/use absolutevlm.*imports.
Recommended actions
Pick one style (prefer absolute vlm.* for package consistency) and apply incrementally.
Acceptance criteria
- Style documented in
AGENTS.md; new code follows it.
ISSUE-008: Enrichment HTTP layer and operational limits
| Field | Value |
|---|---|
| Priority | P2 |
| Category | Reliability / operations |
| Status | Open |
Description
TMDB and enrichment use stdlib urllib (providers/tmdb.py, enrichment.py). Config allows enrichment_max_concurrency: 6 without documented rate-limit behavior.
API keys live in ~/.vlm/config.yaml (appropriate for local CLI); README does not prominently warn against committing config or artifacts with keys.
Recommended actions
- Document TMDB rate limits and recommended concurrency in README.
- Document env-var or config path overrides for secrets if supported (or add support).
- Optional: structured retry/backoff helper shared by providers.
Acceptance criteria
- Operators have clear guidance before bulk
vlm enrichon large libraries.
ISSUE-009: README accuracy gaps
| Field | Value |
|---|---|
| Priority | P2 |
| Category | Documentation |
| Status | Open |
Description
Specific gaps:
- Development:
pytest --cov=vlmwithoutpytest-covin[project.optional-dependencies]. - Project structure tree incomplete vs actual
src/vlm/. - Gemini skill name
vlm-expertreferenced; verify skill exists in repo or remove.
Recommended actions
Fix tree, dev deps, and skill activation instructions in one pass with ISSUE-004.
ISSUE-010: Large planner / plan_review modules
| Field | Value |
|---|---|
| Priority | P2 |
| Category | Maintainability |
| Status | Open |
Description
planner.py and plan_review.py are large, multi-responsibility modules (duplicate handling, templates, review CSV, apply-review metadata).
Recommended actions
Defer split until next major feature; when touching duplicates or review, extract submodules (planner_duplicates.py, plan_review_csv.py).
Acceptance criteria
- No requirement to split immediately; track before next large planner change.
P3 — Low
ISSUE-011: No linter or type checker in project config
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Developer experience |
| Status | Open |
Description
pyproject.toml has pytest/hypothesis only; no Ruff, Black, or mypy configuration.
Recommended actions
Add Ruff (and optional mypy on src/vlm) in CI after P1 CI exists.
ISSUE-012: Anime categorized but not parsed
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Product / feature gap |
| Status | Known limitation (documented) |
Description
Anime files are scanned and categorized; parser.py has no anime-specific parsing. README lists this under Limitations.
Recommended actions
Implement anime parsing or document a workaround (series parser with reduced confidence for hyphenated episode names).
ISSUE-013: Quarantine limited to movie and series
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Product / feature gap |
| Status | Known limitation (documented) |
Description
Only movie and series categories can be quarantined; anime and other are rejected.
ISSUE-014: Hardcoded filename parsing patterns
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Product |
| Status | Known limitation (documented) |
Description
Movie/series patterns are fixed in parser.py; not user-configurable. Power users with non-standard naming will need manual review paths.
ISSUE-015: Rollback is best-effort only
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Product / safety |
| Status | Known limitation (documented) |
Description
Rollback may fail if files were modified after execution. Correctly documented; ensure execute output reminds users of limits.
ISSUE-016: Broad exception handler in executor loop
| Field | Value |
|---|---|
| Priority | P3 |
| Category | Code quality |
| Status | Open (low risk) |
Description
executor.py catches Exception per operation (pragma: no cover) to avoid aborting the batch. Acceptable; ensure CLI always surfaces OperationResult.error_message.
Strengths (do not regress)
These are not issues; they should remain explicit acceptance criteria for refactors.
| ID | Area | Notes |
|---|---|---|
| STR-001 | Safety model | Dry-run default; quarantine not delete; library_root boundary checks on execute |
| STR-002 | Human-in-the-loop | review-plan → CSV → apply-review → execute with review enforcement |
| STR-003 | Duplicate resolution | Explicit strategies; DuplicateResolutionError; manual-review no-ops instead of silent fallback |
| STR-004 | Schema validation | Typed ExecutionPlan; validated load/save in io.py |
| STR-005 | Test suite | ~517 tests including CLI, security (test_path_safety.py), Hypothesis properties |
Suggested sprint order
- ISSUE-001 — Remove tracked artifacts; fix
.gitignore - ISSUE-002 — CI workflow
- ISSUE-003 — License and README URLs
- ISSUE-004 + ISSUE-009 — Doc and skills sync
- ISSUE-006 — CLI slim-down (optional, when touching CLI)
- ISSUE-011 — Ruff/mypy (after CI)
Mapping to GitHub issues (optional)
When filing on GitHub, use labels such as:
priority:p0,priority:p1, …type:security,type:docs,type:ci,type:tech-debt,type:feature
Suggested titles:
[P0] Remove committed library artifacts from Git[P1] Add CI workflow for pytest[P1] Add LICENSE and fix pyproject/README metadata[P1] Sync documentation and agent skills to artifacts/ baseline[P2] Slim cli.py to registration-only pattern
References
- Review conversation: 2026-05-25
- Canonical change history:
CHANGELOG.md - Architecture guide:
CLAUDE.md - Contributor conventions:
AGENTS.md