refactor(agents): migrate .agent/ planning tree to .agents/
Standardize on the .agents/ directory (shared with project skills): phases/, user_stories/, reports/, screenshots/, validate.sh, and phase-sessions/ + pipeline.log all move to .agents/ (git mv preserves history; runtime artifacts move alongside). Updates every reference in AGENTS.md, README.md, .gitignore, app docstrings, and test story headers. Historical KB content in data/ and the runtime pipeline.log transcript are left untouched.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
**Phase 60 (sticky navbar) — final verification pass, all green**
|
||||
|
||||
- Verified (tasks 01+02 already complete): `styles.css` — only `html` carries `height: 100%` with phase-60 provenance comment; `body` has no `height:`, keeps `min-height: 100dvh`; `.app-header`/`.doc-header` sticky pins + reworded phase-12 comment intact; commit `5fa620f` contains only `frontend/` + `tests/`; worktree clean.
|
||||
- `uv run pytest --cov=app --cov-report=term-missing` → 1193 passed, TOTAL **99%** (>90% ✓)
|
||||
- `uv run pytest tests/e2e/test_sticky_navbar.py -v --no-cov` → 3 passed (app-header top=0 at bottom of Sources, doc-header top=0 on long doc, short-page body=800/footer/composer pin)
|
||||
- Regression suites, each isolated: pinned_composer 4✓, document_viewer 7✓, responsive_polish 7✓, smoke 3✓, no_reply_autoscroll 6✓, mobile_hamburger_nav 7✓
|
||||
- `uv run ruff check . && uv run pyright` → All checks passed / 0 errors, 0 warnings
|
||||
- Completion criteria: all 8 met — E2E proofs ✓, full suite + coverage ✓, lint/types ✓, single `--no-gpg-sign` commit ✓, phase dir in `complete/` ✓
|
||||
- No defects found; no code changes needed this pass. No deviations.
|
||||
- Next pending phase: none — `todo/` holds only this phase.
|
||||
@@ -0,0 +1,71 @@
|
||||
........................................................................ [ 6%]
|
||||
........................................................................ [ 12%]
|
||||
........................................................................ [ 18%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 30%]
|
||||
........................................................................ [ 36%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 48%]
|
||||
........................................................................ [ 54%]
|
||||
........................................................................ [ 60%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 72%]
|
||||
........................................................................ [ 78%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 96%]
|
||||
......................................... [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib/python3.13/site-packages/fastapi/testclient.py:1
|
||||
/var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.13.13-final-0 _______________
|
||||
|
||||
Name Stmts Miss Cover
|
||||
-----------------------------------------------
|
||||
app/__init__.py 1 0 100%
|
||||
app/api/__init__.py 0 0 100%
|
||||
app/api/auth.py 22 0 100%
|
||||
app/api/chat.py 131 0 100%
|
||||
app/api/chats.py 110 0 100%
|
||||
app/api/config.py 7 0 100%
|
||||
app/api/doc_drafts.py 93 0 100%
|
||||
app/api/docs.py 50 0 100%
|
||||
app/api/git_sources.py 143 0 100%
|
||||
app/api/health.py 10 0 100%
|
||||
app/api/steering.py 42 0 100%
|
||||
app/api/suggestions.py 8 0 100%
|
||||
app/api/sync.py 89 0 100%
|
||||
app/config.py 101 0 100%
|
||||
app/core/__init__.py 0 0 100%
|
||||
app/core/auth.py 20 0 100%
|
||||
app/core/caching.py 108 0 100%
|
||||
app/core/debugging.py 29 2 93%
|
||||
app/core/docs_push.py 39 0 100%
|
||||
app/core/logging.py 13 0 100%
|
||||
app/db.py 21 0 100%
|
||||
app/main.py 52 0 100%
|
||||
app/models.py 86 0 100%
|
||||
app/rag/__init__.py 0 0 100%
|
||||
app/rag/agent.py 78 0 100%
|
||||
app/rag/archive_upload.py 128 0 100%
|
||||
app/rag/chunker.py 206 4 98%
|
||||
app/rag/git_sources.py 14 0 100%
|
||||
app/rag/importer.py 173 3 98%
|
||||
app/rag/llm.py 189 0 100%
|
||||
app/rag/overview.py 71 0 100%
|
||||
app/rag/prompts.py 65 0 100%
|
||||
app/rag/retriever.py 94 3 97%
|
||||
app/rag/sources_meta.py 16 0 100%
|
||||
app/rag/suggestions.py 27 0 100%
|
||||
app/rag/summarizer.py 24 0 100%
|
||||
app/schemas.py 198 0 100%
|
||||
-----------------------------------------------
|
||||
TOTAL 2458 12 99%
|
||||
coverage gate: app/ 99% (>90%) OK
|
||||
All checks passed!
|
||||
0 errors, 0 warnings, 0 informations
|
||||
validation OK
|
||||
@@ -0,0 +1,17 @@
|
||||
Everything is green. Task 01 complete:
|
||||
|
||||
**Implemented**
|
||||
- `frontend/assets/styles.css`: `html, body { height: 100%; }` → phase-60 provenance comment + `html { height: 100%; }` (A1 root-cause cap on the sticky travel range removed; body grows to content via its existing `min-height: 100dvh` stretch)
|
||||
- Reworded the stale phase-12 comment in `.app-header` ("definite-height" → "stretches via `min-height: 100dvh`… grows with content"); `flex-shrink: 0` guard and all other properties byte-identical (diff confirms: selector change + two comment blocks only, no reformatting)
|
||||
- New `tests/unit/test_sticky_header.py` (house pattern from `test_save_chat_ui.py`): 6 pins — negative pin (combined rule gone), `html` keeps `height: 100%` with phase-60 comment provenance, `body` block has NO `height:` + keeps `min-height: 100dvh`/flex column, `.app-header` and `.doc-header` keep `position: sticky; top: 0` (+ z-index/height/shrink-guard), reworded comment check
|
||||
|
||||
**Results**
|
||||
- `uv run pytest tests/unit/test_sticky_header.py -v --no-cov` → 6 passed
|
||||
- `uv run pytest --cov=app --cov-report=term-missing` → 1193 passed, TOTAL coverage 99% (>90%)
|
||||
- `uv run ruff check . && uv run pyright` → clean (0 errors)
|
||||
|
||||
**Decisions**
|
||||
- Block-extraction regex is line-anchored (`^body {`): the new phase-60 comment legitimately quotes `body { height: 100% }` literally, which a naive mid-line match would capture instead of the rule
|
||||
- No commit made — the phase's atomic commit is scoped to task 02 (E2E + regression suites) per the phase overview
|
||||
|
||||
**Next pending task:** `.agents/phases/todo/60_sticky_navbar/02_e2e_sticky_navbar.md`
|
||||
@@ -0,0 +1,71 @@
|
||||
........................................................................ [ 6%]
|
||||
........................................................................ [ 12%]
|
||||
........................................................................ [ 18%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 30%]
|
||||
........................................................................ [ 36%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 48%]
|
||||
........................................................................ [ 54%]
|
||||
........................................................................ [ 60%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 72%]
|
||||
........................................................................ [ 78%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 96%]
|
||||
......................................... [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib/python3.13/site-packages/fastapi/testclient.py:1
|
||||
/var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.13.13-final-0 _______________
|
||||
|
||||
Name Stmts Miss Cover
|
||||
-----------------------------------------------
|
||||
app/__init__.py 1 0 100%
|
||||
app/api/__init__.py 0 0 100%
|
||||
app/api/auth.py 22 0 100%
|
||||
app/api/chat.py 131 0 100%
|
||||
app/api/chats.py 110 0 100%
|
||||
app/api/config.py 7 0 100%
|
||||
app/api/doc_drafts.py 93 0 100%
|
||||
app/api/docs.py 50 0 100%
|
||||
app/api/git_sources.py 143 0 100%
|
||||
app/api/health.py 10 0 100%
|
||||
app/api/steering.py 42 0 100%
|
||||
app/api/suggestions.py 8 0 100%
|
||||
app/api/sync.py 89 0 100%
|
||||
app/config.py 101 0 100%
|
||||
app/core/__init__.py 0 0 100%
|
||||
app/core/auth.py 20 0 100%
|
||||
app/core/caching.py 108 0 100%
|
||||
app/core/debugging.py 29 2 93%
|
||||
app/core/docs_push.py 39 0 100%
|
||||
app/core/logging.py 13 0 100%
|
||||
app/db.py 21 0 100%
|
||||
app/main.py 52 0 100%
|
||||
app/models.py 86 0 100%
|
||||
app/rag/__init__.py 0 0 100%
|
||||
app/rag/agent.py 78 0 100%
|
||||
app/rag/archive_upload.py 128 0 100%
|
||||
app/rag/chunker.py 206 4 98%
|
||||
app/rag/git_sources.py 14 0 100%
|
||||
app/rag/importer.py 173 3 98%
|
||||
app/rag/llm.py 189 0 100%
|
||||
app/rag/overview.py 71 0 100%
|
||||
app/rag/prompts.py 65 0 100%
|
||||
app/rag/retriever.py 94 3 97%
|
||||
app/rag/sources_meta.py 16 0 100%
|
||||
app/rag/suggestions.py 27 0 100%
|
||||
app/rag/summarizer.py 24 0 100%
|
||||
app/schemas.py 198 0 100%
|
||||
-----------------------------------------------
|
||||
TOTAL 2458 12 99%
|
||||
coverage gate: app/ 99% (>90%) OK
|
||||
All checks passed!
|
||||
0 errors, 0 warnings, 0 informations
|
||||
validation OK
|
||||
@@ -0,0 +1,18 @@
|
||||
Done. Final report:
|
||||
|
||||
**Implemented**
|
||||
- `tests/e2e/test_sticky_navbar.py` (new, 3 tests, run in isolation): Sources page (admin login, 54 seeded rows) — `.app-header` rect top == 0 (±1px) after `scrollTo(0,800)` and at the bottom; viewer `/document.html?source=gen&path=doc-long.md` (~40k-char body, scrollHeight 15523) — `.doc-header` top == 0 (±1px) at the bottom; empty-chat short page — body 800, footer bottom 800, composer pin + phase-52 resting geometry intact.
|
||||
- Module-scoped KB seed (house pattern): truncate + `import_sources([fixtures, gen])` in a worker thread — 13 fixture docs + 40 short generated + 1 long doc; mock LLM only, no real LLM. Teardown re-truncates.
|
||||
- Verified the test catches the bug: with the pre-fix `html, body { height: 100%; }` restored, both sticky tests fail (header top goes negative) and the short-page test still passes.
|
||||
- Atomic commit `5fa620f --no-gpg-sign`: `frontend/assets/styles.css` (task 01) + both test files; working tree clean.
|
||||
|
||||
**Results (exact commands)**
|
||||
- `uv run pytest tests/e2e/test_sticky_navbar.py -v --no-cov` → 3 passed
|
||||
- Regression, each in isolation: `test_pinned_composer` 4, `test_document_viewer` 7, `test_responsive_polish` 7, `test_smoke` 3, `test_no_reply_autoscroll` 6, `test_mobile_hamburger_nav` 7 — all passed
|
||||
- `uv run pytest --cov=app --cov-report=term-missing` → 1193 passed, TOTAL 99% (>90%)
|
||||
- `uv run ruff check . && uv run pyright` → clean (0 errors)
|
||||
|
||||
**Notable deviation**
|
||||
- Spec's "`.composer` bottom ≈ 800 (±2px)" is geometrically impossible: the composer rests in-flow *above* the footer (measured 716.34px at 1280×800; footer bottom is the 800 pin, and phase 52 forbids overlap). Encoded the phase-52 contract instead (deadband ≤ footer+56px, bottom ≥ 80% of viewport, no overlap, `position: sticky`) — matching the phase objective "short-page layout stays exactly as it is today"; no `frontend/`/`app/` changes.
|
||||
|
||||
**Next pending task:** none — `60_sticky_navbar/02` was the last task in `todo/` (harness moves the phase dir to `complete/`).
|
||||
@@ -0,0 +1,71 @@
|
||||
........................................................................ [ 6%]
|
||||
........................................................................ [ 12%]
|
||||
........................................................................ [ 18%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 30%]
|
||||
........................................................................ [ 36%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 48%]
|
||||
........................................................................ [ 54%]
|
||||
........................................................................ [ 60%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 72%]
|
||||
........................................................................ [ 78%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 96%]
|
||||
......................................... [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib/python3.13/site-packages/fastapi/testclient.py:1
|
||||
/var/home/ducoterra/Projects/Personal/brain_of_reese/.venv/lib/python3.13/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.13.13-final-0 _______________
|
||||
|
||||
Name Stmts Miss Cover
|
||||
-----------------------------------------------
|
||||
app/__init__.py 1 0 100%
|
||||
app/api/__init__.py 0 0 100%
|
||||
app/api/auth.py 22 0 100%
|
||||
app/api/chat.py 131 0 100%
|
||||
app/api/chats.py 110 0 100%
|
||||
app/api/config.py 7 0 100%
|
||||
app/api/doc_drafts.py 93 0 100%
|
||||
app/api/docs.py 50 0 100%
|
||||
app/api/git_sources.py 143 0 100%
|
||||
app/api/health.py 10 0 100%
|
||||
app/api/steering.py 42 0 100%
|
||||
app/api/suggestions.py 8 0 100%
|
||||
app/api/sync.py 89 0 100%
|
||||
app/config.py 101 0 100%
|
||||
app/core/__init__.py 0 0 100%
|
||||
app/core/auth.py 20 0 100%
|
||||
app/core/caching.py 108 0 100%
|
||||
app/core/debugging.py 29 2 93%
|
||||
app/core/docs_push.py 39 0 100%
|
||||
app/core/logging.py 13 0 100%
|
||||
app/db.py 21 0 100%
|
||||
app/main.py 52 0 100%
|
||||
app/models.py 86 0 100%
|
||||
app/rag/__init__.py 0 0 100%
|
||||
app/rag/agent.py 78 0 100%
|
||||
app/rag/archive_upload.py 128 0 100%
|
||||
app/rag/chunker.py 206 4 98%
|
||||
app/rag/git_sources.py 14 0 100%
|
||||
app/rag/importer.py 173 3 98%
|
||||
app/rag/llm.py 189 0 100%
|
||||
app/rag/overview.py 71 0 100%
|
||||
app/rag/prompts.py 65 0 100%
|
||||
app/rag/retriever.py 94 3 97%
|
||||
app/rag/sources_meta.py 16 0 100%
|
||||
app/rag/suggestions.py 27 0 100%
|
||||
app/rag/summarizer.py 24 0 100%
|
||||
app/schemas.py 198 0 100%
|
||||
-----------------------------------------------
|
||||
TOTAL 2458 12 99%
|
||||
coverage gate: app/ 99% (>90%) OK
|
||||
All checks passed!
|
||||
0 errors, 0 warnings, 0 informations
|
||||
validation OK
|
||||
Reference in New Issue
Block a user