Skip to content

Commit 959776e

Browse files
InfantLabclaude
andcommitted
docs/chore: JOSS pre-submission sanity pass — fix stale paths, version drift
Reviewer-facing docs (GETTING_STARTED_REVIEWERS.md, CONTRIBUTING.md) still referenced the pre-restructure flat src/ layout (src/pipelines/, src/api/, etc.) instead of src/videoannotator/*, including a nonexistent pipeline name, a nonexistent test file, and a removed requirements.txt/main.py. pyproject.toml had the same staleness: the mypy exclude list and several override module names still pointed at src/* paths that no longer exist, silently turning those excludes into no-ops. CHANGELOG.md was missing entries for v1.4.3 and v1.4.4 even though both are already released per pyproject.toml/CITATION.cff (1.4.4) and git tags; backfilled from commit history. Also finalizes the docs/development -> docs/archive move of JOSS_VIEWER_HANDOVER.md (content unchanged, no remaining references to the old path). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent a940a81 commit 959776e

5 files changed

Lines changed: 95 additions & 49 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515
- Benchmark results and performance validation
1616
- Additional contributor documentation improvements
1717

18+
## [1.4.4] - 2026-07-08
19+
20+
### Modularity, Viewer Integration, and JOSS Resubmission
21+
22+
This release responds to JOSS pre-review feedback (openjournals/joss-reviews#10182, #10183) on install footprint and the relationship between VideoAnnotator and Video Annotation Viewer.
23+
24+
#### Added
25+
26+
- **Bundled viewer**: The FastAPI service now serves Video Annotation Viewer's static build at `/viewer`, same-origin and zero-config (`VIDEOANNOTATOR_ENABLE_VIEWER` to disable). VAV remains fully usable standalone.
27+
- **Contract test**: Added `tests/contract/test_viewer_contract.py`, which validates VideoAnnotator's exporter output against VAV's actual Zod schemas.
28+
- **Roadmap docs**: Added `docs/development/roadmap_v1.6.0.md` (plugin ecosystem, local LLM/Ollama backend) and rewrote `roadmap_v1.5.0.md` around the modularity spec (`specs/003-modular-pipeline-architecture`).
29+
30+
#### Fixed
31+
32+
- **Person-tracking contract gap**: COCO output was missing `person_id`/`person_label`/`label_confidence`/`labeling_method` when identity labeling was disabled, which VAV requires as non-optional; added sensible fallback defaults and corrected the pipeline's self-declared schema for `image_id`.
33+
- **`setup-db` DetachedInstanceError**: `create_admin_user()` returned a detached SQLAlchemy ORM object after closing its session, raising `DetachedInstanceError` on the first command in the README quickstart; fixed with an explicit `db.refresh()`.
34+
- **Hidden CLI commands**: The `if __name__ == "__main__"` guard sat before `validate-emotion`, `generate-token`, and `setup-db` were registered, hiding them from `python -m videoannotator.cli --help`; moved the guard to the end of the file.
35+
36+
#### Documentation
37+
38+
- Fixed several stale version pins (`INSTALLATION.md` still titled "v1.2.0", `Docker.md`, `output_naming_conventions.md`).
39+
- Added the interface figure to the combined JOSS paper and documented the `/viewer` integration and contract test as evidence of coordinated maintenance between VideoAnnotator and VAV.
40+
- Corrected `CITATION.cff`, which was still stale at 1.4.2.
41+
42+
## [1.4.3] - 2026-05-27
43+
44+
### Installability and CI Green (JOSS #10182)
45+
46+
#### Fixed
47+
48+
- **Missing storage modules**: An unanchored `storage/` rule in `.gitignore` silently excluded `manager.py` and the `providers/` subpackage from the published package, breaking fresh-clone installs with `No module named videoannotator.storage.manager`.
49+
- **CI matrix**: Restricted the CUDA torch index to Linux so `uv sync` succeeds on macOS/Windows; pinned torch/torchvision/torchaudio to the matched 2.6.0 release; fixed macOS storage-path test assertions (symlink resolution); marked the Windows CI leg non-blocking pending a known SQLite teardown locking issue.
50+
- **Security scan**: Repaired the CI security-scan job (updated Trivy action, added SARIF write permission).
51+
- **Tests**: Cleared pre-existing storage and audio-diarization test failures — `delete_job` now returns a bool found/not-found signal, and diarization tests updated to pyannote's current `token=` kwarg.
52+
53+
#### Changed
54+
55+
- Bumped `openai-whisper` to `>=20250625` (sdist-only).
56+
- Repointed reviewer docs from the removed `scripts/verify_installation.py` to `videoannotator diagnose`.
57+
58+
#### Documentation
59+
60+
- Fixed ORCID format (bare 16-digit IDs) and added ByteTrack/CLIP DOIs for JOSS metadata checks.
61+
1862
## [1.4.2] - 2026-03-04
1963

2064
### JOSS Review Version

‎CONTRIBUTING.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ Contributors are recognized in:
430430

431431
```bash
432432
# Run with debug logging
433-
python main.py --log-level DEBUG
433+
uv run videoannotator --log-level DEBUG
434434

435435
# Debug specific pipeline
436436
python -m pdb examples/test_individual_pipelines.py
@@ -440,7 +440,7 @@ python -m pdb examples/test_individual_pipelines.py
440440

441441
```bash
442442
# Profile performance
443-
python -m cProfile -o profile.stats main.py
443+
python -m cProfile -o profile.stats -m videoannotator.cli
444444

445445
# Analyze with snakeviz
446446
snakeviz profile.stats
@@ -450,7 +450,7 @@ snakeviz profile.stats
450450

451451
### Adding a New Pipeline
452452

453-
1. Create pipeline class in `src/pipelines/`
453+
1. Create pipeline class in `src/videoannotator/pipelines/`
454454
2. Implement `BasePipeline` interface
455455
3. Add configuration schema
456456
4. Create unit tests
@@ -461,7 +461,7 @@ snakeviz profile.stats
461461
### Adding Dependencies
462462

463463
1. Add to `pyproject.toml`
464-
2. Update `requirements.txt`
464+
2. Run `uv lock` to update `uv.lock`
465465
3. Test installation
466466
4. Update documentation
467467

‎docs/GETTING_STARTED_REVIEWERS.md‎

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ This guide helps JOSS reviewers quickly evaluate VideoAnnotator's functionality,
1313
- 🔌 Modular pipeline architecture
1414
- 🚀 REST API + CLI interfaces
1515
- 📊 Standard output formats (COCO, WebVTT, RTTM)
16-
- 🧪 Comprehensive test coverage (195+ tests, >80%)
16+
- 🧪 Comprehensive test coverage (1000+ tests, >80%)
1717
- 🔒 Secure by default (API key authentication)
1818

1919
**Repository**: [github.com/InfantLab/VideoAnnotator](https://github.com/InfantLab/VideoAnnotator)
@@ -103,7 +103,7 @@ Submit job:
103103
curl -X POST "http://localhost:18011/api/v1/jobs/" \
104104
-H "X-API-Key: $API_KEY" \
105105
-F "video=@sample.mp4" \
106-
-F "selected_pipelines=openface3_identity"
106+
-F "selected_pipelines=person,face,scene,audio"
107107
```
108108

109109
**Expected output**: Job created with `job_id`
@@ -181,14 +181,14 @@ ls -l reports/$JOB_ID/
181181

182182
| Component | Purpose | Location |
183183
|-----------|---------|----------|
184-
| **API** | REST endpoints, authentication, CORS | `src/api/` |
185-
| **Pipelines** | Video processing implementations | `src/pipelines/` |
186-
| **Registry** | Pipeline discovery and metadata | `src/registry/` |
187-
| **Worker** | Job execution, cancellation, retries | `src/worker/` |
188-
| **Database** | Job state, metadata persistence | `src/database/` |
189-
| **Storage** | File management, results organization | `src/storage/` |
190-
| **Validation** | Config and input validation | `src/validation/` |
191-
| **Exporters** | Output format converters | `src/exporters/` |
184+
| **API** | REST endpoints, authentication, CORS | `src/videoannotator/api/` |
185+
| **Pipelines** | Video processing implementations | `src/videoannotator/pipelines/` |
186+
| **Registry** | Pipeline discovery and metadata | `src/videoannotator/registry/` |
187+
| **Worker** | Job execution, cancellation, retries | `src/videoannotator/worker/` |
188+
| **Database** | Job state, metadata persistence | `src/videoannotator/database/` |
189+
| **Storage** | File management, results organization | `src/videoannotator/storage/` |
190+
| **Validation** | Config and input validation | `src/videoannotator/validation/` |
191+
| **Exporters** | Output format converters | `src/videoannotator/exporters/` |
192192

193193
### Data Flow
194194

@@ -207,14 +207,17 @@ ls -l reports/$JOB_ID/
207207
Pipelines are discovered via YAML metadata:
208208

209209
```yaml
210-
# src/registry/metadata/openface3_identity.yaml
211-
name: openface3_identity
212-
display_name: "OpenFace 3 - Identity"
213-
tasks: [face_detection, face_tracking, face_recognition]
214-
modalities: [video]
210+
# src/videoannotator/registry/metadata/face_openface3_embedding.yaml
211+
name: face_openface3_embedding
212+
display_name: OpenFace3 Face Embedding
213+
tasks:
214+
- face-embedding
215+
modalities:
216+
- image
217+
- video
215218
outputs:
216-
- format: COCO
217-
types: [detection, tracking, recognition]
219+
- format: JSON
220+
types: [embeddings]
218221
```
219222
220223
---
@@ -223,22 +226,22 @@ outputs:
223226
224227
### Where to Start Reading
225228
226-
**1. API Endpoints** (`src/api/v1/jobs.py`) - 5 min
229+
**1. API Endpoints** (`src/videoannotator/api/v1/jobs.py`) - 5 min
227230
- REST API implementation
228231
- Job submission, status, results retrieval
229232
- Well-documented with examples
230233

231-
**2. Pipeline Interface** (`src/pipelines/base.py`) - 3 min
234+
**2. Pipeline Interface** (`src/videoannotator/pipelines/base_pipeline.py`) - 3 min
232235
- Abstract base class for all pipelines
233236
- `initialize()`, `process()`, `cleanup()` methods
234237
- Standard interface contract
235238

236-
**3. Registry System** (`src/registry/pipeline_registry.py`) - 3 min
239+
**3. Registry System** (`src/videoannotator/registry/pipeline_registry.py`) - 3 min
237240
- Dynamic pipeline discovery
238241
- Metadata loading and validation
239242
- Singleton pattern
240243

241-
**4. Worker Execution** (`src/worker/executor.py`) - 5 min
244+
**4. Worker Execution** (`src/videoannotator/worker/job_processor.py`) - 5 min
242245
- Job execution logic
243246
- Error handling and retries
244247
- Cancellation support
@@ -247,14 +250,14 @@ outputs:
247250
- Unit tests: `tests/unit/`
248251
- Integration tests: `tests/integration/`
249252
- Pipeline tests: `tests/pipelines/`
250-
- 195+ tests with >80% coverage
253+
- 1000+ tests across 74 test files
251254

252255
### Code Quality Indicators
253256

254257
✅ **Type Hints**: Comprehensive type annotations
255258
✅ **Docstrings**: All public APIs documented
256259
✅ **Error Handling**: Consistent error envelope
257-
✅ **Testing**: 195+ tests, >80% coverage
260+
✅ **Testing**: 1000+ tests across 74 test files
258261
✅ **Logging**: Structured logging throughout
259262
✅ **Configuration**: Environment-based config
260263
✅ **Security**: Secure-by-default (API keys, CORS)
@@ -269,7 +272,7 @@ uv run pytest -q
269272
uv run python scripts/validate_coverage.py --html
270273
271274
# Run specific test file
272-
uv run pytest tests/unit/test_api_jobs.py -v
275+
uv run pytest tests/api/test_api_server.py -v
273276
274277
# Run integration tests
275278
uv run pytest tests/integration/ -v
@@ -297,7 +300,7 @@ uv run pytest tests/integration/ -v
297300
✅ **Example usage**: Multiple examples with expected outputs
298301
✅ **API documentation**: Interactive Swagger UI + docstrings
299302
✅ **Community guidelines**: CODE_OF_CONDUCT.md, CONTRIBUTING.md
300-
✅ **Tests**: 195+ tests, automated CI
303+
✅ **Tests**: 1000+ tests, automated CI
301304
✅ **License**: MIT (open source)
302305
✅ **Repository**: Clean, organized, active
303306

@@ -309,8 +312,8 @@ uv run pytest tests/integration/ -v
309312

310313
**A**: Three steps:
311314

312-
1. Implement `BasePipeline` in `src/pipelines/your_pipeline/`
313-
2. Create YAML metadata in `src/registry/metadata/`
315+
1. Implement `BasePipeline` in `src/videoannotator/pipelines/your_pipeline/`
316+
2. Create YAML metadata in `src/videoannotator/registry/metadata/`
314317
3. Add tests in `tests/pipelines/`
315318

316319
See [Pipeline Specifications](usage/pipeline_specs.md)

‎pyproject.toml‎

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ target-version = "py312"
195195
[tool.ruff.lint.per-file-ignores]
196196
"src/videoannotator/api/**/*.py" = ["B008"]
197197
"src/videoannotator/cli.py" = ["B008", "B904"]
198-
"src/batch/batch_orchestrator.py" = ["RUF013"]
198+
"src/videoannotator/batch/batch_orchestrator.py" = ["RUF013"]
199199

200200
[tool.mypy]
201201
python_version = "3.12"
@@ -212,16 +212,15 @@ no_implicit_optional = false
212212

213213
# Exclude files/patterns from mypy checking (reduces noise from ML/storage modules)
214214
exclude = [
215-
"src/pipelines/",
216-
"src/storage/models.py",
217-
"src/storage/file_backend.py",
218-
"src/utils/person_identity.py",
219-
"src/utils/automatic_labeling.py",
220-
"src/utils/size_based_person_analysis.py",
221-
"src/utils/logging_config.py",
222-
"src/version.py",
223-
"src/exporters/native_formats.py",
224-
"src/schemas/",
215+
"src/videoannotator/pipelines/",
216+
"src/videoannotator/storage/models.py",
217+
"src/videoannotator/storage/file_backend.py",
218+
"src/videoannotator/utils/person_identity.py",
219+
"src/videoannotator/utils/automatic_labeling.py",
220+
"src/videoannotator/utils/size_based_person_analysis.py",
221+
"src/videoannotator/utils/logging_config.py",
222+
"src/videoannotator/exporters/native_formats.py",
223+
"src/videoannotator/schemas/",
225224
"examples/",
226225
"scripts/",
227226
]
@@ -360,27 +359,27 @@ ignore_missing_imports = true
360359
# speech pipeline interacts with heavy third-party speech libraries (whisper, torch) that
361360
# produce large, environment-dependent typing noise. Relax checks for this module while
362361
# keeping API modules strict.
363-
module = ["pipelines.audio_processing.speech_pipeline"]
362+
module = ["videoannotator.pipelines.audio_processing.speech_pipeline"]
364363
ignore_errors = true
365364

366365
[[tool.mypy.overrides]]
367366
# Storage modules use SQLAlchemy models and runtime-mapped attributes
368-
module = "storage.*"
367+
module = "videoannotator.storage.*"
369368
ignore_errors = true
370369

371370
[[tool.mypy.overrides]]
372371
# Pipeline modules interact with heavy ML libraries (incomplete/dynamic typing)
373-
module = "pipelines.*"
372+
module = "videoannotator.pipelines.*"
374373
ignore_errors = true
375374

376375
[[tool.mypy.overrides]]
377376
# Utility modules with complex dynamic typing patterns
378-
module = "utils.*"
377+
module = "videoannotator.utils.*"
379378
ignore_errors = true
380379

381380
[[tool.mypy.overrides]]
382381
# Version module has dynamic git-based logic
383-
module = "version"
382+
module = "videoannotator.version"
384383
ignore_errors = true
385384

386385
[[tool.mypy.overrides]]
@@ -395,10 +394,10 @@ ignore_errors = true
395394

396395
[[tool.mypy.overrides]]
397396
# Exporters work with dynamic data structures
398-
module = "exporters.*"
397+
module = "videoannotator.exporters.*"
399398
ignore_errors = true
400399

401400
[[tool.mypy.overrides]]
402401
# Schemas module has placeholder types
403-
module = "schemas"
402+
module = "videoannotator.schemas"
404403
ignore_errors = true

0 commit comments

Comments
 (0)