NAC_Blockchain/ISSUE_025_RESERVED_IMPORTS_...

543 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Issue #025: 预留导入管理机制
**工单编号**: #025
**工单标题**: 实现统一的预留导入管理机制
**优先级**: 中
**类型**: 技术基础设施
**创建日期**: 2026-02-19
**预计工期**: 2-3周
**状态**: 待处理
---
## 📋 问题背景
### 当前痛点
在NAC项目开发过程中经常遇到以下问题
1. **未使用导入警告泛滥**
- 开发者为未来功能预留导入,但编译器报告`unused import`警告
- 为了消除警告,开发者可能:
- 使用`#[allow(unused_imports)]`掩盖问题(危险!)
- 删除导入,导致未来开发者不知道原计划(埋雷!)
- 保留警告,干扰正常开发(烦人!)
2. **技术债缺乏可见性**
- 预留的功能和依赖没有统一记录
- 后续开发者不知道为什么某些代码被注释掉
- 无法追踪预留项的生命周期
3. **多编译器不一致**
- Rust、Charter、CNNL三套编译器处理方式不同
- 缺乏统一的预留导入规范
- 团队协作困难
### 触发事件
在Issue #024 (nac-ai-valuation)开发过程中,遇到了大量未使用导入警告。经过讨论,确定了以下原则:
- ❌ 不使用`#[allow(unused)]`掩盖问题
- ❌ 不随意删除可能需要的导入
- ✅ 需要一个正式的预留导入管理机制
---
## 🎯 解决方案
### 核心理念
**将"未使用的导入"从"代码异味"转变为"未来路线图的活文档"**
通过统一的预留属性语法,让预留导入成为:
- 📝 **可文档化** - 每个预留都有编号和说明
- 🔍 **可追踪** - 可以生成预留清单,纳入技术债管理
- 🔄 **可审计** - 可以检查预留是否过期,是否应该清理
- 🤝 **可协作** - 团队成员清楚知道预留的目的和计划
### 设计原则
1. **统一性** - Rust、Charter、CNNL使用相同的语法和语义
2. **明确性** - 每个预留都有唯一编号和清晰说明
3. **可进化** - 支持预留的启用、延期、废弃
4. **可审计** - 可以生成报告,追踪预留生命周期
5. **零成本** - 不影响编译性能和运行时性能
---
## 📐 技术方案
### 1. 统一预留属性语法
#### 1.1 Rust通过自定义属性
```rust
#[reserved(
id = "XIC-001",
description = "跨链桥升级所需预计2026Q3启用",
owner = "bridge-team",
deadline = "2026-09-30"
)]
use some_crate::FutureModule;
```
#### 1.2 Charter语言原生支持
```charter
@reserved(
id="XIC-002",
description="XTZH v2 预言机接口",
owner="oracle-team",
deadline="2027-03-31"
)
import future::oracle_v2;
```
#### 1.3 CNNL宪法层预留条款
```cnnl
// 宪法条款也可有预留导入
@reserved(
id="CON-001",
description="国际商事法律规则库",
owner="legal-team",
deadline="2027-12-31"
)
import law::cisg;
```
### 2. 预留编号规范
#### 2.1 编号格式
```
<项目代号>-<序号>
```
#### 2.2 项目代号
- `CORE` - 核心模块
- `XIC` - 跨链互操作
- `BRIDGE` - 跨链桥
- `ORACLE` - 预言机
- `AIVAL` - AI估值
- `CON` - 宪法层
- `RPC` - RPC接口
- `TOOL` - 工具链
#### 2.3 序号规则
- 从001开始连续编号
- 同一项目代号下序号唯一
- 废弃的编号不重用
### 3. 预留属性字段
#### 3.1 必填字段
- `id` - 预留编号(全局唯一)
- `description` - 预留说明(简短描述用途)
#### 3.2 可选字段
- `owner` - 负责团队或负责人
- `deadline` - 预计启用时间YYYY-MM-DD
- `issue` - 关联的Issue编号
- `status` - 状态planned/in-progress/blocked/cancelled
- `priority` - 优先级high/medium/low
### 4. 编译器行为
#### 4.1 Rust编译器扩展
- 通过`cargo-constitution` Lint实现
- 识别`#[reserved]`属性
- 不报告`unused import`警告
- 生成预留清单文件`reserved_deps.json`
#### 4.2 Charter编译器
- 原生支持`@reserved`属性
- 编译时验证预留编号唯一性
- 支持`--list-reserved`选项输出清单
#### 4.3 CNNL编译器
- 原生支持`@reserved`属性
- 与宪法治理流程集成
- 预留的启用可能需要治理投票
### 5. 工具链支持
#### 5.1 cargo-constitution
```bash
# 查看所有预留
cargo reserved list
# 查看特定项目的预留
cargo reserved list --project XIC
# 检查过期预留
cargo reserved check-expired
# 生成预留报告
cargo reserved report --format markdown
# 启用预留(移除@reserved属性
cargo reserved activate XIC-001
# 废弃预留添加cancelled状态
cargo reserved cancel XIC-002 --reason "需求变更"
```
#### 5.2 IDE插件
- 高亮显示预留导入
- 鼠标悬停显示预留信息
- 快速跳转到相关Issue
- 提示即将过期的预留
#### 5.3 CI集成
```yaml
# .github/workflows/check-reserved.yml
name: Check Reserved Imports
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Check expired reserved imports
run: cargo reserved check-expired --fail-if-expired
- name: Generate reserved report
run: cargo reserved report --format markdown > reserved_report.md
- name: Upload report
uses: actions/upload-artifact@v2
with:
name: reserved-report
path: reserved_report.md
```
### 6. 预留生命周期管理
#### 6.1 预留状态
- `planned` - 已规划,等待实现
- `in-progress` - 正在实现中
- `blocked` - 被阻塞,无法继续
- `cancelled` - 已取消,不再需要
- `activated` - 已启用,移除预留标记
#### 6.2 生命周期流程
```
planned → in-progress → activated
↓ ↓
cancelled blocked → in-progress
```
#### 6.3 过期检查
- 如果预留超过deadline未启用CI发出警告
- 如果预留超过1年未启用建议评估是否取消
- 定期(每季度)审查所有预留项
---
## 📦 交付物
### 1. 技术规范文档
- [x] 预留导入管理机制规范(本文档)
- [ ] 附件G多编译器协同使用细则更新版
- [ ] 预留编号分配指南
- [ ] 预留生命周期管理流程
### 2. Rust工具链
- [ ] cargo-constitution Lint扩展
- [ ] 预留属性宏实现
- [ ] cargo reserved子命令
- [ ] 预留清单生成器
### 3. Charter编译器
- [ ] @reserved属性解析
- [ ] 预留编号唯一性检查
- [ ] --list-reserved选项
- [ ] 预留清单输出
### 4. CNNL编译器
- [ ] @reserved属性解析
- [ ] 与治理流程集成
- [ ] 预留条款管理
### 5. IDE插件
- [ ] VSCode插件Rust
- [ ] Charter语言服务器扩展
- [ ] CNNL语言服务器扩展
### 6. CI/CD集成
- [ ] GitHub Actions工作流
- [ ] GitLab CI配置
- [ ] 预留报告生成脚本
### 7. 文档和示例
- [ ] 使用指南
- [ ] 最佳实践
- [ ] 示例项目
- [ ] FAQ
---
## 🎯 验收标准
### 1. 功能完整性
- [ ] 三种语言Rust/Charter/CNNL都支持预留属性
- [ ] 编译器能正确识别和处理预留导入
- [ ] 不报告预留导入的unused警告
- [ ] 能生成预留清单
### 2. 工具链完整性
- [ ] cargo reserved命令可用
- [ ] IDE插件正常工作
- [ ] CI集成正常运行
- [ ] 预留报告格式正确
### 3. 文档完整性
- [ ] 技术规范文档完整
- [ ] 使用指南清晰
- [ ] 示例代码可运行
- [ ] FAQ覆盖常见问题
### 4. 质量标准
- [ ] 零编译警告
- [ ] 所有测试通过
- [ ] 代码覆盖率>80%
- [ ] 性能无明显下降
---
## 📅 实施计划
### Phase 1: 规范制定3天
- [ ] 完善技术规范文档
- [ ] 制定预留编号分配规则
- [ ] 设计预留清单格式
- [ ] 评审和确认
### Phase 2: Rust工具链1周
- [ ] 实现cargo-constitution Lint扩展
- [ ] 实现预留属性宏
- [ ] 实现cargo reserved子命令
- [ ] 编写测试
### Phase 3: Charter编译器3天
- [ ] 实现@reserved属性解析
- [ ] 实现预留编号检查
- [ ] 实现--list-reserved选项
- [ ] 编写测试
### Phase 4: CNNL编译器3天
- [ ] 实现@reserved属性解析
- [ ] 集成治理流程
- [ ] 编写测试
### Phase 5: IDE插件3天
- [ ] 实现VSCode插件
- [ ] 实现语言服务器扩展
- [ ] 测试和优化
### Phase 6: CI/CD集成2天
- [ ] 编写GitHub Actions工作流
- [ ] 编写预留报告生成脚本
- [ ] 测试CI集成
### Phase 7: 文档和示例2天
- [ ] 编写使用指南
- [ ] 编写最佳实践
- [ ] 创建示例项目
- [ ] 编写FAQ
### Phase 8: 测试和优化2天
- [ ] 集成测试
- [ ] 性能测试
- [ ] 用户测试
- [ ] 优化和修复
---
## 🔗 依赖关系
### 上游依赖
- NAC编译器工具链Charter/CNNL
- cargo-constitution基础框架
- NAC治理流程
### 下游影响
- 所有NAC模块开发
- 代码审查流程
- 技术债管理
- 项目规划
---
## 📊 成功指标
### 量化指标
- 预留导入使用率 > 80%(团队采纳度)
- unused import警告减少 > 90%
- 技术债可见性提升 100%(所有预留都有记录)
- 预留启用率 > 60%(预留最终被使用的比例)
### 质量指标
- 团队满意度 > 4/5
- 文档完整性 100%
- 工具稳定性 > 99%
- 性能影响 < 1%
---
## ⚠️ 风险和挑战
### 技术风险
1. **编译器集成复杂度**
- 风险三套编译器集成工作量大
- 缓解分阶段实施先Rust后Charter/CNNL
2. **性能影响**
- 风险预留检查可能影响编译速度
- 缓解优化算法使用缓存
3. **向后兼容性**
- 风险现有代码需要迁移
- 缓解提供迁移工具保持兼容期
### 流程风险
1. **团队采纳度**
- 风险团队可能不愿意使用新机制
- 缓解提供培训展示价值强制在新代码中使用
2. **维护成本**
- 风险预留项过多导致维护困难
- 缓解定期审查自动化过期检查
---
## 💡 最佳实践
### 1. 何时使用预留导入
**应该使用**
- 已确定的未来功能但当前不实现
- 跨模块依赖等待上游模块完成
- 实验性功能需要feature flag控制
- 技术债计划未来重构
**不应该使用**
- 不确定是否需要的功能
- 可以立即实现的功能
- 已废弃的功能
- 临时测试代码
### 2. 预留说明编写规范
```rust
// ✅ 好的预留说明
#[reserved(
id = "XIC-001",
description = "跨链桥升级到IBC协议等待ibc-rs v2.0稳定版发布",
owner = "bridge-team",
deadline = "2026-09-30",
issue = "#123"
)]
use ibc_rs::v2::Context;
// ❌ 不好的预留说明
#[reserved(id = "XIC-002", description = "可能需要")]
use some_crate::Something;
```
### 3. 预留生命周期管理
- 每月检查即将过期的预留
- 每季度审查所有预留项
- 及时更新预留状态
- 启用后立即移除预留标记
---
## 📚 参考资料
### 相关Issue
- Issue #024: nac-ai-valuation AI估值系统完善触发本工单
### 相关文档
- NAC技术宪法
- 附件G多编译器协同使用细则
- cargo-constitution设计文档
- Charter语言规范
- CNNL语言规范
### 外部参考
- Rust RFC: Custom attributes
- Cargo book: Custom commands
- Language Server Protocol
---
## 🎓 经验教训来自Issue #024
### 1. 不要使用`#[allow(unused)]`掩盖问题
未使用的代码可能是逻辑错误或安全隐患不应该用属性掩盖
### 2. 不要随意删除导入
测试代码可能需要应该在测试模块中导入不要给未来开发者埋雷
### 3. 所有字段都应该有用途
如果不用就删除如果用就实际使用不要保留无用字段
### 4. 需要正式的预留机制
临时的注释和TODO不够需要正式的可追踪的预留机制
---
## ✅ 验收清单
### 技术实现
- [ ] Rust工具链完成
- [ ] Charter编译器完成
- [ ] CNNL编译器完成
- [ ] IDE插件完成
- [ ] CI/CD集成完成
### 文档完善
- [ ] 技术规范完成
- [ ] 使用指南完成
- [ ] 最佳实践完成
- [ ] FAQ完成
### 测试验证
- [ ] 单元测试通过
- [ ] 集成测试通过
- [ ] 性能测试通过
- [ ] 用户测试通过
### 部署上线
- [ ] 代码提交Git
- [ ] 文档发布
- [ ] 团队培训
- [ ] 正式启用
---
## 📝 备注
### 临时方案(在正式实现前)
在正式实现预留导入管理机制之前可以使用以下临时方案
```rust
// 临时方案:使用注释标记预留导入
// @reserved(id="AIVAL-001", description="未来可能需要的XXX功能")
// use future_module::Something;
```
这种方式虽然不够优雅但至少
- 保留了预留意图
- 不会产生编译警告
- 可以通过grep搜索所有预留项
### 后续优化方向
1. 与项目管理工具集成Jira/GitHub Projects
2. 自动生成预留路线图
3. 预留依赖关系可视化
4. AI辅助预留管理
---
**工单创建时间**: 2026-02-19 01:00:00 GMT+4
**工单创建者**: NAC开发团队
**工单状态**: 待处理
**优先级**:
**预计完成时间**: 2026-03-10