Fix ultrawide workspace utilization
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-13 12:27:21 +02:00
parent 1689dce928
commit 6fe1bbd946
6 changed files with 29 additions and 11 deletions
+1
View File
@@ -15,6 +15,7 @@
- At tile `512`, overlap `64`, threshold `0.15` and QA match IoU `0.25`, seven persisted AOIs reached mean precision `0.5898`, recall `0.5770`, F1 `0.5825` and minimum F1 `0.5528`; all three pure-empty controls remained at zero detections.
- Fixed-reference evidence reduced false negatives from 7,753 to 6,182, including 745 fewer 25-100 m2 misses and 181 fewer sub-25 m2 misses. Precision is lower, so the UI states the increased false-positive review load explicitly.
- Added persistent false-negative area summaries/GeoJSON, explicit tile-corpus sample selection provenance, missing runtime evaluation scripts, Docker COPY-source regression checks and warning-free Pydantic model-field schemas.
- Fixed ultrawide two-panel workspaces so AI Labs, QA/QC and Exports use the available main width instead of leaving empty third/fourth columns, and decoupled backend README edits from the expensive all-in-one GIS/AI dependency cache layer.
- Guarded activation updated only the Tower AI/model environment values; no fake outputs, provider fetching, API contract or database migration changed.
## Sprint 173 Expanded building model promotion (2026-07-13)
+8 -4
View File
@@ -46,6 +46,9 @@ def test_all_in_one_dockerfile_can_opt_into_ai_dependencies_without_base_install
dockerfile = (ROOT / "deploy" / "unraid" / "Dockerfile.all-in-one").read_text(encoding="utf-8")
assert "ARG GEOINTEL_INSTALL_AI=false" in dockerfile
assert "COPY backend/pyproject.toml /app/" in dockerfile
assert "COPY backend/pyproject.toml backend/README.md /app/" not in dockerfile
assert "GeoIntel backend package metadata" in dockerfile
assert 'extras=".[gis]"' in dockerfile
assert 'extras=".[gis,ai]"' in dockerfile
assert "python scripts/gis_import_smoke.py" in dockerfile
@@ -90,7 +93,7 @@ def test_all_in_one_dockerfile_copies_operator_scripts_for_runtime_use() -> None
def test_all_in_one_dockerfile_copies_operator_scripts_after_dependency_install() -> None:
dockerfile = (ROOT / "deploy" / "unraid" / "Dockerfile.all-in-one").read_text(encoding="utf-8")
dependency_install_index = dockerfile.index('RUN /usr/bin/python3.11 -m venv /opt/geointel/venv \\')
dependency_install_index = dockerfile.index('/usr/bin/python3.11 -m venv /opt/geointel/venv \\')
operator_copy_index = dockerfile.index(
"COPY scripts/render_operator_yolo_label_qa_contact_sheets.py "
"/app/scripts/render_operator_yolo_label_qa_contact_sheets.py"
@@ -287,12 +290,13 @@ def test_backend_docker_context_contains_gis_import_smoke_script() -> None:
def test_all_in_one_dockerfile_caches_dependencies_and_uses_cpu_torch_for_ai_runtime() -> None:
dockerfile = (ROOT / "deploy" / "unraid" / "Dockerfile.all-in-one").read_text(encoding="utf-8")
metadata_copy_index = dockerfile.index("COPY backend/pyproject.toml backend/README.md /app/")
dependency_install_index = dockerfile.index('RUN /usr/bin/python3.11 -m venv /opt/geointel/venv \\')
metadata_copy_index = dockerfile.index("COPY backend/pyproject.toml /app/")
placeholder_readme_index = dockerfile.index("GeoIntel backend package metadata")
dependency_install_index = dockerfile.index('/usr/bin/python3.11 -m venv /opt/geointel/venv \\')
backend_copy_index = dockerfile.index("COPY backend/ /app/")
smoke_index = dockerfile.index("RUN python scripts/gis_import_smoke.py")
assert metadata_copy_index < dependency_install_index < backend_copy_index < smoke_index
assert metadata_copy_index < placeholder_readme_index < dependency_install_index < backend_copy_index < smoke_index
assert "GEOINTEL_TORCH_INDEX_URL=https://download.pytorch.org/whl/cpu" in dockerfile
assert "GEOINTEL_TORCH_VERSION=2.13.0" in dockerfile
assert "GEOINTEL_TORCHVISION_VERSION=0.28.0" in dockerfile
@@ -12,6 +12,10 @@ def test_workbench_adds_widescreen_layout_contracts() -> None:
assert "grid-template-columns: 14rem minmax(0, 1fr) 24rem;" in css
assert ".workbench-main {\n padding: 1.1rem 1.35rem 1.35rem;" in css
assert ".workspace-grid-data {\n grid-template-columns: repeat(3, minmax(0, 1fr));" in css
assert (
".workspace-grid-analysis,\n .workspace-grid-ai,\n .workspace-grid-exports {\n"
" grid-template-columns: repeat(2, minmax(0, 1fr));"
) in css
assert ".workspace-grid-data > section:nth-child(3) {\n grid-column: auto;" in css
assert ".workbench-main .map-container,\n .map-frame-surface .map-container" in css
assert "height: calc(100vh - 18rem);" in css
@@ -23,7 +27,10 @@ def test_workbench_adds_ultrawide_map_priority_contracts() -> None:
assert "@media (min-width: 2200px)" in css
assert "grid-template-columns: 15rem minmax(0, 1fr) 26rem;" in css
assert ".workspace-grid-data,\n .workspace-grid-analysis,\n .workspace-grid-ai,\n .workspace-grid-exports" in css
assert "grid-template-columns: repeat(4, minmax(0, 1fr));" in css
assert ".workspace-grid-data {\n grid-template-columns: repeat(3, minmax(0, 1fr));" in css
assert css.count(
".workspace-grid-analysis,\n .workspace-grid-ai,\n .workspace-grid-exports {\n"
" grid-template-columns: repeat(2, minmax(0, 1fr));"
) == 2
assert "height: calc(100vh - 15.5rem);" in css
assert "min-height: 42rem;" in css
+3 -2
View File
@@ -47,10 +47,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /app
COPY backend/pyproject.toml backend/README.md /app/
COPY backend/pyproject.toml /app/
COPY backend/app/__init__.py /app/app/__init__.py
RUN /usr/bin/python3.11 -m venv /opt/geointel/venv \
RUN printf '# GeoIntel backend package metadata\n' > /app/README.md \
&& /usr/bin/python3.11 -m venv /opt/geointel/venv \
&& pip install --no-cache-dir --upgrade pip setuptools \
&& if [ "$GEOINTEL_INSTALL_AI" = "true" ]; then \
pip install --no-cache-dir \
+2
View File
@@ -7119,6 +7119,8 @@ Open:
- Copied the complete operator evaluation/promotion toolchain into the all-in-one image and added a regression that rejects every Docker `COPY scripts/...` source that does not exist.
- Removed Pydantic protected-namespace warnings for legitimate `model_*` API fields while preserving all schema field names and response contracts.
- Updated Detection Lab profiles: the new small-building profile is recommended, the previous expanded profile remains the higher-precision legacy choice, and the background-aware `0.35` profile remains conservative.
- Live `2560x1080` inspection found that two-panel AI/QA/Export workspaces inherited four ultrawide columns and left half of the main canvas empty. Those workspaces now remain explicit two-column grids while the three-panel Data workspace keeps three columns.
- The all-in-one dependency layer now copies only `pyproject.toml` plus a stable build-only package README before installation; the real `backend/README.md` still enters with the complete backend source, so documentation-only edits no longer invalidate Torch/GIS dependencies.
- Guarded activation first returned `ready_to_apply`; the reviewed `--apply` pass updated only `GEOINTEL_INSTALL_AI`, `YOLO_ENABLED`, `YOLO_MODELS_DIR` and `YOLO_MODEL_PATH` in the Tower environment.
## Local validation
+6 -3
View File
@@ -5231,7 +5231,7 @@ section {
.workspace-grid-analysis,
.workspace-grid-ai,
.workspace-grid-exports {
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.workspace-grid-data > section:nth-child(3) {
@@ -5266,11 +5266,14 @@ section {
padding: 1.2rem 1.65rem 1.5rem;
}
.workspace-grid-data,
.workspace-grid-data {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.workspace-grid-analysis,
.workspace-grid-ai,
.workspace-grid-exports {
grid-template-columns: repeat(4, minmax(0, 1fr));
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.workbench-main .map-container,