a9d00a49f9
fix(infra): 切换 Redis 至火山引擎实例 + 修复 channels 不支持 ACL username + .env 取消跟踪
...
Build and Deploy LTY / build-and-deploy (push) Successful in 8m34s
- 阿里云 Redis 实例 10054 RST 导致 /api/v1/admin/login/ 等接口全线 500,切到火山实例 (db /3, user zyc)
- CHANNEL_LAYERS hosts 由手工拼接 redis://:{pwd}@{host} 改为直接消费 REDIS_LOCATION,支持 ACL username
- .gitignore 恢复 qy_lty/.env 忽略,git rm --cached 移除跟踪;历史中旧密钥仍在,需另行 rotate
- 详见 qy_lty/docs/修改记录.md 2026-05-18 条目
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:48:14 +08:00
cc8ffee168
docs(affinity-P2): 修改记录与任务清单同步 P2 完成状态
...
Build and Deploy LTY / build-and-deploy (push) Successful in 8m15s
- qy_lty/docs/修改记录.md 顶部追加 P2 阶段条目:service 层 6 模块 + admin API 7 视图的详细产出物清单 + 跨项目联动注意事项
- docs/好感度系统-开发任务清单.md:
- P2-01 ~ P2-12 状态从 ⬜ 改为 ✅ ,每条补充实际产出物路径与验证标准
- 变更记录加 P2 完成条目,记录 6 项 smoke test 全 PASS 与下一步 P3 指引
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:36:20 +08:00
7c79b72544
feat(affinity-P2): admin API — Rule/Level CRUD + Setting + Logs + Stats + Devices + Adjust (P2-06~P2-12)
...
新增 admin 管理端完整 API,挂载在 /api/v1/admin/affinity/ 路径下:
- serializers.py:9 个序列化器
- AffinityRuleSerializer / AffinityLevelSerializer / AffinitySettingSerializer
含跨字段 validate(min/max 关系、区间重叠、衰减区间、companion_time 字段必填等)
- AffinityLogSerializer 只读 + 关联字段展开(user_username/device_code/rule_name)
- UserDeviceAffinitySerializer 含 device_code/mac/status/level_name
- AffinityAdjust + AffinityAdjustBatch 用 Serializer 而非 ModelSerializer
- permissions.py 中 IsAdminUserStaff 复用,所有 view 默认 RedisTokenAuthentication + IsAdminUserStaff
- views.py:7 个视图
- AffinityRuleAdminViewSet (P2-06):ModelViewSet + 软删 (is_deleted+is_enabled=False) + restore action;?include_deleted=true 返回全集
- AffinityLevelAdminViewSet (P2-07):同上软删;serializer 跨字段校验区间重叠
- AffinitySettingView (P2-08):APIView 单例 GET/PUT/PATCH;pk=1 硬约束
- AffinityLogListView (P2-09):过滤 user_id/device_id/rule_key/source/date_from/date_to;分页 page_size 上限 200;select_related 防 N+1
- AffinityStatsView (P2-10):avg/max/top_count/active_7d/total_devices/today_interactions/today_change_sum/rule_freq_top/level_distribution;全部基于 UserDevice.active 聚合;今日按 AffinitySetting.timezone 取 local date
- UserAffinityDevicesView (P2-11):?user_id= 必传 + 404 校验;?include_unbound=true 含历史;默认仅 is_bound=True
- AffinityAdjustView + AffinityAdjustBatchView (P2-12):委托 AffinityService.admin_adjust;批量遍历 UserDevice.active 逐台调用,返回 per-device 结果数组
- urls.py:DRF DefaultRouter 注册 rules/levels CRUD + 5 个独立 path 挂 settings/logs/stats/devices/adjust*
- admin_urls.py:引入 include 并新增 path('affinity/', include('userapp.affinity.urls'))
Django check 通过,6 URL reverse 全部解析正确:
/api/v1/admin/affinity/settings/
/api/v1/admin/affinity/logs/
/api/v1/admin/affinity/stats/
/api/v1/admin/affinity/devices/
/api/v1/admin/affinity/adjust/
/api/v1/admin/affinity/adjust-batch/
旧的 /api/user/affinity-rules/ 与 /affinity-levels/ 暂保留兼容,前端切到 admin 后即可清理。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:36:11 +08:00
f26e78c545
feat(affinity-P2): service 层落地 — 唯一写入入口 + Redis 计数器 + 等级映射 + 跨级奖励 + WS 推送 (P2-01~P2-05)
...
新增 6 个模块,把好感度变化的全部副作用收敛到一个调用入口:
- counters.py (P2-02):Redis 三类计数器
- affinity💿 {device_id}:{rule_key} 冷却
- affinity:daily:{device_id}:{rule_key}:{YYYYMMDD} 单规则日上限
- affinity:daily:{device_id}:_global:{YYYYMMDD} 全局正向日上限
- 自然日按 AffinitySetting.timezone (Asia/Shanghai 默认) 通过 zoneinfo 计算
- cache.add + cache.incr 实现 set-if-not-exists + atomic-incr 语义,TTL 48h
- event_id 60s 去重防客户端重复上报
- levels.py (P2-03):等级映射
- map_value_to_level / update_device_level / progress_to_next_level
- update_device_level 仅 level 变化时 save(update_fields=['affinity_level'])
- ws.py (P2-05):WebSocket 推送 helper
- 3 类事件 affinity_update / level_up / level_down
- asgiref.async_to_sync 包装 channel_layer.group_send
- 推送故障 fire-and-forget 仅日志记录,不阻塞主流程
- rewards.py (P2-04):跨级奖励发放(A3 方案 B)
- grant_levels(user_device, from_level, to_level) 逐级独立事务
- UserLevelRewardGrant 唯一约束保证幂等(决策 11:衰减回升不补发)
- _dispatch_reward_to_external_systems 是 STUB,P3/P4 接虚拟货币/道具 app 时实现
- services.py (P2-01):AffinityService 主入口
- apply(user_id, device_id, rule_key, source, event_id, metadata, operator_admin_id, reason)
- 10 步流水线 [event_id 去重 → 取规则 → 冷却 → 取 UserDevice.active → 计算 + single_cap 钳位 → 规则日上限 → 全局日上限 → 原子写库 → Redis 累加 → 奖励 → WS 推送]
- admin_adjust 绕过 rule 与冷却,但走 [0, max_affinity] 钳位 + log + 等级缓存 + 奖励 + WS
- 返回 ApplyResult dataclass 含 ApplyOutcome 枚举(applied / noop_no_rule / noop_cooldown / noop_*_daily_cap / noop_event_duplicate / noop_value_boundary / error)
- permissions.py:IsAdminUserStaff 复用 IsAuthenticated + is_staff 检查
Smoke test 6 项全 PASS:no_rule / chat applied / event_id 去重 / 冷却拦截 / admin_adjust / max_affinity 钳位。
AffinityLog 写库 / UserLevelRewardGrant 幂等 / level 缓存更新 均经事务原子保证。
设计依据:docs/好感度系统功能与规则设计.md §4.3 触发流程 + §6 等级规则 + §9 数据契约。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:35:53 +08:00
61e8374e6a
fix(affinity-P1): WR-002~WR-009 + IN-001~IN-006 综合改进收尾
...
WR-002 UserLevelRewardGrant.device on_delete CASCADE → SET_NULL,加 device_snapshot_id,
unique 改为 partial(device 非空时唯一),与 AffinityLog.device SET_NULL 对齐
WR-003 AffinityLog 删除 3 个低价值索引(user/rule_key/source -created_at 复合)
WR-004 event_id 改为 null=True,partial unique 用 isnull=False;RunPython '' → NULL
WR-005 seed 加 companion_30min 默认规则
WR-006 description 显式 default='';DEFAULT_LEVELS 全部补 description
WR-007 seed_affinity 每条 spec 独立事务,部分失败可重跑
WR-008 ParadiseUser.favorability 字段保留 + UserInfoSerializer 移除暴露 + [DEPRECATED] 标记
WR-009(见 Commit B:AffinityLevel.clean + save full_clean 多层兜底)
IN-001 5 个弃用字段 help_text 加 [DEPRECATED — 计划于 P2 完成后删除]
IN-002 DEFAULT_RULES/LEVELS/SETTING 抽到 userapp/affinity/defaults.py
IN-003 AffinitySetting.daily_cap RenameField → global_daily_cap(区分 AffinityRule.daily_cap)
IN-004 AffinityLog.__str__ 用 pk or 'new' 兜底 None
IN-005(见 Commit A:is_active → is_bound 改名)
IN-006(见 Commit C:0006 print 前缀改为 [migration 0006_...])
迁移 0009 手工修正:daily_cap 改名用 RenameField(保留数据),不是 Remove+Add;
event_id '' → NULL 数据兜底;UserLevelRewardGrant on_delete + conditional unique 重建。
详见 docs/REVIEW-affinity-P1.md WR-* / IN-* 与 FIX-REPORT.md。
2026-05-13 10:18:47 +08:00
2a28aa8b28
fix(affinity-P1): CR-003 修正 0006 数据迁移幂等性
...
旧 forward 用 target.favorability == 10 判断"未迁移",10 既是初始值也是衰减
常见值,重跑会覆盖合法数据;backward 用 != 10 反向判断会丢衰减回 10 的数据。
改用 AffinityLog source='data_migration' 标记做幂等:
- forward 写入新值时同步写一条 audit log,metadata 含原 ParadiseUser 值
- backward 遍历 audit log 反向恢复并删除标记,保证 forward/backward 可循环
同步:AffinityLog.SOURCE_CHOICES 追加 'data_migration' + 0008 AlterField 迁移
更新 Python 端 choices 校验。
option B 选择:直接重写 0006(dev 已跑过但 migrate_count=0 等于未动数据,
django_migrations 表已记录完成不会再跑)。生产部署前需确认 prod 未跑过 0006,
否则需 fake-reverse 流程,详见迁移文件 docstring 与 FIX-REPORT。
详见 docs/REVIEW-affinity-P1.md CR-003。
2026-05-13 10:13:31 +08:00
9a87f5e2b5
fix(affinity-P1): CR-002 + WR-001 加 Affinity 模型 DB CHECK 约束 + 单例硬约束
...
AffinityRule / AffinityLevel / AffinitySetting 三表共 13 条 CheckConstraint
覆盖 min ≤ max / 各类 cap > 0 / cooldown ≥ 0 / companion_time 配套字段必填 /
decay 区间合法 / initial ≤ max 等不变量。
AffinitySetting 加 pk=1 单例硬约束(CR-002 + WR-001 联动)+ save() 强制 pk=1,
形成事实单例防御并发首次插入重复行。
模型 clean() 提供 Python 级兜底(给 DRF / admin 友好错误信息);
AffinityLevel.save() 自动 full_clean 触发跨行区间不重叠校验(为 WR-009 铺路)。
详见 docs/REVIEW-affinity-P1.md CR-002 / WR-001。
2026-05-13 10:12:01 +08:00
33b302c773
fix(affinity-P1): CR-001 + IN-005 修复 UserDevice 软删语义 + is_bound 改名
...
UserDevice.is_active 改名为 is_bound(消除与 Device.is_active 的命名冲突),
新增 ActiveUserDeviceManager(active manager),4 处控制权解析调用点
(MAC 登录、bind_status、绑定校验、RTC token、绑定 endpoint)切换到
UserDevice.active.filter(...),避免 P2 软删后旧绑定者被签发 user-token、
WS 分组路由错误、RTC 房间归属错乱等安全 / 越权风险。
base_manager_name='objects' 保证 admin 默认 queryset 不受 active 过滤影响。
详见 docs/REVIEW-affinity-P1.md CR-001 / IN-005。
2026-05-13 10:10:14 +08:00
9965d0bcf0
docs(03-02): 完成 Phase 3 Plan 03-02 + Milestone v1.0 收尾
...
- 03-02-SUMMARY.md 新建: AccessTokenMaskFilter + LOGGING + 修改记录条目落地, 9 truth × 32 项断言全 PASS, 2 处 Rule 1 auto-fix bug 文档化
- STATE.md 更新: 进度 100%, Phase 3 标记 Complete, Milestone v1.0 收尾, 决策日志补 [Plan 03-02] 7 条
- ROADMAP.md 更新: Milestone v1.0 标 ✅ 完结, Phase 3 / Plan 03-01+03-02 全部 ✓
- REQUIREMENTS.md 更新: CRED-06 标记 Done, traceability 表 Phase 3 行 Done, 覆盖率 6/6 全 Done
Milestone v1.0「通用凭据槽位 (APP ID + Access Token)」CRED-01 至 CRED-06 全部交付完成。
2026-05-08 10:36:17 +08:00
db4d5cf89d
docs(03-02): docs/修改记录.md 顶部追加 Phase 3 条目 (CRED-05 + CRED-06)
...
- 5 处文件改动汇总: aiapp/views.py + qy_lty/urls.py + common/logging/__init__.py + common/logging/filters.py + qy_lty/settings.py
- 修改类型: 新增
- 修改内容: 客户端 GET 接口明文返回 + AccessTokenMaskFilter 4 正则脱敏 + LOGGING 注册
- 修改原因: Milestone v1.0 收尾 phase, 客户端读取 + 日志防御性兜底
- 跨项目联动: 无 — 客户端给 Unity (LTY_Project / LTY_App_Project_URP) 用, 那两个 repo 各自维护; qy-lty-admin 不消费此接口
- qy-lty-admin/docs/修改记录.md mtime 验证未变, 不写互引
2026-05-08 10:30:14 +08:00
7a9e511132
test(03-02): Phase 3 端到端验收报告 (CRED-05 + CRED-06)
...
- 9 truth × 32 项独立断言全 PASS, FAIL = 0
- T1-T5: 客户端 GET 5 项 (user/admin token + 401 + swagger schema)
- T6: filter 4 种正则形态 (JSON/Pyrepr/Query/Fallback)
- T7: 不误伤 Authorization / Bearer 字段
- T8: admin PUT roundtrip + admin GET 脱敏 + client GET 明文
- T9: 端到端 logger.info 真打印 console 输出脱敏
- T_FINAL: DB 探针态还原 (probe_app/probe_secret_xxxx)
- 临时脚本均已删除 (_phase3_01_verify / _phase3_02_unit_test / _phase3_02_verify / _phase3_02_settings_check)
2026-05-08 10:28:26 +08:00
35eb11091f
feat(03-02): qy_lty/settings.py LOGGING 注册 access_token_mask filter
...
- 新增 LOGGING.filters 段,用 dictConfig 工厂语法 "()" 引用 AccessTokenMaskFilter
- LOGGING.handlers.aliyun 与 LOGGING.handlers.console 各加 filters: ['access_token_mask']
- loggers 段 5 条 logger 完全未动 (django / django.request / aiapp / common / userapp)
- Django setup() 不报 ValueError;端到端 logger.info('access_token=...') 输出脱敏 (***...ABCD)
2026-05-08 10:26:13 +08:00
891a5ead7c
feat(03-02): 新建 common/logging/ 包 + AccessTokenMaskFilter
...
- common/logging/__init__.py 空文件 (package marker)
- common/logging/filters.py 含 AccessTokenMaskFilter(logging.Filter)
- 4 个正则模式:JSON / Python dict repr / URL query / 等号或冒号兜底
- 调 common.utils.mask_token 替换捕获组,保留末 4 位明文
- 兼容 logger.info('...%s...', value) tuple args 形态
- 不误伤 Authorization header / Bearer 字段(field-name 锚点)
- filter() 永远 return True 不丢弃 record
2026-05-08 10:25:01 +08:00
a58980fd73
docs(03-01): 完成 Phase 3 Plan 01 — CRED-05 客户端 GET 接口落地
...
- 新增 03-01-SUMMARY.md:4.5 min × 3 task / 2 commit / 2 修改文件 / 6 truth × 15 断言全 PASS
- STATE.md 切到 Phase 3 In Progress(5/6 plan complete,83%),决策段累积 5 条 [Plan 03-01] 决策
- ROADMAP.md 更新 Phase 3 进度(1/2 plan complete)
- REQUIREMENTS.md 标记 CRED-05 → Done
- 3 处 deviations 全 auto-fixed(Rule 1 docstring 字面量误报 / Rule 3 Windows shell 行级 REPL / Rule 3 GBK 编码);plan acceptance criteria 全部达成
Hand-off to Plan 03-02:DB 探针态保持 / _phase3_01_verify.py 留仓库根待删除 / 不写 docs/修改记录.md(由 03-02 Task 4 一并写)
2026-05-08 10:20:13 +08:00
50dcf1c8e2
feat(03-01): 在 qy_lty/urls.py 注册 /api/credential-slot/ 路由
...
- imports 段追加 from aiapp.views import CredentialSlotClientView
- api_urlpatterns 列表在 common/upload/ 与 v1/admin/ 之间插入新路由
path('credential-slot/', CredentialSlotClientView.as_view(), name='client_credential_slot')
- 最终 URL: /api/credential-slot/(顶层 api_urlpatterns,非任何 sub-include)
- resolve('/api/credential-slot/') 返回 CredentialSlotClientView,反向解析返回 /api/credential-slot/
- python manage.py check 通过(仅遗留 staticfiles.W004 与本 plan 无关)
CRED-05 落地步骤 2/3
2026-05-08 10:14:04 +08:00
5269a08118
feat(03-01): 在 aiapp/views.py 末尾追加 CredentialSlotClientView 类
...
- 新增 _credential_slot_client_data_schema:客户端响应 schema,access_token description 标注「明文」
- 新增 CredentialSlotClientView(APIView):仅 GET,user/admin token 鉴权(RedisTokenAuthentication + IsAuthenticated)
- 关键差异(vs Phase 2 admin view):不调 _ensure_admin / 不调 _build_response_data / 不调 mask_token / 不含 def put
- 直接 success_response(data=serializer.data) 明文返回,供手机/设备端实际调用第三方服务
- imports 段未变(Phase 2 已就位 CredentialSlot/CredentialSlotSerializer/RedisTokenAuthentication 等)
CRED-05 落地步骤 1/3
2026-05-08 10:13:07 +08:00
ad9580dd11
docs(03): STATE.md 切到 Phase 3 Ready to execute
2026-05-08 10:10:11 +08:00
5f72fe62c5
docs(03): Phase 3 PLAN.md ×2(03-01 client view+url / 03-02 logging filter+LOGGING+修改记录),plan-checker 1 轮修订消解 3 BLOCKER
2026-05-08 10:10:08 +08:00
b70565388f
docs(03): Phase 3 RESEARCH.md(客户端 view 复刻 admin 删 3 处 + 阿里云 LOGGING handler/filter 注册骨架 + 4 regex 模式)
2026-05-08 10:10:05 +08:00
5a57f91324
docs(03): 从用户内联约束生成 Phase 3 CONTEXT.md(客户端 GET 明文 + 阿里云日志脱敏 PRD 快速通道)
2026-05-08 09:33:26 +08:00
cf2477e738
docs(02-02): 完成 Plan 02-02 — Phase 2 整体收尾(SUMMARY + STATE + ROADMAP + REQUIREMENTS)
...
- 02-02-SUMMARY.md:8 条 success criteria 全 PASS(28 项独立断言 + Swagger schema + 两端互引)+ 验收方法论 + 偏差记录 + Phase 3 起点准备
- STATE.md:进度 75% → 100%(4/4 plan 完成);Phase 2 整体 Complete;下一步 /gsd-plan-phase 3
- ROADMAP.md:Phase 2 标记 ✓ Complete(2/2 plan 完成;commits 6820fe7..46d72b8)
- REQUIREMENTS.md:CRED-03 / CRED-04 traceability 表 Pending → Done
2026-05-07 23:13:18 +08:00
46d72b8b39
docs(02-02): 两端修改记录互引 Phase 2 接口契约(qy_lty + qy-lty-admin)
...
- qy_lty/docs/修改记录.md 顶部新增 [2026-05-07] Phase 2 — 管理端通用凭据槽位 REST 接口(GET 脱敏 / PUT 覆写)条目;跨项目联动字段引用 qy-lty-admin 同期条目
- qy-lty-admin/docs/修改记录.md 顶部新增 [2026-05-07] Phase 2 — 锁定后端通用凭据槽位 REST 接口契约(消费方文档化)条目;服务端联动字段引用 qy_lty 同期条目
- 两端 grep 双向命中互引闭环;Phase 1 已有两条条目位置不变
- CLAUDE.md「跨项目联动两端各写一条互相引用」规则首次落地(Phase 2 是 Milestone v1.0 首次跨项目接口契约暴露)
2026-05-07 23:07:38 +08:00
3cfd481f84
test(02-02): 端到端验收 8 条 success criteria 全 PASS
...
- Django test client 程序化跑 6 条验收点(GET 脱敏 / PUT 全字段覆写 + 响应脱敏 / PUT 空记录 get_or_create / 401 无 token / 403 user token GET / 403 user token PUT),共 28 项独立断言全部 PASS
- /swagger.json/ schema 校验:路径 /v1/admin/credential-slot/ + GET/PUT 两 method + access_token description 含脱敏 / 末 4 位 / 掩码 三个语义关键字
- 验收完毕主动还原 DB 探针态(app_id=probe_app, access_token=probe_secret_xxxx)
- token 明文不入仓库(仅记长度 + PASS 判定,Redis 30 天 TTL 攻击面)
- 临时脚本 _phase2_verify.py / _phase2_swagger_verify.py 已删(不入 commit)
- 验收点 #8 互引由 Task 2 落地后回写
2026-05-07 23:05:38 +08:00
2dec1fd813
docs(02-01): 收尾 Plan 02-01(CredentialSlotAdminView 已落地)
...
- 新增 .planning/phases/02-admin-rest/02-01-SUMMARY.md(含 frontmatter / decisions /
metrics / 偏差 / Plan 02-02 端到端 verify hook)
- STATE.md:当前位置 1→2、Plan 02 of 02→01 of 02、progress 75%、性能指标加 Plan 02-01 行、
累积决策追加 5 条 [Plan 02-01] 标签项、下一步切到 /gsd-execute-plan 02-02
- ROADMAP.md:Phase 2 plan 进度 0/2 → 1/2
- REQUIREMENTS.md:CRED-03 / CRED-04 标记 complete + traceability 表更新
- config.json:gsd-tools init 写入 workflow._auto_chain_active flag(不影响本期执行)
Plan 02-01 三个 task commit: 6820fe7 / 192d0a1 / 9d02021
2026-05-07 22:58:40 +08:00
9d020218d2
feat(02-01): 注册 /api/v1/admin/credential-slot/ 路由
...
- path('credential-slot/', CredentialSlotAdminView.as_view(), name='admin_credential_slot')
- 与 admin_login / admin_logout 在同一 admin namespace 注册块
- 路由汇总点单一:仅 userapp/admin_urls.py 注册,aiapp/urls.py 不重复
- reverse('admin_credential_slot') = /api/v1/admin/credential-slot/
- python manage.py check 通过(唯一 W004 STATICFILES_DIRS 与本 plan 无关)
2026-05-07 22:54:25 +08:00
192d0a15ec
feat(02-01): 新增 CredentialSlotAdminView(GET 脱敏 / PUT 全字段覆写)
...
- 1:1 复刻 RTCChatHistoryAPIView 单 URL 多方法 APIView 风格(不走 RetrieveUpdateAPIView)
- authentication_classes=[RedisTokenAuthentication]
- permission_classes=[IsAuthenticated] + view 内 _ensure_admin 二次校验 is_staff
(per RESEARCH.md:仓库零处 IsAdminTokenAuthenticated 类,沿用 AdminEmailLoginView 模式)
- _build_response_data helper 强制脱敏:data['access_token'] = mask_token(instance.access_token)
- GET / PUT 都走 _build_response_data,避免 PUT 直接 return success_response(data=serializer.data)
导致明文回显(CONTEXT.md / Pitfall 3 锁定)
- @swagger_auto_schema method-level 装饰:access_token 字段 description 显式标注脱敏掩码
- 顶部 import 追加:CredentialSlot / CredentialSlotSerializer / mask_token /
get_standardized_response_schema
2026-05-07 22:53:38 +08:00
6820fe7fd4
feat(02-01): 新增 CredentialSlotSerializer
...
- ModelSerializer 三字段: app_id / access_token / updated_at
- updated_at read_only 双重保险(模型层 auto_now=True 已兜底)
- app_id / access_token allow_blank=True / allow_null=False / required=False
与模型层 blank=True / default='' 对齐
- 脱敏不在 serializer 层做(per CONTEXT.md), 由 view 层 mask_token 完成
2026-05-07 22:52:12 +08:00
13dc19a686
docs(02): STATE.md 切到 Phase 2 Ready to execute(PLAN ×2 已提交)
2026-05-07 18:34:27 +08:00
57199483f7
docs(02): Phase 2 PLAN.md ×2(02-01 view+serializer+url+swagger / 02-02 双写互引修改记录 + 端到端 verify),plan-checker PASS(无 BLOCKER)
2026-05-07 18:34:21 +08:00
7452b35a0f
docs(02): Phase 2 RESEARCH.md(路由汇总点 userapp/admin_urls + 复刻 RTCChatHistoryAPIView 模板 + 仓库零 IsAdminTokenAuthenticated)
2026-05-07 18:34:21 +08:00
172ab321c1
docs(02): 从用户内联约束生成 Phase 2 CONTEXT.md(管理端 REST 接口 PRD 快速通道)
2026-05-07 18:15:54 +08:00
658963fd0d
docs(01): Phase 1 VERIFICATION.md(6/6 must-haves PASSED)
...
gsd-verifier goal-backward 验证:
- ROADMAP 4 条 success criteria + 2 条工程硬要求全部达成
- 跨 plan contract 一致性(mask_token / 字段集 / 单例语义 / 探针 mask 串)MATCH
- 元数据同步(REQUIREMENTS / ROADMAP / STATE)SYNCED
含已合并的 CONTEXT.md 修正版(i18n 跟仓库字面量约定 + app 归属锁定 aiapp + 单例复刻 AffinitySetting)。
2026-05-07 18:11:29 +08:00
f88df925c1
docs(01-02): 完成 Phase 1 plan 01-02,落地 SUMMARY 与 state 更新
...
- 新增 .planning/phases/01-credential-data-layer/01-02-SUMMARY.md(含 4 task 完成情况 + Task 2 Django test client 程序化验收 10/10 PASS 记录 + ROADMAP Phase 1 4 条 success criteria 实现位置 + Deviations)
- STATE.md:当前位置切到 Phase 1 Complete(2/2 plan,progress 100%),下一步切到 /gsd-plan-phase 2,新增 Plan 01-02 6 条决策
- ROADMAP.md:Phase 1 复选框打勾 + Plan 01-02 行打勾 + Progress 表 1/2 改 2/2 / Status 改 Complete
- REQUIREMENTS.md:CRED-02 Active 复选框打勾 + Traceability 表 Pending 改 Done
Phase 1 整体收尾,ROADMAP Phase 1 全部 4 条 success criteria + 2 条工程硬要求均满足。
2026-05-07 18:05:37 +08:00
ddbcb7da5a
docs(01-02): qy_lty/docs/修改记录.md 顶部追加 Phase 1 两条条目(CRED-01 + CRED-02)
...
- 在第 23 行注释下、既有最新条目之上插入两条 [2026-05-07] Phase 1 条目
- 顺序:Admin 注册条目(CRED-02)在上、数据层条目(CRED-01)在下,最新在最前
- 两条都内嵌「跨项目联动: 无」字段(措辞含 'qy-lty-admin 同期 v1.0 前端集成 milestone 已规划但未启动')
- CRED-02 条目含「Phase 2 暴露 /api/v1/admin/credential-slot/ 接口时再做前后端联动」前瞻
- CRED-01 条目含「后续动作」段链接到 Phase 2 / Phase 3 计划
- 既有条目(GSD brownfield / CLAUDE.md 沟通语言 / 好感度 P1 / 历史条目)均未被破坏
2026-05-07 18:00:40 +08:00
653f057b51
feat(01-02): aiapp/admin.py 注册 CredentialSlotAdmin(脱敏 + 单例新增 + 禁删)
...
- import 追加 CredentialSlot 与 common.utils.mask_token
- 新增 CredentialSlotAdmin(覆盖 CRED-02):
- list_display 含计算字段 access_token_masked(仅末 4 位明文)
- fieldsets 分「凭据信息」明文可写 + 「元数据」updated_at 只读折叠
- has_add_permission 已存在记录时返回 False(隐藏增加按钮)
- has_delete_permission 永远返回 False(含批量动作)
- 不修改既有 BotAdmin / ChatMessage 注册块
2026-05-07 17:42:36 +08:00
20036eeb2f
docs(01-01): 完成凭据槽位数据层 plan,落地 SUMMARY 与 state 更新
...
- 新增 SUMMARY.md:3 task / 3 commit / 32+42+26 行代码 / mask_token + CredentialSlot + 0004 迁移
- STATE.md:completed_plans 0→1(50%),下一步切到 Plan 01-02
- ROADMAP.md:Plan 01-01 勾选完成,进度表 1/2 In progress
- REQUIREMENTS.md:CRED-01 勾选完成,traceability 状态 Pending→Done
- 探针数据契约固化:DB pk=1 / access_token='probe_secret_xxxx' 留给 Plan 01-02 浏览器 checkpoint
2026-05-07 17:39:53 +08:00
a475fe4600
feat(01-01): 自动生成并应用 0004_credentialslot 迁移
...
- 由 python manage.py makemigrations aiapp 自动生成(未手写)
- CreateModel(name='CredentialSlot') 含 id/app_id/access_token/updated_at 四列
- python manage.py migrate aiapp 退出码 0;showmigrations 显示 [X]
- shell 自检:首访 created=True app_id='' / 二次 save 后 count=1 obj2.pk=1
- N 次 save 守恒断言通过:CredentialSlot.objects.count() == 1
- 探针数据已写入 DB:pk=1 / app_id='probe_app' / access_token='probe_secret_xxxx'
(Plan 02 Task 2 浏览器 checkpoint 依赖此值,对应脱敏期望串 *************xxxx)
- 覆盖需求 CRED-01 数据库 schema 落地
2026-05-07 17:35:58 +08:00
30c7caff41
feat(01-01): aiapp 新增 CredentialSlot 单例模型
...
- 在 aiapp/models.py 末尾追加 CredentialSlot(不动 Bot / ChatMessage)
- 字段:app_id CharField(128) / access_token CharField(512) / updated_at auto_now
- 单例三件套:pk=1 + save() 钩子重定向 + get_solo() 类方法(1:1 复刻 AffinitySetting)
- 不引入 gettext_lazy / created_at,沿用仓库中文 verbose_name 实操约定
- 覆盖需求 CRED-01 模型层
2026-05-07 17:34:38 +08:00
a9c25eb2ac
feat(01-01): 新增 common/utils.py 含 mask_token 工具函数
...
- 落地 mask_token(token, visible_tail=4, mask_char='*') 通用脱敏函数
- 末 N 位明文保留;空/短输入兜底(短于 visible_tail 时全脱敏防长度泄露)
- 不依赖 Django,纯 Python utility,供 Phase 1 Admin / Phase 3 日志 formatter 复用
- 覆盖需求 CRED-01 工具支撑部分
2026-05-07 17:33:49 +08:00
343b5d0fee
docs(01): STATE.md 切到 Ready to execute(Phase 1 PLAN ×2 已提交)
2026-05-07 17:31:01 +08:00
68f4ceb0b9
docs(01): Phase 1 PLAN.md ×2(01-01 模型迁移工具 + 01-02 Admin 修改记录),plan-checker 通过 1 轮修订
2026-05-07 17:30:49 +08:00
ca7bd4a133
docs(01): Phase 1 RESEARCH.md(aiapp 归属 + 复刻 AffinitySetting 单例 + 新建 mask_token)
2026-05-07 17:30:46 +08:00
0fab2aac36
docs(01): 据 researcher 发现修正 CONTEXT.md(i18n 跟仓库字面量约定,app 归属锁定 aiapp,单例复刻 AffinitySetting)
2026-05-07 17:09:13 +08:00
ddc7360f60
docs(01): 从用户内联约束生成 Phase 1 CONTEXT.md(PRD 快速通道)
2026-05-07 16:57:31 +08:00
4637998420
docs(qy_lty): 生成 Milestone v1.0 ROADMAP(3 个 phase)
...
3 个串行 phase(粒度 coarse):
1. 凭据槽位数据层(CRED-01, CRED-02)— DB 单例 + Django Admin
2. 管理端读写接口(CRED-03, CRED-04)— /api/v1/admin/credential-slot/ GET+PUT
3. 客户端读取与日志脱敏(CRED-05, CRED-06)— /api/credential-slot/ 明文 GET + 阿里云日志过滤
REQUIREMENTS.md Traceability 段回填 6/6 映射;STATE.md 切到 Phase 1 待启动状态。
2026-05-07 16:42:37 +08:00
8ae12ca86c
docs(qy_lty): 定义 Milestone v1.0 需求(CRED-01~06)
...
通用凭据槽位 6 项 Active 需求:
- CRED-01 单例模型 + 迁移(pk=1 强制约束)
- CRED-02 Django Admin 注册(脱敏列表 + 编辑明文 + 隐藏新增)
- CRED-03 管理端 GET(admin token 鉴权,Access Token 末 4 位掩码)
- CRED-04 管理端 PUT(admin token 鉴权,全字段覆写 + get_or_create)
- CRED-05 客户端 GET(user token 鉴权,明文返回供手机/设备端使用)
- CRED-06 阿里云日志过滤(PUT 请求体 + admin GET 响应体两条泄露路径)
候选优先级段保留为下一周期参考。
2026-05-07 16:29:19 +08:00
ab3d728a08
docs(qy_lty): 启动 Milestone v1.0 通用凭据槽位
...
PROJECT.md 加入「本期 Milestone」段:全局单例 APP ID + Access Token 凭据存储,
管理端读写 + 客户端读取 + 日志脱敏;前端联动 milestone 在 qy-lty-admin 另起。
STATE.md 切换到 v1.0 状态:当前位置 = 需求定义中(roadmap 待生成)。
2026-05-07 16:29:10 +08:00
7223c52e9f
docs: bootstrap GSD workflow with brownfield documentation pass
2026-05-07 10:43:16 +08:00
64a8cb8f7b
docs: map existing codebase
2026-05-07 10:37:16 +08:00
2d82b2ef7f
feat: implement affinity (favorability) system
...
Build and Deploy LTY / build-and-deploy (push) Successful in 8m44s
- Add affinity level/setting models and migrations
- Migrate favorability data to UserDevice
- Add management commands for userapp
- Add admin CLAUDE.md and docs
- Update affinity system design doc and task checklist
- Update device_interaction and userapp models
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 17:18:30 +08:00