Running the application depended on work_item/scripts/python, which is the work-item helper's launcher: it probes for conda with `command -v`, cannot see a lazily-defined shell function, and falls back to a bare system interpreter with none of the dependencies installed. The application now installs into an ordinary virtualenv instead. That exposed two packaging faults. Pillow, numpy, and scipy were declared test-only although the application imports them at runtime — thumbnails decode through Pillow and the perceptual hash is a DCT over decoded pixels — and an editable install failed outright because setuptools could not choose between photo_pipeline, migrations, and work_item. Both are fixed here, and the OpenAI client moves to a `vision` extra so a review-only install does not pull an API client it never calls. Config.from_env now reads `.env`, or the file named by PHOTO_PIPELINE_ENV_FILE, before it looks at the environment. The file is parsed, never executed: KEY=value lines, comments, optional quotes, no interpolation and no export. Anything already exported wins, so the file is standing configuration and the shell stays the override for one run. The archived CLI's names are mapped as aliases (LLM_API_KEY/GEMINI_API_KEY, LLM_BASE_URL, LIBRARY), so an existing photo_analyzer.env configures the application unchanged. .env, *.env, .venv/, and *.egg-info/ are ignored: the real configuration file holds a live provider key and must never be committed. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SH4M1PHPwJsM9btcg8hzCs
188 lines
5.5 KiB
JSON
188 lines
5.5 KiB
JSON
{
|
|
"_comment": "Maps each delivered story to the automated tests that exercise it. Verified by tests/e2e/test_traceability.py: every mapped story maps to existing test files, every test file is claimed by a story (no unexercised tests), and all Phase A (E01) stories US01-01..US01-07 are present.",
|
|
"stories": {
|
|
"US01-01": [
|
|
"tests/characterization/test_donor_ledger.py",
|
|
"tests/characterization/test_pa_discovery.py",
|
|
"tests/characterization/test_pa_hashing_dedup.py",
|
|
"tests/characterization/test_pa_imaging.py",
|
|
"tests/characterization/test_pa_exif.py",
|
|
"tests/characterization/test_pa_db.py",
|
|
"tests/characterization/test_pa_album.py",
|
|
"tests/characterization/test_pa_config.py",
|
|
"tests/characterization/test_pa_variants.py",
|
|
"tests/characterization/test_nsfwtag.py",
|
|
"tests/characterization/test_webapp_query.py"
|
|
],
|
|
"US01-02": [
|
|
"tests/integration/test_app_lifecycle.py",
|
|
"tests/integration/test_migrations.py",
|
|
"tests/unit/test_config.py",
|
|
"tests/unit/test_env_file.py"
|
|
],
|
|
"US01-03": [
|
|
"tests/unit/test_path_policy.py",
|
|
"tests/unit/test_hashing.py",
|
|
"tests/integration/test_inventory_reconcile.py"
|
|
],
|
|
"US01-04": [
|
|
"tests/unit/test_phash.py",
|
|
"tests/integration/test_duplicate_engine.py"
|
|
],
|
|
"US01-05": [
|
|
"tests/unit/test_thumbnail_cache_key.py",
|
|
"tests/integration/test_thumbnails.py"
|
|
],
|
|
"US01-06": [
|
|
"tests/integration/test_review_api.py",
|
|
"tests/e2e/test_review_ui.py"
|
|
],
|
|
"US01-07": [
|
|
"tests/e2e/test_phase_a_pipeline.py",
|
|
"tests/e2e/test_traceability.py"
|
|
],
|
|
"US02-01": [
|
|
"tests/unit/test_safety.py",
|
|
"tests/unit/test_design_tokens.py",
|
|
"tests/integration/test_safety_parity.py"
|
|
],
|
|
"US02-02": [
|
|
"tests/unit/test_job_state_machine.py",
|
|
"tests/integration/test_jobs.py"
|
|
],
|
|
"US02-03": [
|
|
"tests/unit/test_lock_order.py",
|
|
"tests/integration/test_worker.py",
|
|
"tests/e2e/test_worker_kill.py"
|
|
],
|
|
"US02-04": [
|
|
"tests/integration/test_jobs_api.py",
|
|
"tests/integration/test_jobs_sse.py"
|
|
],
|
|
"US02-05": [
|
|
"tests/e2e/test_frontend_shell.py"
|
|
],
|
|
"US02-06": [
|
|
"tests/integration/test_safety_analysis.py",
|
|
"tests/e2e/test_workflow_views.py"
|
|
],
|
|
"US02-07": [
|
|
"tests/e2e/test_phase_b_pipeline.py",
|
|
"tests/e2e/test_analysis_browser.py"
|
|
],
|
|
"US03-01": [
|
|
"tests/unit/test_album_evidence.py",
|
|
"tests/integration/test_album_evidence_repo.py"
|
|
],
|
|
"US03-02": [
|
|
"tests/unit/test_naming_policy.py"
|
|
],
|
|
"US03-03": [
|
|
"tests/integration/test_album_proposals.py"
|
|
],
|
|
"US03-04": [
|
|
"tests/e2e/test_albums_ui.py"
|
|
],
|
|
"US03-05": [
|
|
"tests/e2e/test_phase_c_pipeline.py"
|
|
],
|
|
"US04-01": [
|
|
"tests/integration/test_rename_plans.py"
|
|
],
|
|
"US04-02": [
|
|
"tests/unit/test_rename_journal_states.py",
|
|
"tests/integration/test_rename_journal.py"
|
|
],
|
|
"US04-03": [
|
|
"tests/integration/test_rename_apply.py"
|
|
],
|
|
"US04-04": [
|
|
"tests/integration/test_rename_recovery.py"
|
|
],
|
|
"US04-05": [
|
|
"tests/e2e/test_renames_ui.py"
|
|
],
|
|
"US04-06": [
|
|
"tests/e2e/test_phase_d_pipeline.py"
|
|
],
|
|
"US05-01": [
|
|
"tests/integration/test_upload_preflight.py"
|
|
],
|
|
"US05-02": [
|
|
"tests/integration/test_upload_batches.py"
|
|
],
|
|
"US05-03": [
|
|
"tests/unit/test_immich_go_report.py",
|
|
"tests/integration/test_upload_reports.py"
|
|
],
|
|
"US05-04": [
|
|
"tests/unit/test_immich_bulk_check.py",
|
|
"tests/integration/test_upload_verification.py"
|
|
],
|
|
"US05-05": [
|
|
"tests/e2e/test_uploads_ui.py"
|
|
],
|
|
"US05-06": [
|
|
"tests/e2e/test_phase_e_pipeline.py"
|
|
],
|
|
"US06-01": [
|
|
"tests/integration/test_archive_preflight.py"
|
|
],
|
|
"US06-02": [
|
|
"tests/unit/test_archive_journal_states.py",
|
|
"tests/integration/test_archive_transfer.py",
|
|
"tests/integration/test_archive_recovery.py"
|
|
],
|
|
"US06-03": [
|
|
"tests/integration/test_offline_assets.py"
|
|
],
|
|
"US06-04": [
|
|
"tests/integration/test_restore.py"
|
|
],
|
|
"US06-05": [
|
|
"tests/e2e/test_archive_ui.py"
|
|
],
|
|
"US06-06": [
|
|
"tests/e2e/test_phase_f_pipeline.py"
|
|
],
|
|
"US07-01": [
|
|
"tests/unit/test_legacy_archive.py",
|
|
"tests/integration/test_legacy_import.py"
|
|
],
|
|
"US07-02": [
|
|
"tests/unit/test_security_policy.py",
|
|
"tests/integration/test_security_boundaries.py",
|
|
"tests/e2e/test_security.py"
|
|
],
|
|
"US07-03": [
|
|
"tests/integration/test_media_hardening.py",
|
|
"tests/integration/test_exif_checkpoints.py"
|
|
],
|
|
"US07-04": [
|
|
"tests/unit/test_fault_artifacts.py",
|
|
"tests/integration/test_concurrency_races.py",
|
|
"tests/integration/test_fault_matrix.py",
|
|
"tests/e2e/test_crash_recovery.py"
|
|
],
|
|
"US07-05": [
|
|
"tests/integration/test_backup_recovery.py",
|
|
"tests/integration/test_diagnostics.py"
|
|
],
|
|
"US07-06": [
|
|
"tests/integration/test_performance_budgets.py"
|
|
],
|
|
"US07-07": [
|
|
"tests/e2e/test_release_gate.py",
|
|
"tests/e2e/test_release_journey.py"
|
|
]
|
|
},
|
|
"planned": [
|
|
"US08-01",
|
|
"US08-02",
|
|
"US08-03",
|
|
"US08-04",
|
|
"US08-05"
|
|
],
|
|
"_planned_comment": "Accepted backlog stories that are not implemented yet. The release gate (US07-07) requires every story file to be either mapped to tests or listed here, so an unimplemented story is a visible decision rather than a hole in the matrix."
|
|
}
|