Skip to content

Commit aa3a2bc

Browse files
committed
docs(adr): 退役 ADR-010 并同步前向引用与需求池
1 parent 99602da commit aa3a2bc

16 files changed

Lines changed: 81 additions & 38 deletions

‎app/src-tauri/src/ai_guardrails.rs‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
//! 补缝式 AI 护栏骨架(REQ-055 / v0.5.0 M8,依据 ADR-010)。
1+
//! AI 护栏(起源 REQ-055 / v0.5.0 M8;其原宿主「补缝式 AI」已随 ADR-010 退役,本模块留存)。
22
//!
3-
//! @ai-context: 成本与隐私护栏(云端 V1.0 实装后生效,本版骨架就位):
4-
//! ① 同图 hash 缓存(不重复上传/计费);② 每日配额计数器;
5-
//! ③ 审计日志(上传了什么/何时/结果——V1.0 启用);
3+
//! @ai-context: 成本与隐私护栏,现服务活着的 AI 链路(笔记文本复核 / 精修 / 笔记精修):
4+
//! ① 内容 hash 缓存(不重复上传、不重复计费);② 每日配额计数器;
5+
//! ③ 审计日志(上传了什么/何时/结果——经 `ai_audit_list` 可见化);
66
//! ④ 来源标记 ai-enhanced 永远可辨认(产物块 source)。
77
//! @ai-context: 纯逻辑可单测(日期翻转/配额耗尽/hash 命中);
8-
//! hash 缓存与审计落库由 command 层接 SQLite(骨架接口已定)。
8+
//! 全部状态**纯内存**(`AiGuardrails` 由 AppState 持有):hash 缓存与审计缓冲
9+
//! 都不落库 —— 本模块零 SQLite 依赖(旧文案称"落库由 command 层接"不成立)。
910
1011
use std::collections::HashMap;
1112

@@ -69,9 +70,9 @@ pub fn text_hash(text: &str) -> u64 {
6970
h.finish()
7071
}
7172

72-
/// 同图 hash 缓存(不重复上传/计费):裁剪图 hash → 已获取的 AI 响应。
73+
/// 内容 hash 缓存(不重复上传/计费):送审内容 hash → 已获取的 AI 响应。
7374
///
74-
/// @ai-context: 判定器同图多次失败(静止画面多帧)→ 命中缓存零重复上传;
75+
/// @ai-context: 同一内容重复送审(同文本段/同图多帧)→ 命中缓存零重复上传;
7576
/// 缓存带容量上限(LRU 淘汰)。
7677
#[derive(Debug)]
7778
pub struct AiHashCache {
@@ -131,7 +132,7 @@ impl AiHashCache {
131132
}
132133
}
133134

134-
/// 审计日志条目(V1.0 实装后启用;落库字段契约)。
135+
/// 审计日志条目(**纯内存**缓冲条目;`at_ms`/序列化仅供 IPC 与前端展示,无落库路径)。
135136
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
136137
pub struct AiAuditEntry {
137138
pub at_unix: i64,
@@ -141,15 +142,15 @@ pub struct AiAuditEntry {
141142
pub result: String,
142143
}
143144

144-
/// 护栏聚合状态(AppState 持有:每日配额 + 同图缓存 + 审计日志内存缓冲)。
145+
/// 护栏聚合状态(AppState 持有:每日配额 + 内容缓存 + 审计日志内存缓冲)。
145146
///
146147
/// @ai-context: command 层在锁内 read-modify-write(防 TOCTOU);
147-
/// 审计日志 V1.0 实装后落库(骨架接口:push 缓冲已就位)。
148+
/// 审计日志**只留在内存**(`ai_audit_list` 读、`ai_audit_clear` 清,无落库)。
148149
#[derive(Debug)]
149150
pub struct AiGuardrails {
150151
pub quota: DailyQuota,
151152
pub cache: AiHashCache,
152-
/// 审计缓冲(V1.0 落库前保留最近 200 条)
153+
/// 审计缓冲(纯内存,保留最近 200 条)
153154
pub audit: Vec<AiAuditEntry>,
154155
}
155156

‎app/src-tauri/src/ai_guardrails_tests.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! 补缝式 AI 护栏骨架单测(REQ-055 / v0.5.0 M8)。
1+
//! AI 护栏单测(起源 REQ-055 / v0.5.0 M8;「补缝式 AI」宿主已随 ADR-010 退役)。
22
//!
33
//! @ai-context: AAA 模式;覆盖配额跨日翻转/耗尽、hash 缓存命中/LRU、审计条目。
44

‎app/src-tauri/src/app_setup.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ pub fn setup_app_state(app: &mut tauri::App) -> Result<(), String> {
104104
let asr_confusion = std::sync::Arc::new(std::sync::Mutex::new(
105105
crate::asr_confusion::AsrConfusionStore::load(&asr_confusion_path),
106106
));
107-
// v0.5.0 M8(REQ-055):补缝式 AI 护栏骨架(配额/缓存/审计;云端 V1.0 生效)
107+
// v0.5.0 M8(REQ-055):AI 护栏状态(配额/缓存/审计;纯内存,服务活着的 AI 链路)
108108
let ai_guardrails =
109109
std::sync::Arc::new(std::sync::Mutex::new(crate::ai_guardrails::AiGuardrails::default()));
110110
// v0.11.1:功能开关(feed_capture 默认关——v4 §11.3;JSON 持久化,

‎app/src-tauri/src/commands.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ pub struct AppState {
116116
pub profile_memory: std::sync::Arc<std::sync::Mutex<ProfileMemory>>,
117117
/// v0.5.0 M6(REQ-051):应用数据目录(会话图片存储基目录)
118118
pub data_dir: std::path::PathBuf,
119-
/// v0.5.0 M8(REQ-055):补缝式 AI 护栏状态(每日配额 + 同图 hash 缓存;
120-
/// 云端 V1.0 实装后生效,骨架就位)
119+
/// v0.5.0 M8(REQ-055):AI 护栏状态(每日配额 + 内容 hash 缓存 + 审计内存缓冲;
120+
/// 纯内存,服务活着的文本复核/精修链路)
121121
pub ai_guardrails: std::sync::Arc<std::sync::Mutex<crate::ai_guardrails::AiGuardrails>>,
122122
/// v0.11.1:功能开关内存态单点(锁内 read-modify-write,同词表模式防 TOCTOU)
123123
pub feature_flags: std::sync::Arc<std::sync::Mutex<crate::feature_flags::FeatureFlags>>,

‎app/src-tauri/src/formula_reconstruct.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
//! @ai-context: 双轨保障——UniMERNet 模型版(spike 通过则为主)与规则版(兜底):
44
//! 本模块为规则版:字符基线 + 字号聚类 → 上下标判定 → LaTeX 片段
55
//! (x² → x^2、H₂O → H_2O);分数线/根号/积分包围关系检测(渲染公式限定)。
6-
//! @ai-context: 手写公式 → 标 unknown → AI 补缝(V1.0);本模块输入为
7-
//! 字符级识别结果(编排层由 OCR bbox 填充:字符 + 相对基线 + 字号)。
6+
//! @ai-context: 手写公式 → 标 unknown(原 AI 补缝判定器已于批 1 删除,ADR-010 退役);
7+
//! 本模块输入为字符级识别结果(编排层由 OCR bbox 填充:字符 + 相对基线 + 字号)。
88
//! @ai-context: 纯逻辑可单测;输入带 y 偏移与字号比,输出 LaTeX 与置信度。
99
1010
use serde::{Deserialize, Serialize};
@@ -110,8 +110,8 @@ pub fn build_fraction(numerator: &str, denominator: &str) -> Option<String> {
110110
///
111111
/// @ai-context: 空输入 → 空块(confidence 0);仅文本(无 y/字号特征)由编排层
112112
/// 构造 size_ratio=1.0 输入 → 全部 Normal → 原文直出 + 低置信。
113-
/// @ai-context: 消费方 = M7 产物体系(FormulaBlock 作为产物块类型)+ AI 补缝
114-
/// 判定器(低置信 → ai_candidate);当前阶段仅测试覆盖,登记豁免。
113+
/// @ai-context: 消费方 = 无(原 M7 产物体系与 AI 补缝判定器均已于批 1 删除,ADR-010 转已废弃);
114+
/// 当前仅测试覆盖,登记豁免 dead_code。
115115
#[allow(dead_code)]
116116
pub fn reconstruct_formula(chars: &[FormulaChar]) -> FormulaBlock {
117117
let source_text: String = chars.iter().map(|c| c.ch).collect();

‎app/src-tauri/src/layout_analyzer.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub enum RegionKind {
2424
Code,
2525
/// 图片/照片区域
2626
Image,
27-
/// 无法分类(低置信 → AI 补缝候选,V1.0)
27+
/// 无法分类(低置信;原 AI 补缝候选通道已随 ADR-010 退役)
2828
Unknown,
2929
}
3030

@@ -454,7 +454,7 @@ fn is_code_block(grid: &FrameGrid, x0: u32, y0: u32, x1: u32, y1: u32) -> bool {
454454
///
455455
/// @ai-context: table/code 高权重高分辨率(结构信息价值高);formula 中权重;
456456
/// text 常规;image 跳过(非文字信息,M6 图集处理);
457-
/// unknown 低权重(低置信 → 补缝 AI 候选,V1.0)。
457+
/// unknown 低权重(低置信;原补缝 AI 候选通道已随 ADR-010 退役)。
458458
/// @ai-context: 返回 (采样权重 0.0-1.0, 是否跳过)。权重乘到区域级采样频率。
459459
/// @ai-context: M4(region_ocr 调度)消费本表;当前仅测试覆盖,登记豁免 dead_code。
460460
#[allow(dead_code)]

‎app/src-tauri/src/region_ocr.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//! @ai-context: 本模块为纯逻辑(坐标还原/裁剪参数/区域调度封顶),可单测;
77
//! 实际 OCR 调用由编排层(live_session_frame)执行。
88
//! @ai-context: 回退链:layout 失败 → 整帧直跑(现状行为);区域识别失败 →
9-
//! 该区域标记 unknown(低置信 → 图片归档候选/AI 补缝 V1.0)。
9+
//! 该区域标记 unknown(低置信 → 图片归档候选;原 AI 补缝通道已退役)。
1010
1111
// v0.12.0 M5 补完成后(ADR-023 视频会话不再识别画面要点):region_ocr_blocks
1212
// 及其专属辅助(schedule_regions/crop_spec/map_to_frame/crop_region_bgra/
@@ -112,7 +112,7 @@ pub fn schedule_regions(regions: &[LayoutRegion]) -> Vec<&LayoutRegion> {
112112
/// 区域识别结果(编排层回填:区域 + 还原后的块)。
113113
///
114114
/// @ai-context: 当前编排层内联处理区域结果(region_ocr_blocks),本结构为
115-
/// 测试契约与后续产物/补缝消费预留,登记豁免 dead_code。
115+
/// 测试契约与机制先行预留(原产物/补缝消费方已于批 1 删除),登记豁免。
116116
#[derive(Debug, Clone, PartialEq)]
117117
#[allow(dead_code)]
118118
pub struct RegionOcrResult {
@@ -191,7 +191,7 @@ pub fn region_ocr_blocks(
191191
h: bbox.h / spec.scale,
192192
});
193193
}
194-
// 区域类型标注(M4:产物/补缝判定器消费)
194+
// 区域类型标注(M4;原产物/补缝判定器消费方已于批 1 删除)
195195
b.region_kind = Some(region.kind.as_str().to_string());
196196
merged.push(b);
197197
}

‎app/src-tauri/src/types_extract.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ pub struct TranscriptSegment {
3131
pub volume: Option<f32>,
3232
}
3333

34-
/// 词级时间戳(B8:产物双向定位 + AI 补缝判定器基础)。
34+
/// 词级时间戳(B8:`TranscriptSegment.word_timestamps` 的传输契约,serde 线格式由
35+
/// `types_contract_tests.rs` 锚定;产物双向定位与补缝判定器的消费方已于批 1 删除)。
3536
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
3637
pub struct WordTimestamp {
3738
pub word: String,

‎docs/adr/ADR-004-session-data-model.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ v0.2.0(REQ-010)需要会话管理:每次学习 = 一个会话,可列表/
1515
需求约束:
1616

1717
- 会话是"课堂助手实时捕获"的主产物,转写段与 OCR 块需要与时间轴对齐存储(REQ-012 融合结果也需落库)
18-
- 会话产物可一键转为笔记(复用 v0.1.0 的 `save_draft_as_note` / 拼接逻辑),但会话本身独立存在(可多次转笔记、可删除会话不影响已有笔记)
18+
- 会话产物可一键转为笔记(复用 v0.1.0 的 `save_draft_as_note` / 拼接逻辑——**该命令已于批 1 删除,2026-09-12;现行通道是 `session_to_note`(`commands_session_note.rs`),复用关系不变**),但会话本身独立存在(可多次转笔记、可删除会话不影响已有笔记)
1919
- 检索维度:标题 / 创建时间 / 关键词(转写内容)
2020
- SQLite(rusqlite bundled)已定,本地优先,数据不出本机
2121

‎docs/adr/ADR-010-gap-filling-ai.md‎

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
## 状态
44

5-
已接受(2026-08-18,六轮头脑风暴轮 6 产出;0.5.0 做协议前置构建,V1.0 实装云端)
5+
**已废弃(2026-09-11 批 1 裁决 · 2026-09-12 落地,退役修订)** —— 原「已接受(2026-08-18,六轮头脑风暴轮 6 产出;0.5.0 做协议前置构建,V1.0 实装云端)」。
6+
退役依据:[前端重设计规格 §9/§10](../superpowers/specs/2026-09-11-frontend-redesign-design.md)(批 1「删除批」)· 控制方 2026-09-11 裁决。状态词取自 [ADR 标准](../standards/adr.md) 的状态流转 `Proposed → Accepted → (Deprecated | Superseded)` 与本目录索引词表:**已废弃** =「不再适用,但保留供历史追溯」;取「已废弃」而非「已取代」,因为**没有任何新 ADR 取代它**(本决策是被撤回,不是被替代)。
7+
**本文档保留供历史追溯,不删除**(ADR 纪律:被废弃的 ADR 不删除,见 [ADR 标准](../standards/adr.md))。
68

79
## 日期
810

@@ -91,3 +93,42 @@
9193
- [头脑风暴:视频类型 × 提取优化(轮 6,[ ] 已归档)](../archive/2026-08-19/brainstorming-video-types.md)
9294
- [头脑风暴:无云端 AI 的内容提取极限](../Foresight/brainstorming-no-cloud-ai-extraction-limit.md)
9395
- [v0.5.0 版本计划](../versions/v0.5.0.md)(M8 补缝前置 / 七、远期规划)
96+
97+
## 退役修订(2026-09-11 裁决 / 2026-09-12 落地)
98+
99+
### 退役范围(**只此一项**)
100+
101+
**「补缝式 AI」这一具体形态退役**:块级 `ai_candidate` 判定器 · 上传协议 schema 与 mock 适配器 · 三条前置 IPC 命令(`scan_ai_candidates` / `ai_enhance_mock` / `ai_enhance_status`)· `ai_judge` 判定器模块。
102+
103+
落地于**批 1(删除批,规格日期 2026-09-11 / 提交日期 2026-09-12)**,逐条可复现:
104+
105+
| 事实 | 实测(2026-09-12) | 复现命令 |
106+
|---|---|---|
107+
| 注册命令总数 | **312**(334 → 312;本批共删 **22** 条,其中补缝三连 **3** 条) | `node scripts/check-command-registry.mjs` → `✅ 命令注册一致:定义 312 / 注册 312 / 重复 0` |
108+
| 被删命令名(全批 22 条) | `ai_enhance_mock` · `ai_enhance_status` · `scan_ai_candidates` + 另 19 条 | 对 `e96ab63d`(批 1 开工前)与 HEAD 各取 `app/src-tauri/src/app_commands.rs` 的 `generate_handler!` 清单,按 `scripts/check-command-registry.mjs` 的官方逐行解析口径做集合差;探针 `.superpowers/sdd/2026-09-11-frontend-redesign-batch1-deletions/tmp/diff-registry.js`(未入库)→ `before=334 after=312 removed=22 added=0` |
109+
| 被删模块/符号(补缝面) | `ai_judge.rs`(158 行,整文件)· `ai_judge_tests.rs`(139 行 / 9 用例)· `ai_mock_tests.rs`(7 用例)· `AiMockAdapter::enhance` · `ai_protocol.rs` 的 `AiEnhance*` 半边(`AiEnhanceRequest`/`AiEnhanceResponse`/`AiResponseContent`/`AiNode`/`AiRequestType` 等 8 符号 + 10 用例) | `git diff --name-status --diff-filter=D e96ab63d HEAD` · `git grep -nF AiEnhance -- app/` → 只剩持久化来源标记 `BlockSource::AiEnhanced`(**不是**协议类型) |
110+
| 主提交 | `fd9dd8f9 chore(rust): 删补缝三连及连带死模块与协议半边`(10 文件 +22 / −904) | `git show --stat fd9dd8f9` |
111+
| 本 ADR 的修订史 | **仅 2 次提交**(`0a4dabf0` 创建 / `1cbb56bf` 归档搬移)⇒ 本次退役是它自创建以来的**第一次实质修订**("从未被实质修订"这一主张因此可查) | `git log --oneline -- docs/adr/ADR-010-gap-filling-ai.md` |
112+
| 仍然活着的替代通道 | `review_text_filter` / `text_filter_status`(REQ-085 文本复核)仍注册;`ai_protocol.rs` 现为 `TextFilter*` 单一协议;`ai_mock.rs` 仍在(`review_text` 离线 mock) | `git grep -nF TextFilter -- app/src-tauri/src/ai_protocol.rs` · `Select-String -Path app/src-tauri/src/app_commands.rs -Pattern 'review_text_filter'` |
113+
114+
### 退役理由(三条,均为实测)
115+
116+
1. **宿主特性已下线**:本决策的渲染宿主「产物视图」在 v0.11.5 已删除 ⇒ `ai_candidate` 块与 `AiEnhanceResponse` 的渲染链路没有消费端。(批 1 Task 3 随后删掉整个产物子系统:`commands_artifacts.rs` / `artifact_templates*.rs` / `narrative_detect*.rs`。)
117+
2. **能力已被更好的通道覆盖**:本地失败块的「文本侧」由 REQ-085 文本复核(`review_text_filter` / `text_filter_status`,**活**)承载;「图像侧」由 [ADR-023](./ADR-023-video-ocr-offline-vision-extract.md) 的精修图片理解承载;二者都不依赖 `ai_candidate` 判定器。
118+
3. **从未实装且不再排期**:V1.0 云端实装(REQ-056)从未开工,规格 §9 已把三条命令归入「删」。
119+
120+
### ★ 退役**不包含**的内容(仍然生效,逐条)
121+
122+
下列条款**继续有效**,其出处仍在本文档(因此其他 ADR 对本 ADR 的引用**不失效、不悬空**):
123+
124+
- **本地优先**:数据不出本机;本地结果永远保留(AI 是叠加层而非替代层)。
125+
- **AI 默认关闭 + 用户授权**:任何上传必须用户显式授权,上传前可见、可拒绝。
126+
- **必须有本地降级路径**:云端不可用/未授权/超配额 ⇒ 回退纯本地结果,永不阻断主链路(现由 `review_text_filter` 的降级链与 `ai_refine_task` 的纯文本降级承载)。
127+
- **上传最小化**:只传完成本次理解所必需的最小内容(现由精修切片与文本复核批次承载)——ADR-023 的图片授权契约是它在图像侧的扩展。
128+
- **凭据与隐私**:密钥走 DPAPI 凭据库(ADR-016),审计留痕(`ai_guardrails`,现服务活着的精修/文本复核链路)。
129+
130+
⇒ **本 ADR 退役 ≠ 本地优先红线放松**。红线全文见 `AGENTS.md` §4 与规格 §3;引用本 ADR 的 ADR-016 / 017 / 021 / 023 / 026 / 027 / 028 / 029 / 030 引用的是上述**仍然生效**的条款(另 [ADR-033](./ADR-033-l1-primitives-and-view-layer-contract.md) 的「登记」节与本目录索引已同步为「已废弃 / 批 1 已落」)。
131+
132+
### 残留(**已清零**,2026-09-12 更正)
133+
134+
计划原文曾把 `ai_protocol.rs` 的 `AiEnhance*` 半边登记为「未随本批删除的残留,给批 8」;**该判断已被控制方 2026-09-12 裁决推翻** —— 半边与 `TextFilter` 半边已物理切开并随 `fd9dd8f9` 一起删除 ⇒ **本决策「判定器 / 协议 / mock / 三命令」这一面的在码残留为 0**。不在删除面内、因此仍然存在的只有 `artifact.rs` 的持久化来源标记 `BlockSource::AiEnhanced`(历史数据的格式契约,**不可删**,与协议类型无关)。

0 commit comments

Comments
 (0)