用户真正缺少的不是更多建议或更多内容,而是两件事的组合:在迷茫时被承接、被初步判断,以及在决策时看到与自己此刻处境高度相关的他人经验。
ChatGPT 能承接迷茫却给不出真人经验;小红书/知乎有真人经验却承接不了迷茫、也不精准。Possibility 把两者串成一条漏斗——AI 对话承接前者,经验匹配负责后者,在急性时刻用一次性买断变现。
迷茫进入(急性、尚未成形的纠结)
→ AI 对话承接:缓解焦虑 + 采集背景 + 给出初步判断
→ 困惑被逐步澄清成一个具体的岔路口
→ 系统形成可反驳的当前状态理解与匹配条件
→ 【付费墙 · 单次买断 ¥9.9】解锁 3 条相关但结局不同的真实经验
→ 用户获得校准并选择一个低成本现实行动
→ 行动反馈更新动态自我理解
- 相对 ChatGPT:我们不止给泛化建议——我们匹配真实亲历者的结构化经验,说清"为什么推荐给你"以及"哪类人不应照搬"。
- 相对内容平台:我们不靠关键词搜索——AI 先理解你的状态(人生节点 · 现实约束 · 核心张力 · 决策阶段 · 支持需求),再做精准匹配。
- 相对职业咨询:我们立场中立——不替用户做决定,不为某个下游服务背书,甚至可能帮你得出"你现在还不需要做这件事"。
- 相对心理咨询:我们没有临床责任——更像一次 coffee chat,平等交换经历,不诊断、不治疗。
岔路口是低频、高痛、一次性的需求。用户愿意在最痛的点一次性买"方向感",但一个几年才用一次的能力很难支撑持续订阅。买断制对上了需求的时间形状。
三个客户端功能对等,共用同一套 Supabase 后端与数据契约。iOS 是设计基准,Android / Web 以其为标准复刻——同一个功能不会出现三种交互逻辑。
┌── iOS (SwiftUI) ──┐ ┌── Android (Compose) ──┐ ┌── Web (Next.js 15) ──┐
│ iOS 17+ │ │ minSdk 26 │ │ React 19 · TW 4 │
│ @Observable │ │ supabase-kt │ │ App Router · zustand │
└─────────┬─────────┘ └───────────┬───────────┘ └───────────┬───────────┘
│ │ │
│ Home · Chat · Lab · Community · CardGame · Studio · Diary · Me
│ Auth(匿名 + Apple)· Profile(旅人主页 · 付费墙)
└────────────────────────┼──────────────────────────┘
│ JWT(Auth)· SSE(流式对话)
▼
┌──────────────────────────── Supabase ───────────────────────────────────┐
│ Auth Postgres 17 + RLS Storage(音频) Edge Functions │
│ 匿名/Apple 33 migrations 29 个(Deno TS)│
└───────────────────────────────────┬─────────────────────────────────────┘
│ 密钥只存 Function Secrets
┌─────────────────────────┼──────────────────────┐
▼ ▼ ▼
DeepSeek v4-flash Azure AI Speech Langfuse · Sentry
(Vercel AI SDK) (语音转写) (LLM 追踪 · 错误)
Web 已不是 demo。
web/曾是纯静态 mock,现已是完整的 Next.js 15 产品应用(App Router + 设计 token + cva 组件基元),直接消费packages/api-client。
匿名登录 → auth.uid() + JWT
↓
首页发问 → POST /chat(流式 SSE)
↓ 打字机输出 + 并行抽取画像 / 岔路口信号
岔路口成形(crossroads.ready == true)
↓
前端呈现「看看走过这条路的人」→ 万花筒抽人动画
↓
POST /match → 结构化输出 → 3 位结局不同的旅人 + 匹配理由
↓
旅人主页 → 付费墙 ¥9.9 → 解锁完整经验 + 现实行动
付费当前是 demo mock 解锁(写
unlocks表),真实 IAP 见路线图。
日记不在请求里同步处理——录音落 Storage 后入队,重活全在 diary-worker 里做。
面向客户端的函数只负责建条目、入队和读结果,所以请求永远快速返回,转写慢或模型抖动都不会卡住 UI:
录音 → create-diary-entry(建条目 + 上传票据)→ Storage
→ finalize-diary-entry(入队 transcribe 任务)
│
▼
diary-worker(内部队列消费者,x-diary-worker-secret 鉴权)
├─ Azure Speech 转写 → status: transcribed
├─ 分析(情绪/关键词/画像提案)→ status: ready
└─ 月/年洞察聚合 → LLM 失败时降级为统计文案
客户端侧:diary-summary 只负责入队与取结果;analyze-diary 是直接文本分析的同步入口
| 层 | 选型 | 说明 |
|---|---|---|
| iOS | Swift + SwiftUI(iOS 17+,@Observable) |
设计基准端;原生签名动画(光球/万花筒/转盘/波形) |
| Android | Kotlin + Jetpack Compose + supabase-kt | compileSdk 35 / minSdk 26,以 iOS 为标准全量复刻 |
| Web | Next.js 15 + React 19 + Tailwind 4 | App Router、cva 组件基元、zustand、framer-motion |
| 流式聊天 | SSE(iOS 走 URLSession.bytes) |
绕过 functions.invoke 的缓冲,实现打字机效果 |
| 后端 BaaS | Supabase(Postgres + Auth + Storage + Edge Functions) | 一站式后端,匿名登录起步 |
| Edge Functions | TypeScript / Deno 2 | 29 个函数,26 个强制 verify_jwt |
| LLM | DeepSeek v4-flash(Vercel AI SDK ai@7) |
对话 / 结构化 / 日记三个模型槽位,可独立灰度 |
| 结构化输出 | JSON Schema 约束 | _shared/schemas.ts 10 套契约,不裸解析模型输出 |
| 语音转写 | Azure AI Speech Fast Transcription | 密钥仅存 Function Secrets |
| 可观测性 | Langfuse(OTel)· Sentry · PostHog · app_events |
LLM 追踪 / 错误 / 产品埋点 / 自有事件四层 |
| 数据库 | Postgres 17 + RLS | 33 个 migration,行级安全,4 套 RLS 测试 |
| 配置管理 | Doppler(possibility 项目 · dev/stg/prd) |
唯一密钥源,单向同步到 Supabase Secrets |
| CI/CD | GitHub Actions | 5 条流水线,按路径触发;合入 main 自动部署 |
模型槽位:
DEEPSEEK_CHAT_MODEL/DEEPSEEK_STRUCTURED_MODEL/DEEPSEEK_DIARY_MODEL默认都指向deepseek-v4-flash(延迟与成本优先),保留三个独立变量是为了单场景灰度换模型。
以下模块三端均已实现(ios/…/Features/、android/…/features/、web/features/ 一一对应)。
| 模块 | 做什么 |
|---|---|
| Home · 认识自己 | AI 对话前门:承接迷茫 → 初步判断 → 澄清岔路口;画像在对话中自然沉淀,无需填表 |
| Chat · 探索对话 | 流式 SSE 对话,并行抽取画像与岔路口信号 |
| Lab · 人生实验室 | 转盘选年限(1–10 年)+ 选择卡拖入 → 推演一般 / 乐观 / 警示三种未来 + 底线分析 |
| Community · 万花筒社区 | 万花筒抽取动画(六瓣折光)、悬赏问答发布/回应、围观模式 |
| CardGame · 卡牌游戏 | 自我探索游戏化,含压力/强制交换机制与 AI 叙事生成,结果持久化 |
| Studio · 画像工作室 | 多维测评、上下文扫描、评估结果可视化 |
| Diary · 语音日记 | 录音 → 转写 → 情绪分析 → 画像提案;周历/月报 LLM 洞察 |
| Me · 我的主页 | 公开主页编辑、隐私可见性控制、云端同步 |
| Profile · 旅人主页 | 匹配结果详情、付费墙、完整经验与现实行动 |
| Auth · 账号 | 匿名登录起步 + Apple 登录;手机验证码与匿名合并代码保留但当前休眠 |
| 依赖 | 版本 | 用途 |
|---|---|---|
| Node.js | ≥ 18 | 脚本与 workspace |
| pnpm | 10.34.1 | 包管理器(根 packageManager 已锁定) |
| Deno | 2.x | Edge Functions 开发与检查 |
| Supabase CLI | ≥ 2.109 | 本地数据库与部署 |
| Docker | — | 本地 Supabase 依赖 |
| Xcode | 15+ | iOS 构建(仅 macOS) |
| JDK | 17 或 21 | Android 构建(尚不支持 JDK 25) |
pnpm install # 安装 workspace 依赖
pnpm run db:start # 启动本地 Supabase(Postgres + Auth + Storage)
pnpm run db:reset # 应用 33 个 migration + seed
cp supabase/functions/.env.example supabase/functions/.env
# 编辑 .env,至少填入 DEEPSEEK_API_KEY;语音日记还需 AZURE_SPEECH_*
npx supabase functions serve --env-file supabase/functions/.env
pnpm test # 全量后端检查:fmt + lint + 类型 + 单测
pnpm run db:test # 4 套 RLS / 数据隔离测试open ios/Possibility.xcodeproj # 已配置线上 Supabase 回落,拉取即可直连云端
# Xcode → 选 iOS 17+ 模拟器或真机 → Build & Run连本地后端:复制 ios/Config/Config.xcconfig.example → Config.xcconfig,填入本地
SUPABASE_URL / SUPABASE_ANON_KEY,然后 cd ios && xcodegen generate。
Possibility.xcodeproj虽然入库,但唯一事实来源是project.yml——改目录或加文件后必须重跑xcodegen generate,不要在 Xcode 里手工调工程设置(会被下次生成覆盖)。详见ios/README.md。
cd android && ./gradlew assembleDebug需要 ANDROID_HOME 已配置。后端配置经 BuildConfig 注入,可用 Doppler 覆盖。详见 android/README.md。
pnpm --filter @possibility/web dev # 本地开发
pnpm --filter @possibility/web typecheck # 类型检查
pnpm --filter @possibility/web lint:tokens # 设计 token 护栏
⚠️ 密钥红线:DEEPSEEK_API_KEY、AZURE_SPEECH_KEY等绝不进 App / 前端 / 仓库, 只存 Supabase Function Secrets(源头在 Doppler)。客户端只持 anon key,受 RLS 约束。
顶层按「交付物」切分:ios/ android/ web/ flash-app/ 四个可独立构建的前端,supabase/ 一个后端,
packages/ TS 共享层,scripts/ 工具脚本。
所有不进产物的资料(文档 / 设计稿 / 原型 / 宣传物料 / demo 视频工程)统一收在 docs/ 一个目录下。
possibility/
├── ios/ # iOS App(SwiftUI)—— 标准 Xcode 布局
│ ├── Possibility.xcodeproj/ # 由 project.yml 生成,勿手改工程设置
│ ├── Possibility/ # ← app target 源码根(与 target 同名)
│ │ ├── App/ # 入口 · 配置 · 导航路由
│ │ ├── Core/
│ │ │ ├── Analytics/ # 埋点四层:Analytics · PostHog · Sentry · SupabaseEvent
│ │ │ ├── DesignSystem/ # Theme · 组件 · 四个签名动画
│ │ │ ├── Models/ # 数据模型 · DemoData(断网兜底)
│ │ │ ├── Network/ # SupabaseService · ChatStreamClient
│ │ │ └── Utilities/
│ │ ├── Features/ # Home Chat Lab Community CardGame Studio Diary Me Auth Profile
│ │ └── Resources/
│ ├── PossibilityTests/ # 单测(Swift Testing)
│ ├── PossibilityUITests/ # UI 测试 · App Store 截图
│ ├── Config/ # Base.xcconfig(入库)· Config.xcconfig.example
│ └── project.yml # xcodegen 工程定义(唯一事实来源)
│
├── android/ # Android App(Kotlin + Compose + supabase-kt)
│ └── app/src/main/java/app/possibility/android/
│ ├── features/ # 与 iOS 一一对应的 10 个模块
│ └── ui/ # 设计系统与共享组件
│
├── web/ # Web 产å“
8000
�应用(Next.js 15 · React 19 · Tailwind 4)
│ ├── app/(app)/ # App Router 路由:chat lab community card-game diary studio me …
│ ├── features/ # 与 iOS 对应的功能实现
│ ├── components/ui/ # cva 组件基元(button/card/sheet/…)+ OrbView
│ ├── lib/ # supabase · chat-stream · theme · demo-data
│ └── scripts/ # check-design-tokens.mjs(设计 token 护栏)
│
├── supabase/ # 后端
│ ├── migrations/ # 33 个 SQL migration
│ ├── functions/ # 29 个 Edge Function(Deno TS)
│ │ ├── _shared/ # 公共层:llm · schemas · auth · sse · telemetry · sentry …
│ │ ├── chat/ match/ simulate/ lab-choices/ # 对话与推演
│ │ ├── create-diary-entry/ … diary-worker/ # 语音日记流水线
│ │ ├── save-profile/ get-profile/ profile-privacy/ persona/
│ │ ├── card-game-catalog/ card-game-session/ card-game-result/
│ │ └── community/ list-conversations/ list-diary/ delete-account/ …
│ ├── analytics/ # 分析 SQL:funnel · retention · llm_cost · observability
│ ├── tests/ # 4 套 RLS 集成测试
│ ├── seed.sql # 种子数据(12 位旅人)
│ └── config.toml # 项目配置(含每函数 verify_jwt)
│
├── packages/ # TS 共享层(pnpm workspace)
│ ├── shared-types/ # supabase gen types 产物 + Edge Function 名称契约
│ └── api-client/ # Supabase 客户端 + Edge Function 调用封装
│
├── flash-app/ # 灵光 App(Vite + React,独立工程链,自带 CLAUDE.md)
│
├── docs/ # ← 所有不进产物的资料,只此一处(索引见 docs/README.md)
│ ├── product/ # 产品定义与 PRD
│ ├── engineering/ # 技术设计 · 后端架构 · 埋点方案(Swift/TS 镜像的唯一事实来源)
│ ├── features/ # 单功能模块设计
│ ├── design/ # 品牌标记 · 原型 · 设计稿 · 图标 · 上架截图 · 图片母版
│ ├── marketing/ # 海报 · 人生决策扑克牌
│ └── demo-video/ # 产品 demo 视频的 Remotion 工程(独立 npm 工程)
│
├── scripts/ # 工具脚本
│ ├── gen_seed.mjs # 从原型生成 seed.sql
│ ├── gen-types.sh # Supabase → TS(packages/shared-types)+ Swift
│ ├── gen-xcconfig.sh # doppler run -- 生成 ios/Config/Config.xcconfig
│ ├── doppler-sync.sh # Doppler → Supabase Function Secrets 单向同步
│ ├── sync-assets.sh # docs/design/assets 母版 → iOS xcassets + web/
│ └── verify_db.sh # 无 CLI 环境下校验迁移
│
├── doppler.yaml # Doppler 作用域(possibility/dev)
├── pnpm-workspace.yaml # pnpm workspace:packages/* + web
├── .github/workflows/ # ci · web · android · packages · deploy
└── package.json # 根构建脚本
| 文档 | 讲什么 |
|---|---|
docs/README.md |
全部非产物资料的索引(先看这个) |
docs/design/brand/README.md |
品牌标记:造型/配色说明、各尺寸导出与候选方案 |
ios/README.md |
iOS 目录结构、xcodegen 约定、构建与签名 |
android/README.md |
Android 环境要求与构建 |
supabase/README.md |
后端函数职责说明 |
flash-app/README.md |
灵光赛道独立工程 |
docs/demo-video/README.md |
Demo 视频的 Remotion 工程与剪辑约定 |
- 不进产物的资料只放
docs/—— 文档、设计稿、原型、宣传物料、demo 视频工程全部收在这一个目录下, 根目录不再新增assets/design/之类的平级目录。 - 目录名一律 ASCII(进路径 / CI / URL),文档文件名保留中文。
supabase/必须在仓库根 —— Supabase CLI 按此定位工程。docs/design/assets/是共享图片的唯一母版;iOS 的Assets.xcassets与web/assets/都是 由scripts/sync-assets.sh分发的副本(Xcode 和静态托管都需要真实文件,不能用符号链接)。 改图只改母版再跑同步。flash-app/是灵光赛道的独立工程,有自己的 lint / tsconfig / CLAUDE.md,不受根目录约定管辖, 也不在 pnpm workspace 内。docs/demo-video/同理,是独立 npm 工程。
⚠️ 本仓库在~/Documents下,处于 iCloud Drive 同步范围。git 批量重命名目录时 iCloud 会 留下空的xxx 2副本(无内容,未跟踪)。执行大规模目录调整后用find . -not -path './.git/*' -name '* [0-9]' -type d -empty -delete清理, 或把仓库移出~/Documents彻底避免。
| 命令 | 说明 |
|---|---|
pnpm test |
全量后端检查(fmt + lint + 29 个入口类型检查 + 单测) |
pnpm run backend:fmt |
格式化后端代码 |
pnpm run backend:check |
同 pnpm test |
pnpm run db:start |
启动本地 Supabase |
pnpm run db:reset |
重建数据库(migration + seed) |
pnpm run db:test |
4 套 RLS / 数据隔离测试(rls · diary_v2 · profile_privacy · card_game) |
pnpm run packages:typecheck |
共享包类型检查 |
pnpm run gen:types |
Supabase schema → TS + Swift 类型 |
pnpm run doppler:sync |
Doppler → Supabase Function Secrets 单向同步 |
pnpm run seed:generate |
从原型重建种子数据 |
统一请求头(verify_jwt 函数):
Authorization: Bearer <supabase-user-jwt>
apikey: <supabase-anon-key>
Content-Type: application/json29 个函数按域分组,全部 POST。带 🤖 的会调用 LLM。
| 域 | 函数 |
|---|---|
| 对话与推演 | 🤖 chat(流式 SSE + 并行画像/岔路口信号)· 🤖 match(3 位旅人匹配 + 可解释理由)· 🤖 simulate(三种未来推演)· 🤖 lab-choices(实验室选择卡) |
| 语音日记 | 🤖 diary-worker(队列消费:转写 + 分析 + 洞察)· 🤖 analyze-diary(直接文本分析)· create-diary-entry · finalize-diary-entry · diary-summary(入队) · retry-diary-entry · update-diary-transcript · diary-audio-url · delete-diary-entry · delete-diary-audio · export-diary · list-diary |
| 画像与主页 | save-profile · get-profile · profile-privacy · 🤖 persona(动态数字形象)· 🤖 analyze-self-discovery(喜欢 × 擅长证据综合) |
| 卡牌游戏 | card-game-catalog(公开目录) · card-game-session · 🤖 card-game-result(AI 叙事) |
| 社区与会话 | 🤖 community(万花筒/悬赏/旅人)· list-conversations |
| 账号 | delete-account · merge-anonymous(休眠) · send-sms-hook(休眠) |
JWT 例外(3 个,均有替代鉴权):
| 函数 | 为什么不校验 JWT | 怎么鉴权 |
|---|---|---|
card-game-catalog |
公开卡牌目录,未登录也要能看 | 只读已发布目录,不碰用户数据,带公开缓存头 |
diary-worker |
内部队列消费者,无用户上下文 | x-diary-worker-secret 头 |
send-sms-hook |
Supabase Auth Webhook,无用户 JWT | standardwebhooks 签名校验 |
核心表设计遵循两大原则:
- 内容侧(公开只读):
travelers、traveler_details、traveler_services、bounties - 用户侧(RLS 锁到
auth.uid()):profiles、profile_facts、conversations、messages、diary_entries、simulations、unlocks、卡牌 session/result —— 仅本人可访问
RLS 不是可选项:supabase/tests/ 下 4 套测试专门验证跨用户读写全部被拒。
- 密钥隔离:
DEEPSEEK_API_KEY/AZURE_SPEECH_KEY只存 Function Secrets(源头 Doppler),客户端只持受 RLS 约束的 anon key - JWT 校验:29 个函数中 26 个
verify_jwt = true,3 个例外各有替代鉴权(见上表) - RLS 二次约束:写库经行级安全策略再次验证
auth.uid(),不信任函数层判断 - 输入校验:
_shared/validate.ts统一长度与类型上限(message 4000 字符、transcript 20000、topic 40) - 结构化输出:11 套 JSON Schema 约束模型输出,不裸解析
- 内容红线:编码进 system prompt —— 不做诊断、不替用户决定、识别高风险转介
四层各司其职,契约的唯一事实来源是 docs/engineering/埋点方案.md——
Swift / Kotlin / TS 三端镜像必须跟随该文件改动:
| 层 | 工具 | 看什么 |
|---|---|---|
| 产品埋点 | PostHog | 漏斗、留存、功能使用 |
| 自有事件 | Supabase app_events 表 |
可 SQL 关联业务数据的原始事件 |
| 错误上报 | Sentry | 客户端与 Edge Function 异常 |
| LLM 追踪 | Langfuse(OpenTelemetry) | prompt / 响应 / token / 成本 / 延迟 |
supabase/analytics/ 下备有现成 SQL:funnel.sql · retention.sql · llm_cost.sql · observability.sql。
Sentry / Langfuse 未配置时对应模块静默关闭——可观测性不可用,但绝不阻断请求或部署。
- 三端对齐:iOS 是设计与交互基准,Android / Web 复刻;同一功能不允许三种逻辑
- 状态分治:服务端状态经各端 Service 层缓存;UI 状态留在各 Feature Model / store
- 真实优先 + 静默回退:接口失败时静默回退到
DemoData,不白屏 - SSE 直连:聊天不走
functions.invoke(会缓冲),直连函数 URL 读流 - 签名动画原生实现:光球 / 万花筒 / 转盘 / 波形各端原生重建,支持
reduceMotion - Web 设计 token 护栏:
lint:tokens在 CI 拦截绕过 token 的硬编码样式
合入 main 即自动部署,无需手工执行任何 Supabase 命令。.github/workflows/deploy.yml 依次完成:
supabase link 关联生产项目
supabase db push --include-all 推送迁移(含时间戳早于远端的并行 PR 迁移)
scripts/doppler-sync.sh prd Doppler → Function Secrets 单向同步
supabase functions deploy 部署全部 Edge Functions
唯一的 GitHub Secret 是 DOPPLER_TOKEN(scoped 到 possibility/prd),其余凭据全部由 doppler run 注入。
工作流带 concurrency: production-deploy,同一时间只跑一个生产部署。
全部由 Doppler(项目 possibility,dev/stg/prd 三环境)统一管理。
doppler-sync.sh 只排除 DOPPLER_ / SUPABASE_ 前缀,其余键全量同步到 Function Secrets——加新变量不需要改部署脚本。
| 变量 | 位置 | 说明 |
|---|---|---|
SUPABASE_URL / SUPABASE_ANON_KEY |
Edge Runtime 自动注入 | 项目 URL 与匿名 Key |
DEEPSEEK_API_KEY |
Function Secrets | 必需,LLM 密钥 |
DEEPSEEK_BASE_URL |
可选 | 默认 https://api.deepseek.com |
DEEPSEEK_CHAT_MODEL / _STRUCTURED_MODEL / _DIARY_MODEL |
可选 | 三个模型槽位,默认均为 deepseek-v4-flash |
AZURE_SPEECH_KEY / AZURE_SPEECH_ENDPOINT |
Function Secrets | 语音转写;禁止放入 Web 环境变量 |
AZURE_SPEECH_API_VERSION / AZURE_SPEECH_LOCALES |
可选 | 默认 2025-10-15 / zh-CN,en-US |
DIARY_WORKER_SECRET |
可选 | Cron 触发 diary-worker;留空则复用 service-role |
DIARY_DAILY_ENTRY_LIMIT |
可选 | 单用户日记日配额,默认 30 |
SENTRY_DSN / SENTRY_ENVIRONMENT |
可选 | 未配置时错误上报静默关闭 |
PR 按路径触发,互不干扰:
| 工作流 | 触发路径 | 做什么 |
|---|---|---|
ci.yml |
supabase/** scripts/** package.json |
Deno fmt / lint / 28 入口类型检查 / 单测;启本地库跑迁移 + RLS 测试 |
web.yml |
web/** packages/** |
类型检查 + 设计 token 护栏 |
android.yml |
android/** |
assembleDebug |
packages.yml |
packages/** |
共享包类型检查 |
deploy.yml |
push 到 main |
生产部署(见上) |
| 原则 | 含义 |
|---|---|
| AI 是前门,不是四个功能之一 | chatbot 承接迷茫、驱动漏斗;经验匹配是对话之后的环节 |
| 提炼而不是定义 | AI 帮用户看见自己,不贴固定人格标签 |
| 可反驳 | 用户可以认领、修正或否决系统对自己的理解 |
| 结局多样 | 推荐成功/失败/延迟/返回等多种结局,避免确认偏误 |
| 行动导向 | 产品最终目标是推动现实行动,不是继续消费内容 |
| 推演不是预言,是一面镜子 | 帮你注意到自己的反应,不替你做决定 |
| 三端对齐优先于单端最优 | 交互差异要有理由(平台惯例),不能是实现方便 |
- pgvector 精准匹配:travelers 加 embedding,余弦召回 + LLM 解释(当前为纯 LLM 匹配)
- StoreKit 2 IAP:接入真实支付(consumable),替换当前的 demo mock 解锁
- 供给侧录入:结构化经验贡献后台(12 字段人生经验节点)
- 画像资产:认领/反驳/修正 + 行动回访,沉淀动态人生说明书
- 恢复手机验证码登录:
send-sms-hook/merge-anonymous代码已就位,当前休眠 - 轻玄学入口:答案之书/抛硬币作为免费"照见反应"投射前端
- 创建功能分支(
git checkout -b feat/amazing-feature) - 本地跑通对应检查(后端
pnpm test/ Webtypecheck+lint:tokens/ AndroidassembleDebug) - 提交变更(
git commit -m 'feat(web): 添加惊喜功能') - 推送并创建 Pull Request,等待路径对应的 CI 通过
提交信息遵循中文 Conventional Commit 风格,scope 用交付物名:
feat(ios)/fix(android)/perf(web)/refactor(backend)/chore(docs)
本仓库尚未声明开源许可。在补充 LICENSE 文件之前,按默认版权处理——保留所有权利,
不授予复制、修改或再分发的许可。
Possibility — 不替你做决定,帮你把"要不要做"这个前置问题想清楚。