odysseus/website
Nguyen Thanh Dat c3819e3cbf
Some checks are pending
CI / Focused test guidance (report-only) (push) Waiting to run
CI / Python syntax (compileall) (push) Waiting to run
CI / JS syntax (node --check) (push) Waiting to run
CI / Python tests (pytest 1/4) (push) Waiting to run
CI / Python tests (pytest 2/4) (push) Waiting to run
CI / Python tests (pytest 3/4) (push) Waiting to run
CI / Python tests (pytest 4/4) (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
ci / docker publish / build (amd64) (push) Waiting to run
ci / docker publish / build (arm64) (push) Waiting to run
ci / docker publish / merge manifest + tag (push) Blocked by required conditions
fix(docker): mount the ChromaDB volume where the image actually persists (#6166)
* fix(docker): mount the ChromaDB volume where the image actually persists

chromadb/chroma runs `chroma run /config.yaml`, and that config is one line:
persist_path: "/data". The image declares no VOLUME, so everything the store
writes lives in the container's writable layer. The chromadb-data volume was
mounted at /chroma/chroma — where pre-1.0 images kept the store — so it caught
nothing and the entire vector store was destroyed on every container recreate.

Nothing errors when that happens. The collection survives with a count of 0, so
retrieval simply returns nothing from then on, which reads as "no match".

docs/backup-restore.md tells users to archive the chromadb-data volume, which
means the documented backup was empty too.

Fixed in all three compose files. The volume was never written to, so there is
nothing to migrate.

* fix(tests,docs): harden volume-path test helper and document upgrade migration

tests/test_chromadb_volume_path.py
- _chromadb_volumes() now normalises long-form dict volume entries
  (source/target/type map) to 'source:target' strings, preventing
  AttributeError crashes if a future Compose change uses that syntax.
- test_chromadb_does_not_use_the_pre_1_0_path now uses split(':')[1]
  comparison instead of endswith(), so mount-option suffixes (:z, :ro)
  cannot mask a wrong legacy target path.
- Three new unit tests validate the helper against both YAML syntaxes
  and the mount-option edge case explicitly.

docs/chromadb-volume-migration.md (new)
- Step-by-step guide for users upgrading from pre-#6166 Docker installs
  whose ChromaDB data accumulated in the container's writable layer.
- Covers: detecting the situation, backing up via 'docker cp', seeding
  the named volume before recreating the container, verification, and
  rollback. Validated with disposable Docker volumes.
- Distinguishes fresh installs (no action needed) from existing
  installs with live writable-layer data (action needed before recreate).

docs/backup-restore.md
- Extended ChromaDB caveat block to cross-reference the new migration
  guide for users upgrading from pre-#6166.

Closes the P1 documentation gap and P2/P3 test-robustness findings
from the PR #6166 adversarial review.

* fix(docs,tests): eliminate ChromaDB migration data-loss risks and enforce safe cutover

- Require service quiescence before cold database copy to prevent torn SQLite pages
- Mandate container preservation via immutable Docker image commit before recreation
- Enforce positive empty check on destination volume prior to seeding
- Add staging container validation on an isolated loopback port before Compose cutover
- Provide verified rollback procedures prohibiting return to legacy /chroma/chroma mount
- Add regression test coverage for all migration safety invariants

---------

Co-authored-by: PR #6166 Reviewer <reviewer@odysseus-review.local>
2026-10-14 12:20:35 +01:00
..
_config.yml refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
agent-migration.md refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
attachments.md refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
backup-restore.md fix(docker): mount the ChromaDB volume where the image actually persists (#6166) 2026-10-14 12:20:35 +01:00
bg.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
chat.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
compare.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
configuration-reference.md fix(docs): cite files, not line numbers, in the generated env reference (#6538) 2026-10-07 00:39:19 +02:00
document.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
email-outlook.md refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
gallery.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
index.html fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
notes.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
original-harness-capability-policy.md Squash Odysseus development history 2026-09-11 06:04:19 +00:00
photo-editor-audit.md Squash Odysseus development history 2026-09-11 06:04:19 +00:00
pr-blocker-audit.md refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
research.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
security-ci.md refactor(docs): separate Pages site source (#6176) 2026-08-27 10:20:36 +02:00
setup.md fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00
sft-expansion-launch-ledger-20260830.md Squash Odysseus development history 2026-09-11 06:04:19 +00:00
sft-style-contract.md Squash Odysseus development history 2026-09-11 06:04:19 +00:00
theme.webm fix(publication): restore project-origin branding and demo assets (#6561) 2026-10-07 02:08:34 +01:00