Adds the installation manual, architecture overview, and illustrated user manual as a five-story epic, plus the acceptance gate that keeps them true. The documentation is markdown under docs/, so the same files are readable in the repository and rendered by the deployed application at /app/#/docs. An operator who was handed a URL and an access secret has no repository checkout in front of them, and the network the application is deployed to is not assumed to reach a CDN. Two decisions are recorded in the epic rather than left to implementation: - The renderer is vendored (marked), not written and not fetched. - Diagrams are mermaid, rendered client-side, with script-src untouched. Whether mermaid needs 'unsafe-eval' was measured rather than assumed: its bundle contains no eval( and no new Function, and rendered under this application's exact CSP it produced an SVG with no script-src violation. What it does violate is style-src, which gains 'unsafe-inline'. With script-src, img-src, connect-src, and font-src all unchanged, that leaves defacement rather than execution or exfiltration. The alternative -- pre-rendering diagrams to committed SVG with the already-installed Playwright -- is recorded as the migration if that trade is ever refused. Screenshots are generated from the running application, never pasted, and every documented setting, command, exit code, error code, and state is cross-checked against the code that implements it, so stale documentation fails a test instead of misleading an operator. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015csGY8XV1M92fHfKnMmjtu
207 lines
6.0 KiB
JSON
207 lines
6.0 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"
|
|
],
|
|
"US08-01": [
|
|
"tests/unit/test_security_policy.py",
|
|
"tests/integration/test_trusted_hosts.py"
|
|
],
|
|
"US08-02": [
|
|
"tests/integration/test_container_image.py",
|
|
"tests/e2e/test_container_runtime.py"
|
|
],
|
|
"US08-03": [
|
|
"tests/integration/test_compose_runtime.py",
|
|
"tests/e2e/test_compose_stack.py"
|
|
],
|
|
"US08-04": [
|
|
"tests/integration/test_deploy_workflows.py"
|
|
],
|
|
"US08-05": [
|
|
"tests/integration/test_container_gate.py",
|
|
"tests/e2e/test_phase_h_container.py"
|
|
]
|
|
},
|
|
"planned": [
|
|
"US09-01",
|
|
"US09-02",
|
|
"US09-03",
|
|
"US09-04",
|
|
"US09-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."
|
|
}
|