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.
44 lines
1.4 KiB
Python
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 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")
|