# 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