Skip to content

feat: 熵减 Entropydecrease 品牌迁移与全仓规范化重构 - #1

Merged
Aparencia merged 6 commits into
mainfrom
dev
Jul 30, 2026
Merged

Aparencia merged 6 commits into
mainfrom
dev

Conversation

@Aparencia

Copy link
Copy Markdown
Owner

概要

熵减 Entropydecrease 品牌迁移与全仓规范化重构成果合入生产分支,共 4 个提交,续接课伴 v0.24.0 历史。

变更内容

品牌与结构

  • 客户端 / AI 网关 / 同步服务 / 官网 / CI 全链路品牌重命名(用户数据标识 keban.db 等永久豁免保留)
  • Go module keban/sync-service → entropydecrease/sync-service
  • docs 重组:10 目录 86 文件 → 4 目录 51 文件(standards / product / versions / templates)

规范合规(依 docs/standards/ai-coding.md 七维度)

  • §1 巨型文件拆分归零:config.py(625)、main.py(416)、qwen_provider.py(415)、multimodal.py(388)、learning.py(365)、sync.go(372)、websocket.go(345)、generate-sounds.mjs(686)、session-detect.mjs(376) 等
  • §3 @ai-context 中英双语注释全覆盖
  • 公共 API 保持零改动(兼容 re-export / 多重继承 / include_router)

Git 策略(依 docs/standards/git-workflow.md)

  • main(生产,触发 semantic-release)/ dev(开发主线)双分支
  • husky + lint-staged + commitlint,type 集合对齐 .releaserc releaseRules
  • CI 触发分支 master → main,pr-check PR 目标 [main, dev]

缺陷修复

级别 内容
阻塞 client/public/ 全部 54 文件(42 音效 + 6 音轨 + PWA 图标 + 离线页)与 client/src/styles/ 4 文件此前未迁移(tokens.css / performance.css 为构建期硬依赖)
高危 nginx 缺 /api/v1/asr/ location,生产环境语音转写必然 404(源项目同缺)
高危 electron-builder.yml owner 为占位符 YourGitHubUsername,会导致客户端永远检查不到更新
高危 部署工作流四处失效:路径大小写/层级错误、缺 --env-file 致密码为空、代码从未上传服务器、docker-compose rollback 为不存在的命令
存量 course_detect.py 语法错误、测试 patch 名不匹配(修复后 pytest 由 25 收集错误变为 133 通过)

验证

项 结果
client 双 tsc 0 错
client lint 0 错误(108 警告存量)
client npm run build 通过(PWA precache 343 条)
ai-gateway pytest 130 通过 / 3 失败(TestJWTDevMode 依赖真实网络取 JWKS,源项目同样失败,存量)
sync-service go build / go vet / go test 全绿
website npm run build 通过,9 静态页生成
安全审查 本地审计(密钥卫生、Electron 7/7、JWT 双服务、nginx 安全头/限流、端口隔离)全 PASS;云端扫描 3 批无问题

合并后将触发

  • version-release → semantic-release 按 Conventional Commits 计算新版本并发 Release
  • deploy-server → scp 上传 server/ 并 up -d --build,健康检查 ai-gateway(8000) 与 sync-service(8080)
  • deploy-website → 构建静态站上传 /opt/Entropydecrease/website 并重启 nginx,冒烟校验首页含「熵减」

服务器端已完成 /opt/Entropydecrease 目录准备(server/ 含 compose 与 .env.production,website/ 为静态目录),旧 /opt/keban/website 暂留作回滚兜底。

已登记技术债(不阻塞)

生产 CORS_ORIGINS:-* 通配默认、WS CheckOrigin 恒真、两个 Dockerfile 未设非 root USER、gateway JWT 开发降级模式、npm/Go 高危依赖待专项升级、index.css 927 行、TestJWTDevMode 需改 mock JWKS。详见 docs/product/migration-spec.md 第十五章。

迁移阶段 1-15 全量成果续接课伴历史:品牌重命名(客户端/网关/同步服务/官网/CI)、巨型文件拆分归零(§1)、@ai-context 全覆盖(§3)、docs 重组(10 目录→4)、main/dev 分支策略落地(.releaserc/workflows/husky+commitlint)、仓库更名联动修复(electron-updater 源/官网链接)。用户数据标识(keban.db 等)永久豁免保留。
完整性审查发现并修复三项:

1) client/public 全量 54 文件(42 音效 wav + 6 音轨 mp3 + PWA 图标 + 离线页)
   与 client/src/styles 4 文件此前完全未迁移。其中 tokens.css 被 index.css
   @import、performance.css 被 main.tsx import,均为构建期硬依赖——此前仅跑
   tsc --noEmit 无法暴露,本次首次执行完整 vite build 才发现。

2) nginx 缺 /api/v1/asr location:客户端 3 处调用 /api/v1/asr/transcribe,
   gateway routers/transcribe.py 有该前缀,但请求会落入 location / 静态站点
   返回 404,导致生产环境语音转写完全不可用(源项目同缺,属存量缺陷)。

3) scripts 三个原样复制脚本补齐 @ai-context 中英双语注释(§3)。

验证:client 完整构建通过(PWA precache 343 条)、双 tsc 0 错、node --check 全过。
新增第十五章:
- 15.1 Git 策略:main/dev 分支、续接课伴历史(31 tag 保留)、CI/发布配置改造、
  husky+commitlint 拦截冒烟、密钥卫生门禁、仓库更名销项、待用户执行的 GitHub 侧步骤
- 15.2 完整性审查发现:2 阻塞(client/public 54 文件、src/styles 4 文件未迁移)
  + 1 高危(nginx 缺 /api/v1/asr location)+ 1 低危,均已修复
- 15.3 验证矩阵:五模块结果与 TestJWTDevMode 存量失败根因(依赖真实网络)
- 15.4 安全审查:本地审计全 PASS + 云端扫描 3 批无问题
- 15.5 技术债清单 9 项(CORS 通配默认、WS CheckOrigin、Dockerfile root、
  JWT 降级模式、npm/Go 高危依赖、index.css 927 行等)
依据服务器实测结构(/opt/Entropydecrease/server 存放 compose 与 .env.production,
website 静态目录为 /opt/Entropydecrease/website,且该目录非 git 仓库)修正部署链路:

1) 路径大小写与层级:全部 /opt/entropydecrease → /opt/Entropydecrease,
   deploy-server 的 cd 目标补上 server 子目录。Linux 路径大小写敏感,
   原配置会让部署在第一步 cd 即失败。

2) 缺少 --env-file:原脚本裸跑 docker-compose,不加载 .env.production,
   导致 DB_PASSWORD/REDIS_PASSWORD 等被解析为空串(服务器实测已出现该 WARN)。
   现统一为 docker compose -f docker-compose.prod.yml --env-file .env.production。

3) 代码从未上传:原工作流仅 ssh 执行 pull+up,而 CI 内 docker build 产出的镜像
   从未 push 到任何 registry,服务器也不是 git 仓库——新代码永远无法上线。
   现改为 scp 上传 server/ 源码后 up -d --build 重新构建自建服务。
   scp 的 rm 保持 false:服务器上的 .env.production 为真实生产密钥且不在仓库内,
   删除目标目录会导致密钥永久丢失。

4) 假回滚命令:docker-compose rollback 并非有效子命令,健康检查失败时只会报
   unknown command 而不产生任何回滚。现改为输出容器日志便于定位,
   并将 sync-service 也纳入健康检查;真正回滚由 revert 提交重新触发部署完成。
CI 的 ruff 检查暴露出一个迁移引入的运行时缺陷(源项目 188 个 ruff 错误、
目标 204 个,该检查在源项目从来就是红的,掩盖了真问题):

1) routers/learning.py 缺失 3 个 schema 导入(F821 undefined-name)
   阶段 11 把内联模型抽到 learning_schemas.py 时,AnchorPointItem /
   PredictItem / RescueLevelItem 未列入导入清单。这三个名字只在函数体内
   被构造,import routers 与既有测试都不会触发,但一旦调用
   anchor-point / predict / rescue 端点即 NameError → 500。

2) tests/conftest.py fixture 名称不一致(存量,源项目同样)
   内部定义 fake_call,却 setattr/return fake_call_with_fallback,
   该 fixture 一旦被使用即 NameError。

3) tests/test_e2e_auth.py TestJWTDevMode 依赖外网(§7 测试隔离)
   fixture 只清空 jwt_secret,但 _jwt_verification_configured() 在
   ES256 下检查的是 supabase_jwks_url/supabase_url,导致用例走真实验证
   路径去拉 JWKS,离网必败。按同文件 TestJWTPassthrough 的既有范式补齐
   算法与端点隔离,令其真正进入被测的开发降级模式。

4) routers/balance.py 删除死变量 providers_state(F841)

新增 server/ai-gateway/ruff.toml 显式锁定规则集为 pyflakes + pycodestyle
错误级(E4/E7/E9/F):ruff 0.16 起默认集纳入 BLE/RUF/UP/DTZ 等风格规则,
不显式声明会让 CI 在依赖升级后突然变红。测试目录豁免 E402(须先
sys.path.insert 注入根目录)与 F401/F403/F405,兼容层 __init__ 豁免 F401。
风格类整治(66 处导入排序、45 处裸 except 等)登记技术债后续专项处理。

验证:ruff All checks passed;pytest 133 passed(此前 130/3,且 3 项依赖外网)。
CI 的 client job 卡在 Test 步骤超 10 分钟,本地复现并定位两处存量缺陷
(源项目同样存在,此前因未跑过完整 vitest 而被登记为技术债):

1) usePomodoroStore.test.ts 无限挂起(§7 测试隔离)
   store 直接导入 @/lib/audio/SoundPlayer 单例,相位切换时调用 play()。
   jsdom 无 AudioContext → play() 内部 preload() 发起
   fetch('/sounds/*.wav', AbortSignal.timeout(5000)),8 处音效调用叠加出
   大量悬挂异步任务,vitest 进程始终不退出。
   测试原已 mock usePomodoroPersistence 与 achievements/evaluator,
   唯独漏了 store 直接依赖的 soundPlayer——补齐 mock 即可,不改被测逻辑。
   效果:该文件 32 个测试 2.6s 通过(此前无限挂起)。

2) sm2.ts goldenErrorMultiplier=0 边界(断言与实现矛盾)
   实现用 multiplier > 0 排除 0,把它当无效值静默忽略 → 间隔保持 25;
   测试期望 0 表示"最大程度缩短",收敛到最小间隔 1 天。
   该选项全仓无生产调用方(仅 sm2.ts 定义 + sm2.test.ts 使用),属未接入的
   预留 API,改实现对线上行为零影响。按测试即规格将下界改为 >= 0:
   传 0 经 Math.max 收敛到 1,避免调用方意图被静默反转成"不缩短"。
   上界仍为 < 1(1.0 的语义就是不调整);0.5→13、undefined→不应用,行为不变。

验证:vitest 23 文件 295 测试全过(12.9s,此前挂起);
      tsc app 与 electron 双 0 错。
@Aparencia
Aparencia merged commit 40c8257 into main Jul 30, 2026
5 checks passed
@Aparencia

Copy link
Copy Markdown
Owner Author

🎉 This PR is included in version 0.25.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Aparencia added a commit that referenced this pull request Aug 4, 2026
- #1: JWT algorithm now injected via SUPABASE_JWT_ALGORITHM (default
  HS256, aligned with Supabase default signing); placeholder detection
  prevents 'configured' false impression causing whole-site 401
- #2: remove double rollback on streaming rate-limit overrun - the Lua
  script already atomically DECRs, manual rollback let users drain
  their own quotas into negative counts
- #3: error_pattern chain/router defensive validation - missing fields
  from LLM JSON output filtered instead of 500 (ValidationError)
- #4: GLM generate_vision returns actual clamped max_tokens; vision
  chain logs truncation warning when output approaches the limit
Aparencia pushed a commit that referenced this pull request Aug 11, 2026
## [0.36.0](v0.35.2...v0.36.0) (2026-08-11)

### ✨ 新功能

* **3d:** Dashboard 深海世界新增 LeviathanShadow 远景巨影 ([8f86127](8f86127))
* **3d:** switch rendering backend from WebGL to WebGPU and restore Chronos 3D sphere ([1ec8b37](1ec8b37))
* **ai-gateway:** ASR 热词增强全链路透传 ([bf2c882](bf2c882))
* **ai:** AI hooks 流式化改造——苏格拉底追问/救援打字机渐进展示 ([5d2318c](5d2318c))
* **assistant:** F3 睡前复习气泡拉起 5 卡迷你复习 + T4 孵化呼吸引导 ([5004b44](5004b44))
* **assistant:** 水母受惊弹开+右键固定+用户活跃检测(10min空闲阈值) ([cf76a18](cf76a18))
* **beta:** 客户端付费体系——设备指纹/付费状态/AI 用量卡 ([3b4d6c3](3b4d6c3))
* **classroom:** 课堂模块增强——热词/转录编辑/章节导航/视觉模式 ([2f1a644](2f1a644))
* **dashboard:** D5 热力图效率维度 + R3 结束仪式 + R9 成就证书 ([e2e4b85](e2e4b85))
* **dashboard:** 主页三视图认知重构与双方案视觉系统 ([7d76b6e](7d76b6e))
* **dashboard:** 学习脉搏加入非番茄钟折算(笔记/复习/费曼)(内测反馈) ([af9a867](af9a867))
* **electron:** G7 全局快捷键框架 + E2 录音持久化 IPC 白名单 ([0ab8f2a](0ab8f2a))
* **feynman:** E2 录音关联持久化与跨会话回放(userData/recordings) ([76241a3](76241a3))
* **flashcards:** 批量管理(选择/重学/搁置/删除)+牌组重命名+会话上限可配置 ([1119e79](1119e79))
* **inbox:** 统一收件箱——剪贴板/灵感/导入三路合并 + 24h 去重 ([3c725ed](3c725ed))
* **innovation:** 创新功能目录四期实施 + 全量审查修复 ([7504119](7504119))
* **license:** AI 网关付费授权体系 ([9f7ed90](9f7ed90))
* **notes,flashcards,feynman:** 未接线组件全量接入 + DashboardPage 编译修复 ([4990849](4990849))
* **notes:** N5 闪卡只取核心层文本 + N2 合书测试答后 diff 高亮 ([7eff581](7eff581))
* **notes:** 搜索栏重构为笔记内筛选+批量删除+模板筛选+文件夹树删除 ([40d7366](40d7366))
* **notes:** 珊瑚礁视图与视口锚定——笔记深潜增强 ([2b82b5e](2b82b5e))
* **notes:** 笔记功能创新全面实施——7阶段25文件 ([d0e0776](d0e0776))
* **notes:** 笔记模块 P0-P2 改进 — 14 项功能实施 ([a081bf6](a081bf6))
* **notes:** 第一轮头脑风暴剩余5项构建完成 ([df90cf2](df90cf2))
* **notes:** 第一轮头脑风暴剩余创新点构建 ([9f6838b](9f6838b))
* **payment:** 临时收入方案全栈实现(数据库+UI+AI网关tier分级) ([acf72e3](acf72e3))
* **pomodoro:** Chronos 时间生物可视化(P0-P2) ([1d7ab71](1d7ab71))
* **pomodoro:** Chronos 液态金属形态与完整状态指示系统 ([dd34528](dd34528))
* **pomodoro:** Chronos 粒子球全面修复与 TimerFace 高频区重构 ([2f96df2](2f96df2))
* **pomodoro:** 修复计时状态机与数据一致性问题,接线体验增强功能 ([74f1893](74f1893))
* **pomodoro:** 深潜设置页下潜档案重构与番茄钟体验增强 ([317d84b](317d84b))
* **pomodoro:** 表盘与预设标签 UI 增强 ([3a91f24](3a91f24))
* **sop:** SOP 系统 MVP——四表落库/模板运行状态机/三页面/5 条 lint 规则 ([77064a4](77064a4))
* **ui:** 命令面板集成全局内容搜索(content类别)+Tag可交互+work-area属性 ([410d582](410d582))
* **ui:** 设置页升级引导 + 每日色相微调对抗感觉适应 ([400e650](400e650))
* **wiki:** 侧边栏独立折叠与自动保存状态提示 + 命令面板 SOP 入口 ([dd812b9](dd812b9))

### 🐛 缺陷修复

* **3d:** add forceWebGL=true to WebGPURenderer for async init compatibility ([5c3b01c](5c3b01c))
* **3d:** revert WebGPURenderer to THREE.WebGLRenderer for R3F compatibility ([0832b21](0832b21))
* **3d:** 主题切换/场景切换手动渲染修复(docked冻结)+routeToModuleId抽离 ([b6735e2](b6735e2))
* add cleanup to showTime timer effect to prevent stale timeout ([2a5cf31](2a5cf31))
* **ai-asr:** 重构 ASR 引擎为 zipformer-transducer 单引擎 ([3522567](3522567))
* **ai-gateway:** Python 3.12 部署启动修复(Any 导入 + BOM 清理 + F401) ([96ac0f5](96ac0f5))
* App启动初始化番茄钟+设置页返回按钮+API本地模式401不踢登录+批量选择hook ([9958306](9958306))
* **audit3:** resolve deferred findings X1-X6 ([9e625ca](9e625ca))
* **audit3:** resolve round-3 review findings on round-2 fixes ([beed8b4](beed8b4))
* **chronos:** eliminate per-frame THREE.Color allocation in useFrame ([6f2411b](6f2411b))
* **client:** resolve frontend medium-risk issues FRONT2-M1~M8 ([c00c087](c00c087))
* **client:** 同步引擎高危修复——resume死锁/冲突循环/localData空对象/synced类型不一致 ([7ef8ad8](7ef8ad8))
* **client:** 学习算法修复——FSRS初始稳定性对齐权重/sm2缺失字段防御/复习写失败可恢复 ([0d43362](0d43362))
* **client:** 客户端中危修复——IPC批处理返回值/流式超时与连接释放/代理路径校验/MCP最小环境/采集源校验/备份保护/watchdog上限 ([b572994](b572994))
* **client:** 客户端低危修复——文件读写限制/更新状态机/崩溃恢复/迁移可诊断/preload白名单统一 ([af1b353](af1b353))
* **client:** 客户端高危修复——采集stop挂起/迁移列错位/搜索全量返回/FTS阻塞/复习双击竞态 ([1feb466](1feb466))
* **electron:** resolve ELEC2-M1/L1/L2 ([064f636](064f636))
* **electron:** SSEServerTransport 类型注解修复 ([b999e05](b999e05))
* **gateway:** AI网关中低危修复——熔断器语义/探活超时/JWKS安全/Key冷却/重试策略/错误脱敏/Redis重连/限流原子化 ([d3be873](d3be873))
* **gateway:** AI网关高危修复——并发信号量/预算记账/流式限流/SSE资源释放/事件循环阻塞/请求体限制/降级链容错 ([8e78b6f](8e78b6f))
* **gateway:** JWT 算法自动适配消除 HS256/ES256 错位 401,学习计划认证就绪前不发请求 ([ed5c55a](ed5c55a))
* **gateway:** resolve high-risk issues [#1](https://github.com/Aparencia/Entropydecrease/issues/1)-[#4](https://github.com/Aparencia/Entropydecrease/issues/4) ([1aeeac5](1aeeac5))
* **gateway:** resolve low-risk issues [#11](https://github.com/Aparencia/Entropydecrease/issues/11)-[#14](https://github.com/Aparencia/Entropydecrease/issues/14) ([12a6e68](12a6e68))
* **gateway:** resolve medium-risk issues [#5](https://github.com/Aparencia/Entropydecrease/issues/5)-[#10](https://github.com/Aparencia/Entropydecrease/issues/10) ([f0b92a9](f0b92a9))
* **misc:** vite base 动态导入 504 / 流式路径正则 / mcpEnv 转义 / AuthGuard 依赖修正 ([7658c81](7658c81))
* **misc:** 杂项修复与文档更新 ([5e43dd8](5e43dd8))
* **notes:** 修复 EchoDiscovery 未使用导入并完成全量验证 ([c1d2a3d](c1d2a3d))
* **perf:** 性能模式变更即时生效,活跃采集优雅重启 ([71304db](71304db))
* **pomodoro:** Chronos 交互补齐与构建级类型修复 ([d8adfb5](d8adfb5))
* remove stale audioPrefs reference in PomodoroAudioLayer ([cad2ad4](cad2ad4))
* replace remaining audioPrefs references in PomodoroControls JSX ([62e8255](62e8255))
* restore skip on break click in ImmersiveTimer ([336ee8a](336ee8a))
* **sync:** OfflineQueue 版本排序改内存排序(Dexie Table 无 sortBy) ([60d72a3](60d72a3))
* **sync:** resolve low-risk logic issues SYNC2-L1~L5 ([b82668d](b82668d))
* **sync:** 同步服务修复——版本冲突判定/WS查询洪泛/Resolve安全/CRDT幂等/广播完整性 ([c7bdb7b](c7bdb7b))
* **tokens:** 材质类层叠顺序 - 深色段移至浅色段后,修复深色主题错误显示浅色材质 ([3bb49b9](3bb49b9))
* **website:** 下载页版本信息拉取超时与重试——消除源站挂起时的无限等待 ([7753dc7](7753dc7))

### ⚡ 性能优化

* **3d:** migrate 6 particle systems to GPU vertex shader and consolidate useFrame ([0e9dc4a](0e9dc4a))
* **client:** 性能优化第二批次——笔记投影/课堂内存/订阅治理/3D 算法优化 ([a734883](a734883))
* **ui:** split whole-store subscriptions and fix effect re-registration ([1f2308b](1f2308b))

### ♻️ 重构

* **chronos:** 粒子渲染 WebGL 单网格→Canvas 2D 伪 3D 重构 ([45e2752](45e2752))
* **dashboard:** Dashboard 重构——移除深海主题死代码 ([32f84b3](32f84b3))
* **pomodoro:** usePomodoroStore 拆分为 timer/settings/session/preset 四 slice ([a7d69de](a7d69de))
* 大规模死代码清理——移除未使用组件/钩子/工具 ([1432871](1432871))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant