PicMe 开发、代码审查与任务标记规范(Development, CR & Task Markup)

版本: 1.2
状态: 生效中
最后更新: 2026-07-08
维护者: CO / RD / CR / PM
上级文档: 根目录 AGENTS.md(Agent First 治理与角色协作)
范围: 本文档统一包含 PicMe 开发工作流、代码审查检查清单与 [kimi-task] 任务标记规范,是研发流程的唯一事实来源。


目录

  1. 双螺旋演进工作流(Spec ↔︎ Code Co-Evolution)
  2. 反向链接注释规范(Spec Traceability)
  3. CI 检查规则
  4. 代码审查检查清单
  5. 任务标记规范
  6. 术语词典(Glossary)
  7. 更新历史

1. 双螺旋演进工作流(Spec ↔︎ Code Co-Evolution)

1.1 核心原则

Spec 驱动开发(Spec-Driven Development, SDD)要求文档与代码始终保持同步,但在实践中允许”探索-固化”的双向演进:

Spec 文档(What & How)
    ↓ 驱动
代码实现(Implementation)
    ↓ 发现
实现中的新问题 / 优化点
    ↓ 反馈
Spec 文档更新(Consensus)
    ↓ 驱动下一轮...

1.2 探索-固化规则

阶段 规则 责任人
探索期 当实现中发现 Spec 不明确时,允许先行探索代码实现,最多 1 个 Commit RD
固化期 探索完成后,必须在同一 PR / Commit 中更新对应 Spec 文档 RD
审查期 CR 审查时同时审查代码 + 文档变更,文档缺失 = 一票否决 CR
验收期 QA 验收时验证代码行为与 Spec 验收条件(AC)一致 QA

1.3 红线(Hard Limits)


2. 反向链接注释规范(Spec Traceability)

2.1 目的

在关键接口和实现代码中嵌入 Spec 引用,实现: - 需求变更时快速定位受影响代码 - 代码审查时快速追溯设计意图 - 自动化工具生成 Traceability Matrix

2.2 注释格式

// Spec: <文档路径>#<章节/锚点>
// Implements: <AC-ID>(如 AC-P0-3)
// Related: <关联文档路径>#<章节>
// ChangeLog: <日期> <变更描述>(可选)

2.3 必须添加反向链接的位置

位置 示例 说明
公开 API 接口 BeautyPreviewProvider 关联 beauty-engine/AGENTS.md 接口定义
核心算法实现 FrameSyncManager 关联 FRAME_SYNC_TECH_SPEC.md 功能需求
架构边界类 api/ vs internal/ 边界 关联架构约束
性能关键路径 CameraPreviewRenderer.render() 关联 NFR_SPEC.md 指标
降级/容灾逻辑 onGlWarmUpFallback() 关联 BEAUTY_ENGINE_FALLBACK.md
搜索召回逻辑 ExplicitFirstSearchPipeline 关联 GALLERY_SEARCH.md
TAG 生成阶段 TagGenerationPipeline 关联 AUTO_TAG_GENERATION_SPEC.md

2.4 完整示例

// Spec: docs/03-TECHNICAL-SPECS/FRAME_SYNC_TECH_SPEC.md#5-frame-sync
// Implements: AC-P0-3
// Related: beauty-engine/AGENTS.md
// ChangeLog: 2026-06-30 新增 missingThresholdFrames 字段
class FrameSyncManager(
    private val config: FrameSyncConfig = FrameSyncConfig.DEFAULT
) {
    // ...
}

2.5 Traceability Matrix

维护可追溯性矩阵(Traceability Matrix),记录需求 → 代码 → 测试的映射关系:

需求 ID 需求描述 实现文件 测试文件 验收条件
FR-5 严格缺失处理 FrameSyncManager.kt FrameSyncMissingTest.kt AC-P0-3
FR-1 FrameId 体系 FrameId.kt FrameIdTest.kt AC-P0-1
FR-Search-1 自然语言相册搜索 MediaSearchEngine.kt SearchIntegrationTest.kt AC-Search-1

3. CI 检查规则

3.1 文档同步检查(Doc Sync Check)

在 CI 流水线中加入轻量级脚本(概念实现,当前以本地脚本为主):

# .github/workflows/doc-sync-check.yml(参考)
doc-sync-check:
  script:
    # 检查 PR 中修改了 beauty-engine 内部实现时是否同步修改了 AGENTS.md
    - python scripts/check_doc_sync.py \
        --code-path beauty-engine/src/main/java/ \
        --doc-path beauty-engine/AGENTS.md
    
    # 检查 PR 中修改了 api/ 接口时是否同步修改了技术文档
    - python scripts/check_doc_sync.py \
        --code-path beauty-api/src/main/java/ \
        --doc-path docs/03-TECHNICAL-SPECS/BEAUTY_ENGINE_TECH_SPEC.md
    
    # 检查文档间内部链接有效性
    - python scripts/check_doc_links.py \
        --root docs/
    
    # 检查 AGENTS.md 中提到的模块在代码中是否存在
    - python scripts/check_spec_completeness.py \
        --spec beauty-engine/AGENTS.md \
        --src beauty-engine/src/

当前落地状态scripts/check_doc_links.py 等工具处于设计/局部脚本阶段,日常以 RD/CR 人工检查 + 自动化链接扫描为主。

3.2 架构合规检查(Architecture Compliance)

使用 detekt / ktlint 自动检查代码风格与基础架构红线:

# 代码风格
./gradlew ktlintCheck

# 静态分析
./gradlew detekt

# 组合检查(CI 推荐)
./gradlew :app:compileDebugKotlin :app:testDebugUnitTest ktlintCheck detekt

3.3 性能基线检查(Performance Baseline)

# 启动时间基准测试(需真机/模拟器)
adb shell am start -W com.mamba.picme/.MainActivity

# 与历史基线对比(退化 > 5% 需关注)
# python scripts/compare_perf_baseline.py \
#     --current benchmark-results.json \
#     --baseline perf-baseline.json \
#     --threshold 5%

4. 代码审查检查清单

4.1 CR 检查清单

文档同步

架构合规

性能

资源管理

测试覆盖

日志与可观测性

国际化 (I18N)

4.2 一票否决项

以下任一情况,CR 必须 Request Changes

文档不同步

架构越界

性能退化

资源泄漏

无测试覆盖

I18N 缺失

4.3 架构合规检查

ArchUnit 规则

// api/ 包不依赖 egl/
@ArchTest
val `api package should not depend on egl package` = noClasses()
    .that().resideInAPackage("..api..")
    .should().dependOnClassesThat().resideInAPackage("..egl..")

// App 层不直接实例化 egl/ 内部类
@ArchTest
val `app should not instantiate egl classes directly` = noClasses()
    .that().resideInAPackage("..features..")
    .should().callConstructorWhere(
        target(owner(resideInAPackage("..egl..")))
    )

detekt 规则

// 禁止在构造函数中启动渲染线程
class NoRenderThreadInConstructor : Rule() {
    override fun visitClass(klass: KtClass) {
        if (klass.hasAnnotation("GlThread") || klass.name?.contains("Renderer") == true) {
            // 检查构造函数中是否启动 Thread
        }
    }
}

手动检查项

4.4 性能基线检查

CI 检查脚本

perf-baseline-check:
  script:
    # 启动时间基准测试
    - ./gradlew benchmark:coldStartupBenchmark
    
    # 单帧处理耗时基准测试
    - ./gradlew benchmark:frameProcessingBenchmark
    
    # 与基线对比,退化 > 5% 则失败
    - python scripts/compare_perf_baseline.py \
        --current benchmark-results.json \
        --baseline perf-baseline.json \
        --threshold 5%

关键指标

指标 红线 目标 测量方法
冷启动 → 首帧预览 ≤ 500ms ≤ 400ms adb shell am start -W
预览帧率(高端机) ≥ 30fps ≥ 55fps BeautyPerfStats.fps
单帧处理耗时 ≤ 16ms ≤ 12ms Systrace / 自定义计时
参数响应延迟 ≤ 100ms ≤ 50ms 人工体感 + 高速摄像
拍照后处理(1080p) ≤ 300ms ≤ 200ms PhotoProcessorImpl 耗时

调试工具

4.5 文档同步检查

CI 检查脚本

doc-sync-check:
  script:
    # 检查 PR 中修改了 egl/ 实现时是否同步修改了 AGENTS.md
    - python scripts/check_doc_sync.py \
        --code-path beauty-engine/src/main/java/com/picme/beauty/egl/ \
        --doc-path beauty-engine/AGENTS.md
    
    # 检查 PR 中修改了 api/ 接口时是否同步修改了技术文档
    - python scripts/check_doc_sync.py \
        --code-path beauty-engine/src/main/java/com/picme/beauty/api/ \
        --doc-path docs/03-TECHNICAL-SPECS/BEAUTY_ENGINE_TECH_SPEC.md
    
    # 检查文档间内部链接有效性
    - python scripts/check_doc_links.py \
        --root docs/
    
    # 检查 AGENTS.md 中提到的模块在代码中是否存在
    - python scripts/check_spec_completeness.py \
        --spec beauty-engine/AGENTS.md \
        --src beauty-engine/src/

文档更新检查项

4.6 CR 评论模板

✅ 通过

## CR 结果:✅ Approved

### 亮点
- 代码结构清晰,命名规范
- 单元测试覆盖完善
- 性能优化到位

### 建议(非阻塞)
- 可考虑提取公共逻辑为扩展函数
- 日志标签可更统一

❌ 需要修改

## CR 结果:❌ Request Changes

### 阻塞问题

#### 1. 文档不同步
- **位置**: `beauty-engine/src/main/java/com/picme/beauty/egl/CameraPreviewRenderer.kt`
- **问题**: 修改了 `render()` 实现但未更新 `AGENTS.md`
- **修复**: 同步更新 `beauty-engine/AGENTS.md#render-pipeline` 章节

#### 2. 性能退化
- **位置**: `FrameSyncManager.query()`
- **问题**: 新增锁导致单帧耗时从 12ms → 18ms
- **修复**: 改用 `ConcurrentHashMap` 替代 synchronized

#### 3. I18N 缺失
- **位置**: `strings.xml`
- **问题**: 新增文案 "美颜总开关" 未覆盖英文和繁体
- **修复**: 补充三语翻译

5. 任务标记规范

5.1 目的

本文档定义 [kimi-task] 结构化标记规范,用于在 Spec 文档(PRODUCT.mdPRD-*.mdFEATURES.md)中直接嵌入可执行、可追踪、可验证的任务描述。外层编排脚本可自动解析此类标记,生成标准化 Task JSON,直接驱动 RD/QA Agent 执行,实现”需求变更 → 开发任务”的自动转换。

5.2 标记格式

基本语法

### <功能标题> [kimi-task:<task_id>]
- **Assignee**: <RD | QA | CR | PM>
- **Scope**: `<文件路径1>`, `<文件路径2>`
- **Expected Change**:
  1. <具体变更描述>
  2. <具体变更描述>
- **DependsOn**: <task_id_1>, <task_id_2>
- **EstimatedEffort**: <Xd | Xh | Xw>
- **Priority**: <P0 | P1 | P2>
- **Acceptance**: <AC-P0-X | AC-P1-X>

字段说明

字段 必填 格式 说明
task_id [a-z0-9-]+ 全局唯一任务标识,如 fsm-001beauty-042
Assignee RD / QA / CR / PM 负责执行的角色
Scope 逗号分隔的文件路径 预期修改的代码文件或模块
Expected Change 有序列表 具体的代码变更预期,RD Agent 据此执行
DependsOn 逗号分隔的 task_id 前置依赖任务
EstimatedEffort Xd / Xh / Xw 预估工作量(天/小时/周)
Priority P0 / P1 / P2 与验收标准对齐
Acceptance AC-P0-X / AC-P1-X 关联的验收条件 ID

完整示例

### FR-5:严格缺失处理 [kimi-task:fsm-005]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/internal/framesync/FrameSyncManager.kt`, `beauty-engine/src/main/java/com/picme/beauty/egl/CameraPreviewRenderer.kt`
- **Expected Change**:
  1. `FrameSyncConfig` 中新增 `missingThresholdFrames: Int = 3` 字段
  2. 修改 `FrameSyncManager.query()`,当 `syncMode = STRICT` 且帧差 > `missingThresholdFrames` 时返回 `SyncStatus.MISSING`
  3. `CameraPreviewRenderer.applySyncResultToRenderer()` 中,当 `syncStatus = MISSING` 时设置 `uHasFace = 0f`
  4. 更新 `BeautyPerfStats`,增加 `framesSinceDetection` 字段
- **DependsOn**: fsm-001, fsm-002
- **EstimatedEffort**: 2d
- **Priority**: P0
- **Acceptance**: AC-P0-3

5.3 使用位置

允许使用 [kimi-task] 的文档

文档 用途
PRODUCT.md 记录高层功能需求对应的开发任务
docs/01-PRODUCT/FEATURES.md 记录具体功能需求的开发任务
docs/01-PRODUCT/FEATURES.md 记录交互变更对应的 UI/UX 任务
docs/03-TECHNICAL-SPECS/BEAUTY_ENGINE_TECH_SPEC.md 记录技术实现任务

禁止使用 [kimi-task] 的位置

5.4 自动化解析规则

解析脚本输入

python scripts/parse_kimi_tasks.py \
  --input docs/03-TECHNICAL-SPECS/FRAME_SYNC_TECH_SPEC.md \
  --output tasks/frame-sync-tasks.json

输出 JSON 格式

{
  "source": "docs/03-TECHNICAL-SPECS/FRAME_SYNC_TECH_SPEC.md",
  "extracted_at": "2026-05-14T10:00:00Z",
  "tasks": [
    {
      "task_id": "fsm-005",
      "title": "FR-5:严格缺失处理",
      "assignee": "RD",
      "scope": [
        "beauty-engine/src/main/java/com/picme/beauty/internal/framesync/FrameSyncManager.kt",
        "beauty-engine/src/main/java/com/picme/beauty/egl/CameraPreviewRenderer.kt"
      ],
      "expected_change": [
        "在 FrameSyncConfig 中新增 missingThresholdFrames: Int = 3 字段",
        "修改 FrameSyncManager.query()...",
        "在 CameraPreviewRenderer.applySyncResultToRenderer()...",
        "更新 BeautyPerfStats..."
      ],
      "depends_on": ["fsm-001", "fsm-002"],
      "estimated_effort": "2d",
      "priority": "P0",
      "acceptance": "AC-P0-3",
      "status": "pending"
    }
  ]
}

驱动执行流程

Spec 文档(含 [kimi-task])
    ↓ parse_kimi_tasks.py
Task JSON(标准化任务描述)
    ↓ 编排脚本
├─→ RD Agent: 执行代码变更
├─→ QA Agent: 执行验收测试
├─→ CR Agent: 执行代码审查
└─→ PM Agent: 更新进度跟踪

5.5 任务状态流转

任务状态由自动化系统维护,不存储在 Spec 文档中:

状态 说明
pending 待分配,未开始
in_progress RD Agent 已认领,执行中
review 代码已完成,待 CR 审查
testing CR 通过,待 QA 验收
done QA 验收通过,任务完成
blocked 被依赖任务阻塞
failed 执行失败,需人工介入

5.6 约束与红线

5.7 示例:帧同步美妆系统任务集

## 6. 版本规划(含 [kimi-task])

### Phase 1:基础设施(1~2 周)

#### FrameId 体系 [kimi-task:fsm-001]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/api/FrameId.kt`
- **Expected Change**:
  1. 创建 `@JvmInline value class FrameId(val value: Long)`
  2. 实现 `AtomicLong` 计数器,`next()` 方法
  3. 定义 `INVALID = FrameId(0L)`
- **EstimatedEffort**: 4h
- **Priority**: P0
- **Acceptance**: AC-P0-1

#### FrameSyncManager 骨架 [kimi-task:fsm-002]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/internal/framesync/FrameSyncManager.kt`
- **Expected Change**:
  1. 创建 `FrameSyncManager` 单例类
  2. 实现 `ResultStore``ConcurrentHashMap<FrameId, DetectionResult>`
  3. 实现 `MatchEngine`:精确匹配 → 历史回退 → 预测补偿 → 缺失隐藏
  4. 实现 `query(currentFrameId)` 公共 API
- **DependsOn**: fsm-001
- **EstimatedEffort**: 2d
- **Priority**: P0
- **Acceptance**: AC-P0-1, AC-P0-2

#### DetectionQueue 改造 [kimi-task:fsm-003]

> **⚠️ 审计备注(2026-06)**:DetectionQueue 未落地(`DetectionQueue.kt` 不存在)。此 [kimi-task] 标记的目标文件路径无效。当前使用同步检测路径。如需实施异步检测改造,应先创建 DetectionQueue.kt 再更新此任务标记。

- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/internal/framesync/DetectionQueue.kt`(⏳ 设计中,未落地)
- **Expected Change**:
  1. 创建 `DetectionQueue` 类,深度限制 2,超时 200ms
  2. 改造人脸检测线程为消费队列模式
  3. 检测结果携带 `FrameId` 存入 `FrameSyncManager`
- **DependsOn**: fsm-002
- **EstimatedEffort**: 1d
- **Priority**: P0
- **Acceptance**: AC-P0-1

### Phase 2:时序对齐与严格缺失(1~2 周)

#### 渲染管线集成 [kimi-task:fsm-004]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/egl/CameraPreviewRenderer.kt`, `beauty-engine/src/main/java/com/picme/beauty/egl/BeautyRenderer.kt`
- **Expected Change**:
  1. `CameraPreviewRenderer` 渲染循环中调用 `FrameSyncManager.query(currentFrameId)`
  2. `BeautyRenderer` 新增 `updateSyncedFacePoints106()` + `setHasFace()`
  3. `FaceMakeupPass` 新增 `updateFaceLandmarksSynced()` 入口
- **DependsOn**: fsm-002, fsm-003
- **EstimatedEffort**: 2d
- **Priority**: P0
- **Acceptance**: AC-P0-2, AC-P0-3

#### 严格缺失处理 [kimi-task:fsm-005]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/internal/framesync/FrameSyncManager.kt`, `beauty-engine/src/main/java/com/picme/beauty/egl/CameraPreviewRenderer.kt`
- **Expected Change**:
  1. `FrameSyncConfig` 新增 `missingThresholdFrames: Int = 3`
  2. `query()` 严格模式:帧差 > 阈值时返回 `MISSING`
  3. `applySyncResultToRenderer()``MISSING``uHasFace = 0`
- **DependsOn**: fsm-004
- **EstimatedEffort**: 1d
- **Priority**: P0
- **Acceptance**: AC-P0-3

#### 调试指标接入 [kimi-task:fsm-006]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/api/BeautyPerfStats.kt`, `app/src/main/java/com/mamba/picme/features/camera/debug/PerfOverlay.kt`
- **Expected Change**:
  1. `BeautyPerfStats` 增加 `detectionLatencyMs` / `syncStatus` / `predictedOffsetPx` / `framesSinceDetection`
  2. 调试浮层展示新增指标
- **DependsOn**: fsm-004
- **EstimatedEffort**: 1d
- **Priority**: P1
- **Acceptance**: AC-P1-2

### Phase 3:预测补偿与录制专项(1~2 周)

#### MotionTracker 速度外推 [kimi-task:fsm-007]
- **Assignee**: RD
- **Scope**: `beauty-engine/src/main/java/com/picme/beauty/internal/framesync/MotionTracker.kt`
- **Expected Change**:
  1. 创建 `MotionTracker` 类,保留最近 3 帧历史
  2. 实现 `predict(fromFrameId, toFrameId, maxRatio)` 速度外推
  3. 位移约束:不超过上一帧位移的 150%
- **DependsOn**: fsm-002
- **EstimatedEffort**: 2d
- **Priority**: P1
- **Acceptance**: AC-P1-1

#### 录制场景帧同步验证 [kimi-task:fsm-008]
- **Assignee**: QA
- **Scope**: `app/src/androidTest/java/com/mamba/picme/camera/VideoRecordingSyncTest.kt`
- **Expected Change**:
  1. 编写录制快转头测试用例
  2. 编写录制人脸出画入画测试用例
  3. 逐帧分析录制视频,验证妆容偏差
- **DependsOn**: fsm-004, fsm-005
- **EstimatedEffort**: 2d
- **Priority**: P0
- **Acceptance**: AC-P0-5

6. 术语词典(Glossary)

维护统一的术语定义,确保 Spec 语义一致性:

术语 英文 定义 禁用别名
大美丽 Big Beauty PicMe 自研 OpenGL ES + EGL 美颜引擎 美颜引擎、自研引擎
帧同步 Frame Sync 人脸检测帧与渲染帧的时间对齐机制 同步系统、时序对齐
妆容甩飞 Makeup Detachment 妆容与人脸位置不同步的分离现象 妆容滞后、妆容漂移
悬空残留 Hover 人脸出画后妆容仍停留在屏幕上的现象 妆容残留
严格缺失 Strict Missing 无检测结果 N 帧后强制隐藏妆容的策略 缺失隐藏、严格模式
预测补偿 Prediction Compensation 基于运动轨迹预测人脸位置的补偿算法 运动预测、预测算法
FaceId / FrameId FrameId 全局单调递增帧标识符 帧ID、frame_id
零拷贝 Zero Copy GPU 管线中禁止 CPU-GPU 数据传输 无拷贝、直通
降级 Fallback 引擎异常时自动回退到基础预览 回退、降级策略
库化 Library-ization 将引擎模块演进为独立发布库 模块化、独立库
TAG 生成 Tag Generation 本地 5-Pass 照片标签生成管道 打标、标签扫描
语义召回 Semantic Recall MobileCLIP 文本-图像相似度召回 CLIP 搜索
显式召回 Explicit Recall 基于结构化字段(时间/地点/人脸/TAG)的 SQL 召回 规则召回

7. 更新历史

版本 日期 变更 作者
1.0 2026-05-14 初版,定义双螺旋演进工作流、反向链接规范、CI 检查规则 PM
1.1 2026-06-30 更新文档引用(GALLERY_SEARCH / AUTO_TAG / BEAUTY_ENGINE_TECH_SPEC),补充搜索/TAG 红线、I18N/隐私否决项、当前 CI 命令 CO
1.2 2026-07-08 合并 CODE_REVIEW_CHECKLIST.mdTASK_MARKUP_SPEC.md,统一为研发流程唯一事实来源;更新目录与元信息 CO