Commit Graph

37 Commits

Author SHA1 Message Date
Torres
26fe7e79ea Merge branch 'dev' 2026-11-11 00:37:55 -04:00
Torres
7441f0550b docs: B1 shipped — photo experience v2 built, verified (walk 390/390, selfcheck 31/31), live on :9453 (2026-11-11) 2026-11-11 00:37:54 -04:00
Torres
49466fb516 Merge branch 'dev' 2026-11-11 00:34:44 -04:00
Torres
036a5116b8 b1: README — B1 develop notes (columns, importer, /img?i= route, mirror naming, payload fields, FE gestures, fe_walk_b1 usage, test data paths) 2026-11-11 00:21:15 -04:00
Torres
4630813644 b1: frontend fix — viewer segment bars render flat inside #vsegs (no nested .segments); fe_walk_b1: deterministic headless §11 evidence harness (fixture DB 701-706, staged local photos, real pointers: flips/clamps/viewer/zoom/pull-close/rotation/fast-chain/report/forge/list/trends) 2026-11-11 00:20:16 -04:00
Torres
38271d0d88 b1: selfcheck — 6 new B1 checks (guarded migration, imgs import + idempotence, 640-row copy byte-stable re-import, /img?i= chain, swipe photo_idx persistence, payload n_photos/last_photo_idx + rotation math); hardened two P3 checks against live-data drift on migrated copies (event seeding + profile sources); payload contract now includes B1 keys 2026-11-11 00:10:56 -04:00
Torres
fff9f05bae b1: frontend §11 — tap zones (sides flip clamped, center fullscreen, ⓘ wins), segment bars + band top:22 amendment, fullscreen viewer (swipe nav clamp, pinch 1-4x + double-tap zoom, ✕/pull-down close, same-position return), repeat rotation lead (last+1)%n, photo_idx on swipe commits, photo preload, sw cache v3 2026-11-11 00:08:04 -04:00
Torres
049b4fd280 b1: imgfetch — gallery mirroring: imgs[n] -> {id}_{n}.webp (primary n=0 keeps legacy {id}.webp, dedup by dst), per-file CLI progress, resumable/skip-existing as P2 2026-11-11 00:04:56 -04:00
Torres
604b983a51 b1: api — /img/{id}?i=n gallery chain (mirrored file -> CDN 302 -> 404; i=0 legacy), payload n_photos + last_photo_idx on deck/list/listing/section rows, POST /api/swipe persists optional photo_idx 2026-11-11 00:04:10 -04:00
Torres
4ca4cacda0 b1: importer — carry hunt imgs gallery into listings.imgs (JSON, page order); img_url falls back to imgs[0] 2026-11-11 00:03:03 -04:00
Torres
3b64635339 b1: db — guarded migrations: listings.imgs (gallery JSON) + swipes.last_photo_idx 2026-11-11 00:02:42 -04:00
AlexanderRozhenko
6de2fcc1bd docs: B1 (photo experience v2) contract frozen — UI-SPEC §11 (galleries, photo flip, fullscreen viewer, repeat rotation), DATA-MODEL B1 additions; PLAN/BACKLOG: B1 pulled forward before Phase 4 2026-11-10 23:57:33 -04:00
AlexanderRozhenko
8c1946db8e docs: PLAN — Phase 3 built, verified, and live (Torres build $3.80/25-25; Alex independent verification; second-look fix 1e4d840; live integration 2026-11-11 + calibration pass) 2026-11-10 23:41:49 -04:00
Torres
1e4d84017a frontend: fix second-look returns filtered out of the swipe buffer (decision===null filter dropped them; returns must enter the deck to be re-struck) 2026-11-10 23:38:55 -04:00
Torres
b6e1851b11 frontend: report-screen exhaustion fix — local decision map drives section progress; show report on local exhaust with rate-limited resync (verified headless: full 25-card section loop, forge, trends, tanks) 2026-11-10 23:28:06 -04:00
Torres
c205d315b7 docs: README — Phase 3 status, agent-pass + copy-hygiene develop notes, new routes 2026-11-10 23:18:26 -04:00
Torres
04463cadcd P3: personalization core — event log + taste engine + section engine + agent pass + API + frontend
- db.py: guarded P3 tables (swipe_events/sections/section_items/taste_profile/
  agent_runs), one-time event seeding from swipes, append_event round math
- taste.py: deterministic taste engine (action x round x recency weights,
  n/(n+3) shrink, ramp w=min(.85,N/60), percentile norm, agent adjustments
  +/-10, points + source-labeled breakdown + tank bands)
- sections.py: compose/read/exhaust/forge — 2 wildcards + <=5 returns
  (<=2 nopes, surprising only) + remainder new, <=4/family, >=3 price
  bands w/ repair, returns maybe>like>nope, last-two-section exclusion,
  ondemand/strict modes
- agentpass.py: mock (deterministic) / live (OpenRouter, one retry) /
  fallback; strict payload schema; --print-summary/--dry-run
- api.py: GET /api/section, POST /api/section/forge, GET /api/trends,
  POST /api/agent/run, POST /api/prefs; P3 payload fields (points, tank,
  slot, round_next, points_breakdown); events stamped with section_id
- frontend: section buffer + progress pill, report screen + forge + mode
  toggle, WILDCARD/SECOND LOOK bands, tank gauges (list + dossier), dossier
  Why-this-rank, real Trends tab, /api/deck fallback for pre-P3 API, sw v2
- selfcheck: 9 new P3 checks (25/25 green)
2026-11-10 23:18:26 -04:00
AlexanderRozhenko
8060852b83 docs: backlog - Glenn's photo-experience v2 idea queue (multi-image galleries, Tinder-style photo swipe, fullscreen viewer) 2026-11-10 23:12:29 -04:00
Alex (Hermes)
40b42b1d40 docs: freeze Phase 3 contract - sections (25), second looks with rounds, match points + tank gauge, agent pass; UI-SPEC v3 + DESIGN/RANKING/DATA-MODEL/PLAN additions 2026-11-10 22:52:51 -04:00
AlexanderRozhenko
2fca6e205e merge: Phase 2 swipe app (verified) — FastAPI API + PWA deck/list/matches, image mirror, dedupe refinement 2026-11-10 21:43:34 -04:00
AlexanderRozhenko
49e284ff56 docs: record Phase 2 build + verification (dedupe/backfill resolved, proof URLs) 2026-11-10 21:43:33 -04:00
Torres
d7fb694626 importer: dedupe refinement — min(ns,nb) completeness pairing (stretch I)
- cross-province groups now pair ns<->nb by completeness (img > km > older)
  up to min per region instead of collapsing the whole group to one row;
  surplus siblings (multi-unit dealer ads) stay active — no false merges
- verified on live DB: dup 80 -> 77, active 560 -> 563, total 640; the 3
  freed rows are the BMW G 310 R dealer siblings (450/451/452); deck top
  order unchanged (Indian Scout 91 x3 then Vulcan 900 73); re-import
  idempotent (77 stable)
- selfcheck +2: multi-unit pairing semantics, reversibility (flip to
  active + re-import re-derives the pairing) — 16/16 green
2026-11-10 21:25:02 -04:00
Torres
8367e2b7c8 deploy/Dockerfile (python:3.13-slim app contract) + README run/develop section
- Dockerfile: 3.13-slim, pip install requirements.txt, copy app/, EXPOSE
  8000, serves /data/bike-tinder.sqlite3 + /data/img on 0.0.0.0:8000
  (compose/systemd/tailscale stay with the parent)
- README: status line now reflects Phase 2; added Run & develop (venv,
  importer, imgfetch incl. --limit, serve, selfcheck, deck CLI, route map)
2026-11-10 21:23:48 -04:00
Torres
778d1bfd4b selfcheck: extend with P2 API checks on a temp DB copy (14 total)
- 8 P1 spine checks unchanged; 6 new API checks via fastapi.testclient
  against create_app() on a temp COPY of the live DB (live file never
  opened by tests): root/static, stats-live==active+health, deck page 1
  monotonic + undecided-only + full cursor walk zero-overlap vs SQL truth,
  swipe like->list->edit->delete lifecycle (+invalid payload rejection),
  /img/{id} cached-200/hotlink-302/none-404, badge roundtrip
- bare-python run keeps the 8 P1 checks and notes the skipped P2 set
- known framework quirk documented: this fastapi+httpx TestClient pair
  mangles RedirectResponse to a bare 404; real uvicorn serves the true 302
  (proof run verifies over the wire)
2026-11-10 21:22:26 -04:00
Torres
57fae0df49 app: no-build PWA frontend (fidelity port) + image mirror
- app/static/index.html: single-file app — DOM/CSS/stack engine ported
  verbatim from reference/mockup-001-fidelity.html (DEPTH/SC/TY/DIM, drag/
  fly/undo, one .topcard, no-lock commits, stamps, dossier sheet,
  pull-to-close, empty state); production deltas only (UI-SPEC §7): deck
  buffer + cursor refill (40/page), optimistic swipe persistence with
  2s/5s/10s/15s retry queue + toast, badge-once-per-session, real list
  filters + search (server-side), real Matches screen, /img/{id} everywhere
  with placeholder fallback, SW registration, safe areas, desktop centering
- manifest.json + sw.js (precache shell, network-first API, cache-first imgs)
- icons: 192/512/maskable/apple-touch-180, dark tile with the brand
  accent-gradient mark (Pillow)
- app/imgfetch.py: local mirror, hunt's Chrome-120 UA, ~1s pacing,
  skip-existing, .part writes atomic, per-item failure isolation,
  fetched/skipped/failed summary; verified: --limit 15 -> 15 fetched, full
  run 5 more, re-run 0 fetched 20 skipped (20/20 mirrored)
2026-11-10 21:21:27 -04:00
Torres
5df2a20bac app: FastAPI API + serve CLI (Phase 2)
- create_app(db_path, img_dir, state_dir) factory; every route + payload
  from app.state — selfcheck runs the real router on a temp DB copy
- /api/health (ok/db/counts), /api/stats (live/new/likes/maybes/nopes/
  last_import), /api/deck (undecided semantics, score/first_seen/id DESC,
  opaque '<score>|<first_seen>|<id>' cursor, strictly-after tuple page,
  remaining count), /api/swipe upsert + DELETE (idempotent), /api/list
  (decision/sort/q/limit/offset, total), /api/listing/{id}, /api/import
  (importer, HTTP 200 even when gates fail), /api/badge/seen, /img/{id}
  (cached file -> 302 img_url -> 404), static routes (/, manifest, sw.js,
  icons, apple-touch; no-cache on index + sw.js)
- frozen payload contract incl. img=/img/{id} when img_url or cached file
- serve.py: argparse (--db/--img-dir/--state-dir/--host/--port, defaults
  127.0.0.1:9453) -> uvicorn.run
- verified: 560-deep deck walks clean with zero page overlap, swipe ->
  list -> edit -> delete -> back on deck, badge roundtrip (new 560 -> 0);
  real uvicorn returns true 302 for the img fallback (TestClient in this
  fastapi/httpx pair mangles RedirectResponse into a 404 — framework
  artifact, not app behavior)
2026-11-10 21:17:57 -04:00
Torres
02a6b6df7e app: P2 migrations (year/seller_type/extras) + importer backfill, guards idempotent
- db.init_db gains guarded ALTER TABLE additions for listings.year /
  seller_type / extras (schema.sql v1 untouched; PRAGMA-checked idempotent)
- rubric: extras_from_text() returns matched EXTRAS labels (table order)
- importer: normalize computes year (existing helper), seller_type ONLY
  from a real state-item signal (dealer/private, else NULL), extras JSON;
  upsert rewrites the new columns on both paths
- verified on live DB: import idempotent, counts stay 640/560/80, year
  backfilled on 599 rows, extras on 45, seller_type 0 (no state signal)
2026-11-10 21:13:40 -04:00
AlexanderRozhenko
9bc6948861 docs: freeze Phase 2 contract — UI-SPEC v2 (approved mockup A, stack engine, deltas) + DATA-MODEL P2 addendum (migrations, cursor pagination, media mirror) + frozen mockup reference 2026-11-10 21:11:27 -04:00
AlexanderRozhenko
d8510c184a docs: record verified Phase 1 results (twin counts in SOURCES; phase status + Phase 2 backlog in PLAN) 2026-11-10 19:00:00 -04:00
AlexanderRozhenko
d890dcdb3e merge: Phase 1 data spine (verified): schema, importer, rubric, deck CLI, selfcheck 2026-11-10 18:59:03 -04:00
Torres
19e46cd11b app: add proof deck CLI, dependency-free selfcheck, gitignore 2026-11-10 18:57:17 -04:00
Torres
ca7835db9c app: add importer (gates, upsert, dedupe, gone-marking, scoring, import_runs) 2026-11-10 18:57:17 -04:00
Torres
d2d5ec22fa app: port hunt rubric scoring (family tiers, extras, veto, price fit) 2026-11-10 18:57:17 -04:00
Torres
5bf180c4c6 app: add SQLite schema and db helper (WAL, busy_timeout, four tables + indexes) 2026-11-10 18:57:17 -04:00
AlexanderRozhenko
670648b17a docs: housekeeping - branch policy, Tailscale sidecar deployment (no host coupling), dedicated import cron plan 2026-11-10 18:09:16 -04:00
AlexanderRozhenko
18bf31f361 docs: add SOURCES, DESIGN, DATA-MODEL; record v1 decisions (Kijiji source, rank-all deck, badge-only feed); vendor hunt reference modules 2026-11-10 17:48:32 -04:00
AlexanderRozhenko
fc3aad1e93 docs: initial set - README, PLAN, UI-SPEC, RANKING 2026-11-10 17:38:01 -04:00