Commit Graph

67 Commits

Author SHA1 Message Date
Claude 79bce5e671
Redesign UI to a bolder aurora-glass system after visual QA with a real Flutter build
Actually installed the Flutter SDK, built the app (web + a local screenshot
harness through a real backend), and looked at the rendered screens instead
of judging the design from source alone. The previous gradient/glassmorphism
pass read as flat and generic: glass cards barely contrasted against the
pale background, the brand mark was a stock sparkle icon, and buttons were
flat solid fills.

Changes:
- Stronger, more saturated aurora gradient + blurred glow orbs in
  GradientBackdrop for real depth instead of a flat 3-stop pastel.
- Glass cards/inputs get higher-contrast fill/border and a brand-tinted
  shadow so they visibly lift off the backdrop.
- New BrandMark (gradient monogram), GradientText (gradient-filled
  wordmark), and PrimaryGradientButton (gradient CTA with shadow) replace
  the generic Material icon/flat button on splash, signup, onboarding and
  the conversation list empty state.
- Fixed a real pre-existing layout bug found via screenshot: the onboarding
  header badge was a direct ListView child with an explicit width, which
  Flutter's sliver list silently stretches to full width regardless of the
  Container's own width — invisible before because its old flat pale fill
  blended into the background. Wrapped it in Align to restore its intended
  size.

Verified with flutter analyze (0 errors) and flutter test (all passing),
plus manual screenshots of signup, onboarding, conversation list and a live
chat exchanged between two demo users through a real core-backend instance.
2026-07-31 08:16:44 +00:00
Claude ce2e38e566
chore: refresh mobile/pubspec.lock after flutter pub get
Transitive dependency version bumps picked up while verifying the merge
actually builds with a real Flutter SDK (analyze/test/build web all pass).
2026-07-31 01:41:45 +00:00
Claude 6743bf0054
Merge origin/main: keep gradient/glassmorphism UI, port demo-invite + boot hardening, purge 분신 branding
- Resolve visual-direction conflicts (app_theme, main.dart, signup/onboarding
  screens, index.html) in favor of the soft-gradient + glassmorphism design;
  drop the competing Twin Shadow palette and TwinTokens usage.
- Port non-visual additions from the parallel branch: CORS middleware,
  FlutterError/PlatformDispatcher crash handlers + boot timeout/fallback
  screen in main.dart, and the shared demo-invite feature
  (core-backend/demo.go, demo_test.go, mobile/lib/config.dart), reskinning
  the demo panel to match the glass UI.
- Rename the shared demo invite code DEMO-BUNSIN -> DEMO-YKAVU on both
  client and server so the tester-facing feature keeps working.
- Purge remaining "분신"/"bunsin" identifiers app-wide: Dart package name
  (bunsin_mobile -> ykavu_mobile), Android applicationId/namespace
  (com.bunsin.bunsin_mobile -> com.ykavu.ykavu_mobile, incl. Kotlin source
  dir move), on-device DB filename, keystore alias/docs, PoC draft-generator
  system prompt, and the static web boot placeholder div.
2026-07-31 01:30:50 +00:00
Claude ebf333d287
제품명 변경(분신→와카뷰) + 소프트 그라디언트/글래스모피즘 UI + 브랜드 로딩 화면
명칭 변경:
- decision-log.md Q6 확정: "분신"(가칭) → "와카뷰 (Ykavu)" — 焚身(분신자살)
  동음이의 리스크도 있었고 메신저 브랜드로 부르기 무거웠음. Master가 최종
  선택한 이름으로 변경(2026-07-31), 파생 문서(AGENTS.md/CLAUDE.md/PRD 등)·
  Flutter 앱 텍스트·web manifest/index.html·AndroidManifest 라벨까지 전부 반영
- ai-service: 본인확인 고정 문구(identity.py)·시스템 프롬프트(generation.py)도
  갱신 — 새 이름 기준으로 "본인이야 와카뷰야?" 류 질문을 감지하도록 정규식도
  같이 손봄(단순 문자열 치환만으론 어미 형태가 안 맞아서 테스트 추가/조정)
- poc/tone-corpus/의 실험용 프롬프트는 의도적으로 그대로 둠(ai-service README에
  이미 명시된 대로 프로덕션과 분리된 실험 도구)

UI/UX:
- mobile/lib/theme/app_theme.dart: 시드 컬러를 인디고/라벤더로 변경, 화면 전체에
  깔리는 소프트 그라디언트(라이트: 라벤더→스카이→핑크 파스텔, 다크: 딥 인디고→
  네이비→플럼) + 카드/인풋/칩을 반투명 "글래스" 서피스로 전환
- mobile/lib/widgets/gradient_backdrop.dart(신규): MaterialApp.builder에 연결해
  모든 화면에 자동으로 그라디언트 배경 적용
- mobile/lib/screens/splash_screen.dart(신규) + main.dart 재구성: 기존엔
  session.restore()를 기다리는 동안 아무 것도 안 그려서 흰 화면/텍스트만 뜨는
  구간이 있었음 — runApp을 먼저 하고 restore 동안 브랜드 스플래시가 뜨도록 변경
- chat_screen·autonomy_settings_screen·data_flow_screen의 커스텀 패널들도
  글래스 스타일로 맞춤

BunsinApp -> YkavuApp (mobile/lib/main.dart, test/widget_test.dart 동기화)

Flutter SDK가 없는 환경이라 flutter analyze/run으로 직접 컴파일 검증은 못했음 —
중괄호/괄호 균형과 기존에 검증된 API 패턴 위주로 신중하게 작성함. go test·
pytest는 전부 통과.
2026-07-31 01:15:42 +00:00
Cursor Agent c4ecb5862b
chore: add push-both script for GitHub + Gitea remotes
Keeps o0kuma/hikikomori and gitea oh/iykyka in sync from this workspace.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 08:47:40 +00:00
Cursor Agent 17b10a0e8c
feat: show shared DEMO-BUNSIN invite on signup for testers
Seed a reusable demo invite (ALLOW_DEMO_INVITE, default on) and surface it
on the Flutter signup screen with one-tap fill so others can try without
asking for a one-off admin mint.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 08:21:22 +00:00
Cursor Agent 9abc09c2a6
fix(core-backend): enable CORS for Flutter Web signup
Chrome treats localhost:5555 and 127.0.0.1:8080 as different origins.
Handle OPTIONS preflight and emit Access-Control-Allow-* so /auth/signup
works from flutter run -d chrome.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 08:16:28 +00:00
Cursor Agent 941d600cfd
feat(mobile): Twin Shadow UI for signup and tone onboarding
Apply the approved Twin Shadow direction: forest/mist/paper tokens,
Manrope typography, full-bleed hero atmosphere with dual silhouettes,
brand-first signup copy, and quieter conversation-list alignment.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 08:02:28 +00:00
Claude 6eceef44f8
Merge claude/project-planning-approach-ukdz31: Flutter UI polish 2026-07-30 07:18:50 +00:00
Claude 9cd52f884d
Merge cursor/fix-web-db-stub-382d: Flutter Web/Chrome compile stub 2026-07-30 07:18:45 +00:00
Claude 5ce189a76a
Flutter UI 디자인 다듬기 — 테마 시스템 도입 + 화면별 시각 개선
일관된 디자인 토큰(mobile/lib/theme/app_theme.dart)을 새로 만들고
전체 화면에 적용:
- 라이트/다크 ColorScheme을 명시적으로 정의(기존엔 라이트만 있어서
  다크 모드 기기에서 깨져 보였음), AppBar/Card/입력창/버튼/칩/배너 등
  컴포넌트 테마를 통일. "분신" 뱃지 전용 twin 강조색(amber) 분리
- 화면마다 제각각이던 TextField 테두리를 전부 테마 하나로 통일
  (chat_screen의 L1 편집창에 하드코딩돼 있던 Colors.white70 배경도
  제거 — 다크 모드에서 흰 배경에 흰 글씨로 안 보이던 실제 버그였음)

화면별 개선:
- signup: 로고 마크 + 안내 문구 추가, 아이콘 붙인 입력창
- 대화 목록: 앱바 아이콘 4개를 겹쳐놨던 걸 정리(더보기 메뉴로 이동),
  색상 아바타, 빈 상태 안내, 확장형 FAB
- message_bubble: 좌우 비대칭 말풍선 모양(꼬리 느낌), 타임스탬프 추가,
  분신 뱃지를 아이콘+칩 형태로
- chat: 거부권 버튼에 확인 다이얼로그 추가(실수로 눌러도 되돌릴 수
  없는 동작이라 안전장치), L1/에스컬레이션 패널 카드화
- contacts/inbox/sessions/autonomy_settings/data_flow/onboarding:
  아바타, 섹션 카드, 빈 상태, 화이트리스트 칩 UI 등 톤 통일

주의: 이 작업 환경에는 Flutter SDK가 없어 flutter analyze/run/test로
직접 검증하지 못했음. 아이콘 이름 등은 기존 코드에 이미 쓰인 것 위주로
맞췄지만, 로컬에서 flutter analyze 먼저 돌려보는 걸 권장.
2026-07-30 07:14:25 +00:00
Cursor Agent 43aaa31f3c
fix Flutter Web/Chrome compile by stubbing SQLCipher DB
dart:ffi and SQLCipher cannot compile for Chrome. Split AppDatabase into
native (Drift+SQLCipher) and web in-memory stub via conditional export, and
enable the web platform so flutter run -d chrome works for UI preview.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 07:05:31 +00:00
cursor[bot] 86f65d27ce
Merge pull request #10 from o0kuma/claude/project-planning-approach-ukdz31
Sync main: Phase 1 A–C (Flutter, APIs, beta-ready)
2026-07-30 05:57:46 +00:00
cursor[bot] c46c5263de
Merge pull request #9 from o0kuma/cursor/phase1-c-beta-ready-382d
Phase 1 C: Q1–Q7 confirmed, invite ops, Android release path
2026-07-30 05:57:19 +00:00
Cursor Agent fb4feceab2
Sync AGENTS/CLAUDE: Q1~Q7 confirmed, Phase 1 A–C complete
Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:49:18 +00:00
Cursor Agent e9a7e420f9
AGENTS.md: Q1~Q7 confirmed; note Phase 1 code exists
Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:49:01 +00:00
Cursor Agent 4f2c9df160
Complete Phase 1 C: decisions, invite ops, release path, prototype anchor
- Confirm Q1~Q7 in decision-log (Master-approved Phase C)
- Invite ops doc + note/expiry/batch/revoke APIs and tests
- Android release docs/scripts + optional key.properties signing
- Fix prototype share-link docs anchor (SHARE_URL for Master)

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:48:50 +00:00
cursor[bot] f2d7ac8054
Merge pull request #8 from o0kuma/cursor/phase1-b-local-fcm-382d
Phase 1 B complete: encrypted drift DB, FCM notify, session revoke
2026-07-30 05:44:36 +00:00
Cursor Agent 93c5523a6d
Docs: FCM_SERVER_KEY in .env.example; sync roadmap B status
Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:28:54 +00:00
Cursor Agent d8e95540ec
Docs: mark on-device tone storage done; document FCM_SERVER_KEY
Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:28:48 +00:00
Cursor Agent 9b02c59dd6
Complete Phase 1 B: encrypted drift DB, FCM notify, session revoke
- Flutter: drift + SQLCipher local store for tone samples/KV with
  secure-storage passphrase; migrate legacy SharedPreferences
- Core: FCM notifyUser on escalation, admin push-test, push metrics,
  DELETE session for multi-device logout
- Docs/roadmap B checkboxes updated; Linux SQLCipher apt notes

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:28:39 +00:00
cursor[bot] 6b06f1fde6
Merge pull request #7 from o0kuma/cursor/e2e-then-phase-b-382d
A3 E2E + Phase 1 B foundations (metrics, identity, data-flow)
2026-07-30 05:23:33 +00:00
Cursor Agent a51fc1490f
Start Phase 1 B: metrics, identity phrase, data-flow, sessions
- Record draft/escalate latency and error rates on /admin/metrics
- Add minimal /admin/dashboard and full message JSON on send
- Fix identity answers in ai-service with stable copy + tests
- Flutter DataFlowScreen + SessionsScreen; device-token API stub
- Update roadmap B checkboxes after A3 API E2E

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:08:08 +00:00
Cursor Agent 7dc4216dad
Record A3 E2E results and add API-level e2e script
scripts/e2e_a3.py exercises the messenger checklist against a live
core-backend (16/16). Mark A3 E2E done; keep Android UI steps in README.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 05:05:53 +00:00
cursor[bot] dcf6a006f9
Merge pull request #6 from o0kuma/cursor/a3-flutter-polish-382d
A3: Flutter messenger polish (conversations, contacts, L1, inbox)
2026-07-30 05:03:51 +00:00
Cursor Agent 5033cb56ea
Implement A3 Flutter polish: conversations, contacts, L1, inbox
Wire conversation list and contacts to A1 APIs, add tone-sample
onboarding skeleton, polish L1 approve UX with editable draft panel,
and add post-hoc escalation inbox. Update roadmap A3 checklist.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 04:55:22 +00:00
Cursor Agent 8c1f9f0b0c
Merge planning branch: Phase 1 A1/A2 APIs
Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 04:47:23 +00:00
cursor[bot] c8d10facec
Merge pull request #5 from o0kuma/cursor/phase1-a1-a2-apis-382d
Phase 1 A1/A2: conversation APIs, sessions, admin auth + roadmap plan
2026-07-30 04:47:21 +00:00
Cursor Agent b288d5ed90
Implement Phase 1 A1/A2 APIs and record build plan in roadmap
Add conversation/contact/history/escalation-log endpoints, contact-scoped
whitelist matching, bearer sessions, ADMIN_API_TOKEN guards, and
`go run . migrate`. Update Flutter client to persist/send session tokens
and mark A1/A2 complete in the prioritized checklist.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 04:47:06 +00:00
cursor[bot] 6986c4e15f
Merge pull request #1 from o0kuma/claude/project-planning-approach-ukdz31
Add planning approach and doc set for AI-twin messenger idea
2026-07-30 04:17:03 +00:00
cursor[bot] ace92e736a
Merge pull request #4 from o0kuma/cursor/flutter-client-skeleton-382d
Add Flutter mobile client skeleton; defer human PoC to last
2026-07-30 04:16:54 +00:00
Cursor Agent e1714ec5d5
Add Flutter mobile client skeleton and defer human PoC to last
Scaffold `mobile/` against core-backend APIs (signup, chat, draft,
veto, retract, autonomy/whitelist). Update roadmap/README/AGENTS so
participant PoC #1/#3 stays the final Phase 1 step after app build.

Co-authored-by: okuma <o0kuma@users.noreply.github.com>
2026-07-30 04:16:41 +00:00
Claude a741001197
화이트리스트 규칙 CRUD API + 메시지 되돌리기(undo) API 추가
화이트리스트 CRUD:
- POST/GET /users/:id/whitelist-rules, DELETE /users/:id/whitelist-rules/:ruleId
- Flutter의 자율성 설정 화면(roadmap.md 2.3)이 바로 붙여 쓸 수 있게
  준비. contact_id는 저장되지만 매칭 로직(whitelistMatches)은 아직
  전역 키워드만 봄 -- 대화방-연락처 연결 모델링 필요(기존에 문서화된
  한계, 그대로 유지)

되돌리기(one-tap undo, AGENTS.md 안전 불변식):
- Message.Retracted 필드 추가
- POST /messages/:id/retract -- 트윈이 자동발송한 메시지만 대상(사람이
  쓴 메시지는 400), 이미 되돌린 건 409
- 성공 시 같은 대화방 WebSocket에 {"type":"retraction", "id":...}
  브로드캐스트. 일반 메시지 브로드캐스트도 {"type":"message"}를 붙여서
  클라이언트가 두 이벤트를 구분할 수 있게 함

되돌리기 버튼/사후알림 UI 자체는 여전히 Flutter 쪽 몫으로 남아있음
2026-07-30 03:01:06 +00:00
Claude f79108b9cd
2.6 베타 배포 준비: 실제 초대 코드 시스템 + 운영 지표 + 거부권 안전 불변식 수정
발견한 문제(2.6 진행 중): 거부권(peer veto) 안전 불변식이 코드에 전혀
구현되어 있지 않았음. Contact.TwinDisabledByPeer는 스키마에만 있고
어디서도 읽거나 쓰지 않았고, tech-design.md §4는 "대화방 단위 플래그"
라는데 실제로는 상대(Contact) 단위로 모델링돼 있어 설계 문서와도
불일치. Conversation.TwinDisabledByPeer로 옮기고 POST
/conversations/:id/veto 추가, 메시지 발송 시 거부권 -> 에스컬레이션
-> 자율성 레벨 순으로 체크(앞 단계가 뒤 단계를 항상 이김)하도록 수정.

2.6 본작업:
- 초대 기반 가입: 기존엔 아무 문자열이나 처음 쓰면 통과돼서 실제로는
  초대 기반이 아니었음. InviteCode 테이블 + POST /invites(발급)
  추가하고 /auth/signup이 미리 발급된 미사용 코드인지 검증하도록 변경
  (모르는 코드 400, 이미 쓴 코드 409). 계정 삭제 시 코드는 "사용됨"
  상태를 유지한 채 유저 참조만 지움
- GET /admin/metrics 추가 -- 메시지 수(휴먼/트윈), 에스컬레이션
  사유별 집계, 거부권 발동률(vision.md 거부율 지표의 1차 근사),
  초대 코드 발급/사용 수. 생성 지연시간·오류율은 별도 계측 계층이
  없어 넣지 않고 문서에 명시

실제 베타 오픈 시점 자체는 roadmap.md §3(PoC 결과 필요)이 끝나야
정할 수 있어서 여전히 보류 -- 이번엔 서버 인프라만 준비함
2026-07-30 02:51:15 +00:00
Claude de8b44d536
2.5 QA: ai-service pytest 스위트 승격 + 자율성 플로우(L0~L2) 통합 테스트
ai-service:
- escalation_filter/retrieve_style/generation/main(FastAPI)의 ad-hoc
  TestClient 검증을 ai-service/tests/ 정식 pytest 스위트로 승격(34개).
  Gemini 호출은 mock, retrieve_style은 overlap이 recency를 항상
  이긴다는 것(과거 버그 재발 방지)까지 포함
- on_event(deprecated) -> lifespan 컨텍스트 매니저로 교체

core-backend: 자율성 플로우(L0->L1->L2) 통합 테스트를 쓰려면 실제 분기
로직이 있어야 해서, roadmap.md §2.2에서 미결로 남아있던 자율성 엔진
오케스트레이션 최소 버전을 이번에 구현:
- PATCH /users/:id/twin-settings -- 자율성 레벨 변경 (기본값 L0)
- 트윈 발송 시 에스컬레이션 통과 후 레벨 확인: L0는 항상 차단, L1은
  approved:true 필요, L2는 화이트리스트 매칭 시 즉시 자동발송·매칭
  없으면 L1과 동일하게 승인 필요. 에스컬레이션은 레벨/화이트리스트/
  승인 여부와 무관하게 항상 우선(테스트로 확인)
- 화이트리스트 매칭은 v1 최소 구현(전역 키워드 매칭, 상대별 예외는
  아직) -- 대화방↔연락처 연결이 모델링되지 않아 보류, README에 명시

온보딩·채팅·설정 수동 QA는 Flutter 클라이언트가 없어 이 환경에서는
보류, roadmap.md에 근거 남김
2026-07-30 02:37:36 +00:00
Claude 9041dc9b64
에스컬레이션 하드게이트 우회 구멍 차단 + 서버 측 삭제 플로우 추가
발견한 문제: POST /conversations/:id/messages가 sender_mode=twin을
검증 없이 그대로 저장·브로드캐스트하고 있었음 -- 에스컬레이션 게이트는
초안 생성(/draft) 경로에만 있었고 실제 발송 경로엔 없어서, 클라이언트가
/draft를 거치지 않고 바로 twin 메시지를 보내면 안전선을 완전히
우회할 수 있었다.

- ai-service: /draft와 별개인 POST /escalate/check 하드게이트 엔드포인트 추가
- core-backend: AIServiceClient.checkEscalation 추가, 메시지 저장 직전에
  twin 발송이면 무조건 호출하도록 해서 발송이 실제로 일어나는 단
  하나의 지점에서 막음. AI 서비스 응답 불가 시 fail-safe로 발송 차단.
  에스컬레이션되면 저장/브로드캐스트 없이 escalation_logs에만 기록.
  사람이 직접 보내는 메시지는 게이트 대상 아님
- core-backend: DELETE /users/:id 추가 -- 유저가 걸린 모든 행(트윈 설정·
  화이트리스트·연락처·대화참여·메시지·에스컬레이션로그·유저 본인)을
  트랜잭션으로 삭제 (tech-design.md §5 "사용자가 언제든 초기화 가능")
- 온디바이스 암호화·데이터 흐름 대시보드는 Flutter 클라이언트 책임이라
  이 환경에서는 보류, roadmap.md에 근거 남김
2026-07-30 02:26:02 +00:00
Claude fb06306d04
Go 코어에서 AI 서비스를 실제로 호출하는 연동 코드 추가
AIServiceClient.requestDraft가 ai-service/의 POST /draft를 호출하고,
core-backend에 POST /conversations/:id/draft 라우트를 추가해 프록시한다.
mock AI 서비스로 정상 응답·404(대화 없음)·400(스타일 소스 없음) 케이스를
테스트로 확인. roadmap.md Phase 1 §2.2 체크리스트 반영.
2026-07-30 02:15:32 +00:00
Claude e8cf48074f
Promote PoC scripts to the AI service (item 2.2)
ai-service/ wraps generate_draft/escalation_filter/retrieve_style
behind a single POST /draft endpoint that the Go core will call
internally. poc/tone-corpus/ stays untouched for corpus experiments
and blind-eval; this is the promoted copy meant for the real service.

Verified with TestClient: style_examples path, history/retrieval
path (confirms the earlier scoring fix still ranks the on-topic
exemplar first), escalation short-circuit, and 422 validation when
zero or both of style_examples/history are given.

Still missing: the Go core's actual HTTP client calling this service.
2026-07-30 02:09:19 +00:00
Claude 0abe97def8
Reorder build: AI service before Flutter client
2.3 (Flutter) needs a Flutter/Dart SDK this environment doesn't
have, so it can't be built or verified here the way core-backend
and the AI pipeline can. Swapping it with 2.2 (Python AI service)
keeps work unblocked instead of writing unverifiable Flutter code;
2.3 moves to wherever the user has the Flutter SDK installed.
2026-07-30 02:06:11 +00:00
Claude 3902597418
Implement core backend in Go (item 2 of the build order)
Ports the Python prototype (backend/) to the actual chosen stack --
Gin + gorilla/websocket + GORM, same DB schema (models.go mirrors
backend/app/models.py), same endpoints (signup, message send,
WebSocket relay). backend/ stays as a reference prototype, not
removed.

Verified with go test: signup, duplicate-invite-code rejection (409),
404 on an unknown conversation, and WebSocket broadcast delivery all
pass -- the same cases the Python version was checked against.

Push notifications, AI service integration, and multi-device sync
are not in this commit -- see core-backend/README.md.
2026-07-30 01:42:48 +00:00
Claude 87b9bf3505
Make explicit: PoC-dependent items wait until everything else is done
The build order already ended with the PoC-gated section, but it
wasn't stated as a hard rule. Now roadmap.md and AGENTS.md both say
not to touch Phase 1 §3 until items 1-5 of the build order are fully
finished, even if PoC data happens to land earlier -- no jumping the
queue to fill in a value early.
2026-07-30 01:37:24 +00:00
Claude 9cd86a4da5
Pin down why v1 is Android-only now that the client is Flutter
Flutter weakens the old "single platform = faster dev" argument for
skipping iOS, so tech-design.md §6/§8 now state the reasons that
still hold: v2's OS-layer notification access is Android-only by
Apple's own policy regardless of framework, and the dev environment
is Windows, so an iOS build isn't even possible right now. Flutter
still means no UI rewrite once a Mac is available later.
2026-07-30 01:34:01 +00:00
Claude 874e965665
Split backend into a Go core service + Python AI service
Reconsidered pure Go (would mean reimplementing and re-verifying the
already-tested AI pipeline) and pure Python (leaves perceived
performance/concurrency headroom on the table for a preemptive
scale bet). Landed on: Go handles auth/messaging/DB, Python keeps
owning generate_draft/escalation_filter/retrieve_style behind an
internal API. backend/ (Python) is now labeled a verified prototype
for the Go rewrite to match, not the final service.
2026-07-30 01:21:35 +00:00
Claude a1777516cf
Switch client stack from Android/Kotlin to Flutter/Dart
Native wasn't actually required for the v2 OS-layer notification
listener -- Flutter reaches it via platform channels like any other
native Android API, same pattern many production apps already use.
Flutter's faster iteration on the chat UI (already validated in the
click prototype) matters more for v1 than starting native. Updates
tech-design.md §8, roadmap.md's checklist, and AGENTS.md accordingly.
2026-07-30 01:12:51 +00:00
Claude 9a5358d0b1
Start Phase 1 backend skeleton (item 2 of the build order)
FastAPI app with invite-code signup, message send/relay over
WebSocket, and the DB schema from roadmap.md Phase 1 §2.1 (users,
contacts, conversations, messages, twin_settings, whitelist_rules,
escalation_logs). Defaults to SQLite for local dev, PostgreSQL in
prod per tech-design.md §8.

Verified end-to-end with TestClient: signup, duplicate-invite-code
rejection (409), message persistence, 404 on an unknown conversation,
and WebSocket broadcast delivery all behave as expected.

Push notifications and the AI pipeline integration (item 3) are not
in this commit -- see backend/README.md and roadmap.md's checklist.
2026-07-30 00:57:57 +00:00
Claude 94479a51d6
Decide Phase 1 tech stack and turn the plan into a working checklist
tech-design.md §8 settles the stack (Android/Kotlin, Python/FastAPI,
PostgreSQL, WebSocket relay, Room+SQLCipher) so it stops blocking
item 1 of the build order. roadmap.md's Phase 1 breakdown is now
checkboxes instead of prose, and AGENTS.md adds the rule to check/
update that checklist before and after any Phase 1 app-build task,
rather than tracking progress ad hoc.
2026-07-30 00:54:52 +00:00
Claude 3b595587cc
Break Phase 1 (actual app build) into a concrete workstream plan
PoC execution is on hold for now, so this splits Phase 1 into work
that's independent of PoC results (backend infra, client shell, AI
pipeline productionization) vs. values that genuinely need PoC data
(autonomy defaults, whitelist topics, trust UX copy) -- so
infrastructure work isn't blocked while PoC recruiting catches up.
2026-07-30 00:48:19 +00:00
Claude e05cd392cc
Add batch blind-eval harness and style retrieval, verified end-to-end
blind_eval.py runs PoC #1's blind-eval methodology over N held-out
corpus dialogues automatically (generate_draft.py refactored to
expose draft_reply() so both share the same drafting logic).
retrieve_style.py implements the keyword/recency search from
tech-design.md §2-1 and wires into generate_draft.py as --history,
replacing hand-curated --style files.

Bash access was intermittently restricted for part of this session
(auto-mode safety classifier), so these were initially written and
committed-pending without live execution. Now verified for real:
generate_draft.py's existing behavior still holds after the
draft_reply() refactor, blind_eval.py runs cleanly against val.jsonl,
and retrieve_style.py's original weighted-sum scoring had a real bug
-- recency drowned out keyword overlap for short Korean messages
(particle attachment means "핀란드" and "핀란드는" don't share a
token), so it was effectively returning the most recent messages
regardless of topic. Fixed by ranking on (overlap, recency) instead
of a weighted sum, confirmed the Finland-related exemplar now ranks
first for a matching query.
2026-07-29 09:20:41 +00:00
Claude bb720f0178
Add rule-based escalation gate before any LLM call
escalation_filter.py implements tech-design.md §3's first step as an
actual hard gate, not just a system-prompt instruction: money,
appointment-confirmation, and emotional content stop generate_draft.py
before it ever calls Gemini. Self-test 10/10; measured a 0.93% trigger
rate against 82,305 real corpus utterances (mostly factual price
mentions, not personal money requests -- noted as an upper bound, not
a real-usage estimate).
2026-07-29 08:56:12 +00:00
cursor[bot] 2e848c66fa
Merge pull request #3 from o0kuma/cursor/add-env-gemini-key-382d
Add .env template for GEMINI_API_KEY
2026-07-29 08:42:12 +00:00