phase: 100_page_width_consistency
**Phase 100 — final verification pass: all green.** - Verified the shipped CSS contract directly: `--chat-column: 72rem` in `:root`; 0 literal `max-width: 46rem`; no `@media (min-width: 1500px)` block; exactly 4 token-capped reading columns; tuning/theme/doc-edit shells cap-free, structurally `.sources-shell`; `mock_llm.py` diff is comment-only. - Defect found & fixed (phase-93 suite): `test_theme_semantic_completion.py::test_reset_removes_tag_byte_identical` raced theme.js's post-PUT refetch — it asserted the `#bor-theme` tag was gone right after the result line, but tag removal lands in the reconcile after the re-fetch (failed ~1 in 5 runs after `test_chat_rag`, reproduced). Fixed with an auto-waiting `expect(...).to_have_count(0)` (settled-state wait, the file's existing house pattern). 6/6 clean on the repro loop after. - Tests/lint/coverage: `uv run pytest --cov=app --cov-report=term-missing` → 2052 passed, **99%** on `app/`; `uv run ruff check .` + `uv run pyright` → 0 errors. - E2E in isolation (all passed): `test_wide_desktop_column.py` 3 (the phase suite — chat==tuning==theme==RAG ±4px at 1280 & 1920, ≈1152px; shared ≈1152px; standalone doc ≈1112px; modal unchanged ≈1100px; 360px overflow-free), `test_ui_customization` 4, `test_admin_theme_tab` 5, `test_document_viewer` 7, `test_save_share_ux` 5, `test_sticky_navbar` 3, `test_markdown_tables` 6, `test_responsive_polish` 7, `test_chat_rag` 3, `test_theme_semantic_completion` 8. - Completion criteria: ① measured 72rem everywhere (≥~1200px, ±4px) + full-width below + 360px clean — **PASS** (E2E); ② zero 46rem rules / no 1500px block / four token selectors — **PASS** (grep + unit pins); ③ B4 byte-identical no-op + mobile squeeze — **PASS** (theme + responsive suites green); ④ full suite / coverage / lint — **PASS**; ⑤ atomic commit — left to the harness per executor protocol (all changes in the working tree, uncommitted). - Deviations: none from phase decisions; only change in this pass is the race fix above (test-only, behavior unchanged). - Next pending phase: `98_sync_summary_visibility` (numeric order in `todo/`; also pending: 99, 101–105).
This commit is contained in:
@@ -19,8 +19,8 @@ silent regression is caught without a browser:
|
||||
chat page's interactive builders, and the rendered messages contain
|
||||
no button/form/link — the chips are plain spans, the source chips
|
||||
carry no ``href``;
|
||||
* the shared shell's reading-column mapping (--chat-column token,
|
||||
phase 58) + the static-chip and
|
||||
* the shared shell's reading-column mapping (--chat-column token —
|
||||
the 72rem container width, phase 100) + the static-chip and
|
||||
invalid-state CSS (the ≤640px squeeze included).
|
||||
"""
|
||||
from __future__ import annotations
|
||||
@@ -384,17 +384,18 @@ def test_brand_note_resolves_at_call_time() -> None:
|
||||
|
||||
|
||||
def test_shared_shell_maps_to_the_reading_column() -> None:
|
||||
"""The PLAN §7 column contract (phase 58): .shared-shell is the
|
||||
centered chat column riding the --chat-column token (46rem base,
|
||||
92rem at >=1500px wide desktops — owner instruction 2026-08-31,
|
||||
TODO L5 / D2). The conversation reads exactly like the chat
|
||||
page's, so the existing .msg/.bubble CSS applies unchanged."""
|
||||
"""The 72rem-everywhere contract (phase 100, owner instruction
|
||||
2026-09-12): .shared-shell is the centered chat column riding the
|
||||
--chat-column token — equal to the .container's cap, so the shared
|
||||
page reads at the RAG page's width. The conversation reads exactly
|
||||
like the chat page's, so the existing .msg/.bubble CSS applies
|
||||
unchanged."""
|
||||
css = _css()
|
||||
block = re.search(r"\.shared-shell \{([\s\S]*?)\n\}", css)
|
||||
assert block, "styles.css must style .shared-shell"
|
||||
body = block.group(1)
|
||||
assert "max-width: var(--chat-column)" in body, (
|
||||
"the PLAN §7 centered chat column (phase 58 token)"
|
||||
"the centered chat column riding the token (the 72rem width)"
|
||||
)
|
||||
assert "46rem" not in body.split("/*")[0], (
|
||||
"no hard-coded cap — the width rides the token"
|
||||
|
||||
Reference in New Issue
Block a user