Files
brain-of-reese/alembic/versions/0023_documents_image_context.py
ducoterra e0307fe3ff
Build and Push Containers / build-and-push-app (push) Successful in 2m8s
Build and Push Containers / build-and-push-db (push) Failing after 1m38s
phase: 125_image_anchor_context
All completion criteria verified. The repository is left functional with all changes in the working tree (no commits made, per the harness protocol).

## Final report — phase 125 `image_anchor_context` (verification pass)

All 6 tasks were already complete; this pass verified every criterion and ran the full gates:

- **Migration 0023** `documents.image_context` (TEXT nullable, reversible) — applied (`alembic current` = 0023 head); round-trip test (4 passed) exercises real upgrade → downgrade 0022 → upgrade.
- **Criterion 1** (referenced image enriched + context line in retrieval): integration `test_markdown_referenced_image_gets_context_and_enriched_chunks` + E2E `test_sync_enriches_the_image_doc_with_markdown_context`, `test_chat_answer_quotes_the_context_line` (wire prompt pinned: `<document>` block leads with the one-line `Referenced in …: "alt"` line) — verified present and passing.
- **Criterion 2** (standalone image byte-identical): E2E `test_standalone_*` (NULL `image_context`, block body exactly the bare description, no `Referenced in` anywhere in the prompt) + unit `test_describe_image_without_context_is_byte_identical` — passing.
- **Criterion 3** (markdown-first: record stored on markdown doc, image picks up context later): integration `test_markdown_indexed_before_image_stores_record_and_image_picks_it_up` + post-index enrichment pass test (markdown file gone from disk) — passing.
- **Gates:** `uv run pytest` → 2938 passed, exit 0 · `uv run pytest --cov=app --cov-report=term-missing` → exit 0, TOTAL **99%** (>90%) · `uv run ruff check .` → All checks passed · `uv run pyright` → 0 errors, 0 warnings.
- **Phase E2E in isolation:** `uv run pytest tests/e2e/test_image_anchor_context.py -v --no-cov` → 4 passed.
- **Mock-LLM change regression check:** neighboring image E2E suites green in isolation — `test_smoke` (3), `test_image_documents` (16), `test_chat_image_questions` (17), `test_answer_images` (17).
- No defects found; no code changes needed. No live-infrastructure changes (local dev DB only). No commit made (harness commits).
- Next pending phase: check `.agents/phases/todo/` after the harness moves this phase.
2026-09-27 05:53:12 -04:00

44 lines
1.4 KiB
Python

"""documents.image_context: markdown anchor context for image docs
(phase 125, task 01)
Revision ID: 0023
Revises: 0022
Create Date: 2026-09-26
Phase 125 (image-anchor context — task 01, storage only):
* ``documents.image_context`` — TEXT NULLABLE: the surrounding text
extracted from the markdown file that references the image
(LOCKED A1) — the ``![alt text](image.png)`` alt text plus N
paragraphs before and after the reference. This is what makes the
image retrievable not just by what it shows but by WHY it exists in
the documentation (the phase-125 objective).
The column is additive and NULL for every pre-phase row: standalone
images (no markdown reference), images referenced only from
non-markdown formats, and all pre-phase-125 rows simply read NULL —
no backfill (A4 keeps their behaviour byte-identical). One fully
reversible migration (A13): ``downgrade`` drops the column and leaves
0022's schema byte-identical.
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision = "0023"
down_revision = "0022"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.add_column("documents", sa.Column("image_context", sa.Text(), nullable=True))
def downgrade() -> None:
# The column is the only 0023 artefact — dropping it leaves 0022's
# schema byte-identical (A13, fully reversible).
op.drop_column("documents", "image_context")