@microi.net/cli 6.1.5 → 6.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +198 -164
- package/scripts/microi-skills.meta.json +232 -232
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +47 -47
- package/skills/ai-engine/SKILL.md +18 -5
- package/skills/app-store/SKILL.md +9 -1
- package/skills/business-blueprint/SKILL.md +1 -1
- package/skills/job-engine/SKILL.md +3 -0
- package/skills/microi-codex/SKILL.md +1 -1
- package/skills/microi-deployment/SKILL.md +42 -18
- package/skills/microi-deployment/references/deployment-matrix.md +7 -1
- package/skills/microi-docs-coverage/SKILL.md +11 -1
- package/skills/microi-microservice/SKILL.md +11 -0
- package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
- package/skills/microi-system-delivery/SKILL.md +1 -0
- package/skills/microi-system-delivery/references/context-quality.md +56 -54
- package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +9 -5
- package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +65 -65
- package/skills/module-engine/SKILL.md +13 -0
- package/skills/module-engine/references/module-config.md +17 -0
- package/skills/ocr-engine/SKILL.md +1 -0
- package/skills/playwright-e2e/SKILL.md +2 -0
- package/skills/system-observability/SKILL.md +12 -5
- package/skills/translate-engine/SKILL.md +2 -0
- package/skills/v8-api-config/SKILL.md +1 -1
- package/skills/v8-file-upload/SKILL.md +18 -1
- package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +2 -2
- package/skills/v8-security/SKILL.md +4 -0
- package/skills/v8-sql-query/SKILL.md +2 -2
- package/skills/workspace-conventions/SKILL.md +154 -136
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +8 -5
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +2 -2
- package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +4 -4
|
@@ -81,7 +81,17 @@ V8 函数”或新增、调整官方中文文档时,使用本 Skill。
|
|
|
81
81
|
4. 在浏览器遍历全部中文阅读路由(包括 `/doc` 与 `/case`),检查页面类型类、唯一 H1、页面级横向溢出和明显低对比文字;再从五种视觉类型各选代表页,覆盖桌面/移动与亮色/暗色截图。专用站点交互页按自身组件测试与代表截图验收。只有已登记范围全部通过,才可描述为“全站视觉验收完成”。
|
|
82
82
|
5. 静态脚本、Sass 编译、单元测试、VitePress 构建和浏览器截图是不同证据层。任何一层因资源保护或环境问题跳过,最终必须明确写出,不能用其它层替代。
|
|
83
83
|
|
|
84
|
-
##
|
|
84
|
+
## 案例、服务与公开指标的证据边界
|
|
85
|
+
|
|
86
|
+
- 从 SaaS 登记整理案例时,只读必要字段并先核对完整分页;登记数、名称去重数、独立客户、付费客户与成功交付数分别定义,不能互相替代。名称不能推断上线、行业成效或客户认可。
|
|
87
|
+
- 客户姓名、租户标识、部署地址、联系信息和业务秘密不进入公开明细;遮挡名称中一个字或发布逐行哈希不等于匿名化。优先使用聚合数据,具名案例和新增截图先确认公开权限并脱敏。
|
|
88
|
+
- 功能、规模和性能分别给出来源、统计日期、目标版本及复核方法;来源未提供的内容写明未核验,不把构建时间当作事实核实时间。没有原始数据时不补造改善比例或认证。
|
|
89
|
+
- 服务地区与联系人采用已确认事实,SSR 正文与结构化数据共用事实源;地区覆盖不自动代表分公司、驻点、认证或统一服务时限。
|
|
90
|
+
- 公开指标工具及方法位于源码工作区 `microi.benchmarks/`(工作区提供时);缺少工具不绕过 MCP 权限或读取整表秘密。公开仓、官网、搜索收录和第三方评价分别验收,不能以本站 HTTP 成功或 AI 索引存在声称排名提升。
|
|
91
|
+
- 机器可读正文从实际构建的公开 SSR 正文生成,排除全站导航、脚本、注释和交互私有数据;与 HTML 使用同一内容源,不另写迎合模型的事实。逐页索引保留规范页面地址、纯文本地址、语言、正文大小和 SHA-256;只有真实来源可支持时才记录修订日期,未知时省略,不以构建日期冒充内容更新。
|
|
92
|
+
- 官网以 HTML 为规范收录页面,纯文本是便于抓取和核对的替代格式;`llms.txt`、HTML 替代链接与正文清单互相一致。发布前验证所有正文入口可生成、内部链接可解析、表格与代码含义保留,并检查账户页、撤回页和非公开内容不进入正文清单。生成完成不能证明搜索引擎已收录或模型已经使用。
|
|
93
|
+
|
|
94
|
+
## 自动审计的检查范围
|
|
85
95
|
|
|
86
96
|
脚本验证:
|
|
87
97
|
|
|
@@ -147,9 +147,20 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
|
|
|
147
147
|
- 服务器暂未部署修复且普通应用产物很小时,可把 `StorageMode=db` 与内联 `ContentBase64` 作为短期恢复手段;必须明确记录为临时方案。修复部署后重新流式发布到公有 HDFS,并恢复 `StorageMode=file`。只有上一条满足严格资源策略的受信任平台启动应用允许长期保留小型数据库产物;禁止借此把普通或大体积 JS/CSS 长期放进数据库 JSON。
|
|
148
148
|
- 子租户发布时,源码、版本资产、回读验签、页面与缓存全部绑定当前 Token 的 `OsClient`;禁止回退到主租户或宿主服务器默认租户。切换前必须由当前 API 节点通过该子租户 HDFS 配置读回每个版本文件并校验大小/SHA-256。
|
|
149
149
|
- CDN 同一不可变对象返回 200 而 API 稳定入口返回 404 时,先检查 API 读取到的当前租户 `FileServer`(含公有桶路径)和已提交 `ReleasePrefix`,不能把默认域名回退当作恢复。配置读取必须将 dynamic 数据显式转为 object/JObject,再调用扩展方法;缺失或无效配置失败关闭。
|
|
150
|
+
- CDN 刷新先验证当前租户可信 `FileServer` 与已校验路径组成的绝对 HTTP(S) 地址,拒绝 UserInfo、Query、Fragment。只有主机名精确匹配 `static.itdos.com`(不区分大小写)才走官方阿里云刷新并强制 HTTPS,刷新资产与入口的 Authority(主机、端口)必须一致;其它合法 HTTP/HTTPS 域名或 IP 不适用官方刷新,不读取其凭据或提交刷新任务。
|
|
151
|
+
- 私有 HTTP/IP 部署在对象投影通过后仍提示“固定入口缺少 HTTPS 公有文件域名”时,应升级 API 的刷新目标分类逻辑,不要求客户为此修改业务源码或伪造 HTTPS 地址。不适用刷新不等于已执行 purge,也不能跳过对象大小/SHA-256 回读、租户隔离与原 RequestId/finalize 门禁;原任务完成和页面实际可用继续分别验收。
|
|
152
|
+
- 首次 CDN 投影的目标尚不存在时,只有提供商验证的明确 `NoSuchKey` 才允许从已校验版本补写。MinIO/S3 必须实际签名 GET 返回 HTTP 404,并完整读取不超过 8 KiB 的合法 S3 XML;精确 Code 与可选 Key/BucketName 均校验通过。OSS 只接受实际 SDK 服务异常的精确 ErrorCode。HDFS 通过 `DataAppend.StorageReadErrorCode=NoSuchKey` 传递语义,MinIO/S3 同时提供 `StorageReadHttpStatusCode=404`;发布器不得按 Msg、路径或桶名中的词推断。普通代理 404、缺桶、拒绝访问、未知错误及不完整读取仍失败关闭。
|
|
153
|
+
- 旧 API 丢失错误码或仍按诊断文字分类时需升级全部 API 节点。恢复 `RepairRequired / ProjectionPending` 前回读原任务,再保留首次 finalize 的 RequestId、版本、清单哈希与原前置条件重放;禁止手工改状态、删除版本或新建同版本发布。验收必须含 Completed、投影完成、服务/页面登记、稳定/版本入口和资产哈希及真实交互。
|
|
150
154
|
- `microi-platform-service` 等受信任 DatabaseOnly 平台包以 `sys_microiservice.StorageMode=db / MsUrl=db` 和内联已验签字节为运行事实。安装后的 `PublicPublishPath=micro-app/{AppKey}/{Version}` 可以没有租户前缀;不能仅凭该字段补前缀或强改为 file。普通 file 应用则核对每项 HdfsPath/FilePathName、当前租户 FileServer 与真实对象。
|
|
151
155
|
- HTML/JS/CSS 被对象存储标为 `application/octet-stream` 时,文件字节可能完全正确。新上传统一设置对象 MIME;运行网关只对已提交资产的空/二进制通用标签按文件路径归一,保留类型兼容、HTML 完整性、大小、哈希及 `nosniff`。需更新全部 API 节点;旧对象的 CDN 直接入口另需修正元数据或正常发布新版本,不能把 API 兼容称为 CDN 已修复。
|
|
152
156
|
|
|
157
|
+
### 复盘:MinIO 首次 CDN 投影停在 HTTP 404
|
|
158
|
+
|
|
159
|
+
- 触发场景:不可变版本资产已校验,首次复制的 CDN 目标尚不存在,发布却停在 `RepairRequired / ProjectionPending`。
|
|
160
|
+
- 根因:可信 HDFS 签名读取将明确的 S3 `NoSuchKey` 丢失为通用 HTTP 404,发布器因无法区分代理或权限故障而拒绝补写。
|
|
161
|
+
- 通用规则:MinIO/S3 验证真实 HTTP 404、完整有界 S3 XML 和对象身份,OSS 验证实际 SDK 的精确错误码;只向发布器传递结构化缺对象码,不扫描诊断文字、路径或桶名。部署全部 API 节点后回读并恢复原任务,不改业务源码或发布状态。
|
|
162
|
+
- 自动化检查:`MicroiHdfsMinioStreamReadTests`、`MicroiHdfsStreamErrorContractTests` 与 `ApplicationCdnCredentialTests` 覆盖 MinIO/S3 成功流、提供商缺对象码、路径/桶名词碰撞、权限/缺桶/代理 404、错误 XML、错误桶/Key、超限正文、取消和超时;完整发布与页面验收继续独立执行。
|
|
163
|
+
|
|
153
164
|
### 宿主路由查询参数
|
|
154
165
|
|
|
155
166
|
嵌入微服务的 iframe 地址与宿主地址隔离,不能仅通过子应用 location.hash 读取站点、业务Id等查询参数。菜单宿主下发 microRoute 及 route.query;应用应合并自身白名单参数,保留完整路径和查询参数,并监听宿主数据变化。同一路径的查询参数变化也应刷新业务数据、取消旧请求,主题或尺寸快照不得覆盖应用内部导航。弹窗可从 microRoute 查询串或 dialogData 读取声明参数;独立访问才回退自身hash。
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
快捷登录和会话协议以 `microi-uniapp-frontend`、`microi-frontend-sdk` 为准;本参考负责
|
|
5
5
|
把源码、外部服务、后台与正式入口组成一条可回读的交付链,避免只有静态页面。
|
|
6
6
|
|
|
7
|
-
<!-- microi-progressive:chunk id=microi-mobile-app-quality-022 sha256=
|
|
7
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-022 sha256=33bf185e007fab2c8316f090b1f608143deca2e3ff4b010e7577c7f88d751008 -->
|
|
8
8
|
## 开发前固定事实源和首版范围
|
|
9
9
|
|
|
10
10
|
- 使用指定 MCP 的实际 Profile,先回读 `ApiBase + OsClient`,不能因为官网发布归主租户就让试用端请求主租户。不同租户用独立浏览器 context,不能只新开标签。
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
### 地图必须按产品与终端验证
|
|
33
33
|
|
|
34
|
+
- 手动选点必须保留用户确认的 `address + name`,名称已包含在地址中时去重;逆地理编码仅补充行政区与缺失地址,不能用坐标解析的道路/园区地址覆盖具体楼号或点位名。自动定位仅有坐标时仍使用逆解析地址;省市区独立存储时,只去掉详细地址开头的行政区前缀。回归覆盖逆解析成功/失败、选点地址为空或仅含名称、名称重复、取消和连续选点,并执行真实表单回填与提交钩子断言;原生地图真机验收单独记录。
|
|
34
35
|
- 高德浏览器 JS API 的 ClientKey 与 Web 服务 REST Key 是不同产品,不能互换。H5 按明确运行 `Mode` 接入:`js` 加载官方 JS SDK;`server-static` 可由可信服务端调用官方 REST 静态地图,返回真实图片并配合服务端 POI、逆地理编码和路线。后者是静态地图,不具备交互瓦片的拖动/缩放体验;不能借此绕过供应商产品或商业授权。App/小程序走对应平台地图与原生授权适配器,不能在非 H5 分支执行 `window/document`。
|
|
35
36
|
- `js` 模式的 JS 安全码或安全代理地址在 SDK 加载前配置,核对当前 SDK 版本、域名允许列表、HTTPS、CORS;所有模式都核对对应产品与商业权限。复制主租户 Key 不保证目标 CDN 域名可用;`INVALID_USER_KEY`、域名拒绝、安全码错误、配额或商业授权错误必须保留供应商阶段与追踪号。
|
|
36
37
|
- 地图运行配置采用最小投影。浏览器 ClientKey 的公开使用不授权公开 REST Key、短信 Secret 或其它服务密钥;需要保护的 JS 安全配置优先按供应商支持方式通过服务端代理,并限制可信目标,不能接受任意转发 URL。
|
|
@@ -28,6 +28,7 @@ description: 已初始化吾码工作区的默认 AI 开发总控入口,用户
|
|
|
28
28
|
|
|
29
29
|
| 工作内容 | 相关 Skill |
|
|
30
30
|
|---|---|
|
|
31
|
+
| 吾码平台编译、测试、一键/Docker 发布 | `microi-deployment` 的“普通吾码发布固定流程(30 分钟)”;默认完整入口:版本 +1、NuGet、API/PC Docker、官网、`PlatformRelease`,基础 Microi.Tests、前端 Node 测试、接口与启动/运行冒烟,扩展浏览器测试仅显式追加 `--platform-frontend-tests` 时执行;默认排除付费 AI、客户数据及 SQL Server 专项,不再逐次询问;复用 `.microi-local` 配置,不新建 Docker/租户或安装聊天,不运行 Code/Agent 独立产品测试;独立商城应用/OpenClaw 源码专项归各自入口,平台通用回归保留 |
|
|
31
32
|
| 需求文档、成熟数据模型、表/字段/索引 | `business-blueprint`、`microi-db-schema`、`microi-form-engine` |
|
|
32
33
|
| 表单宽度、分组、整行控件与视觉 | `microi-form-layout`、`ui-design` |
|
|
33
34
|
| 菜单骨架、AI 开发中占位、逐菜单切换、PageTabs、模块展示 | `module-engine`、`v8-menu-buttons` |
|
|
@@ -1,56 +1,58 @@
|
|
|
1
1
|
# 质量优先的上下文与增量开发
|
|
2
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-008 sha256=
|
|
3
|
-
|
|
4
|
-
本规范用于降低重复读取和重复传输,不降低软件质量。准确性、权限、业务完整性和验收优先于 token、耗时和回复长度。摘要只用于发现目标,不能成为未经核实的写入依据。
|
|
5
|
-
|
|
6
|
-
## 按任务确定必需知识
|
|
7
|
-
|
|
8
|
-
| 范围 | 必须读取与执行 | 扩大范围的条件 |
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| 新建完整系统 | 基础入口、总控、标准工作流全文(原八项及菜单先行、经营报表增补)、相关专项 Skills、安全与交付检查 | 任何需求、角色、关系、端或外部服务未覆盖时补齐,不得以预算不足交付缩水系统 |
|
|
11
|
-
| 已有系统局部修改 | 基础入口、总控路由、本次领域 Skill、目标当前内容及直接依赖、相关安全规则、影响范围内的回读与回归 | 目标不唯一、关系不清、动态调用、跨表状态、权限、公共组件影响不明时继续检索;不能靠名称相似猜测 |
|
|
12
|
-
| 只读解释或诊断 | 基础入口、总控路由、支持结论的相关事实 | 证据不足先补读,不能把文档、缓存、旧会话或摘要冒充当前运行状态 |
|
|
13
|
-
|
|
14
|
-
完整系统不因未出现“完整”二字就降级。对“开发一套系统”等新系统意图,默认按完整系统执行。任务范围判定与帐号身份分开:创始人身份不等于每项客户需求都在修改平台内核,但平台基础能力变更仍执行四项同步和平台回归。
|
|
15
|
-
|
|
16
|
-
每次开工列明实际读取的基础入口、总控、适用参考和专项 Skills;只声称已经读取的内容。首次读取、版本变化或目标不明时扩大读取。同一会话中可复用已完整读取且内容哈希未变化的知识;新会话、压缩后无法确认读取记录或哈希变化时重新读取。
|
|
17
|
-
|
|
18
|
-
## 先发现,再精确读取,再修改
|
|
19
|
-
|
|
20
|
-
1. 确认实际服务器、完整租户坐标、当前身份和业务目标;不得为了减少读取切换到其它连接。
|
|
21
|
-
2. 先获取目录或搜索结果,确认目标 Id、路径、版本与关系。目录摘要、行片段和字段投影不能表示全库、完整文件或完整业务模型。
|
|
22
|
-
3. 修改前读取目标完整语义单元及必要依赖;金额、库存、权限、审批、关联字段和公共组件扩大到后端规则、调用方和跨端回显。仅改文案仍需确认实际按钮、角色条件与运行入口。
|
|
23
|
-
4. 返回 `hasMore`、截断、未知完整性、错误或缺失依赖时继续分页或扩大查询。查无结果不证明资源不存在,必须检查过滤范围与权限。
|
|
24
|
-
5. 按本次精确差异修改,保留其它正确配置;执行前检查当前版本和授权,执行后独立回读,再验证受影响业务和界面。
|
|
25
|
-
|
|
26
|
-
完整新系统先完成可遍历的现有资源盘点与关系审查,避免重复建模;不能只看一页摘要就开始创建。局部修改不重复生成全库示例数据,也不跳过该改动的失败、边界、权限和兼容回归。
|
|
27
|
-
|
|
28
|
-
## 不可变引用与结果证据
|
|
29
|
-
|
|
30
|
-
Manifest 正文可以一次提交,后续以同一内容哈希和会话引用执行 plan、dry-run、apply、validate。引用只是传输优化,不是授权票据、全局锁或幂等保证。
|
|
31
|
-
|
|
32
|
-
- 引用必须绑定当前服务器、完整租户坐标和身份,设容量与有效期;凭据变化、过期、重启或跨会话引用失败时重传已核对正文。
|
|
33
|
-
- 写入仍使用当前真实权限、确认参数、结构与引用校验;不得复用旧验收结论代替当前检查。
|
|
34
|
-
- 写入超时、断线或结果未知时先回读,不得换引用或幂等键盲目重试。
|
|
35
|
-
- 摘要保留状态、错误、警告、资源标识、版本/哈希、验证结果和完整证据引用;完整回执可按需取回。不能截断 JSON 后把片段作为可执行正文。
|
|
36
|
-
- 对权限变化、冲突、部分成功、回滚和未知状态明确区分;失败不能被压缩成成功数量。
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
2
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-008 sha256=7d4c1226d529de92a79f6dcb277178f3d274738f51ed4b0fa609bb6f39ae9cb0 -->
|
|
3
|
+
|
|
4
|
+
本规范用于降低重复读取和重复传输,不降低软件质量。准确性、权限、业务完整性和验收优先于 token、耗时和回复长度。摘要只用于发现目标,不能成为未经核实的写入依据。
|
|
5
|
+
|
|
6
|
+
## 按任务确定必需知识
|
|
7
|
+
|
|
8
|
+
| 范围 | 必须读取与执行 | 扩大范围的条件 |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| 新建完整系统 | 基础入口、总控、标准工作流全文(原八项及菜单先行、经营报表增补)、相关专项 Skills、安全与交付检查 | 任何需求、角色、关系、端或外部服务未覆盖时补齐,不得以预算不足交付缩水系统 |
|
|
11
|
+
| 已有系统局部修改 | 基础入口、总控路由、本次领域 Skill、目标当前内容及直接依赖、相关安全规则、影响范围内的回读与回归 | 目标不唯一、关系不清、动态调用、跨表状态、权限、公共组件影响不明时继续检索;不能靠名称相似猜测 |
|
|
12
|
+
| 只读解释或诊断 | 基础入口、总控路由、支持结论的相关事实 | 证据不足先补读,不能把文档、缓存、旧会话或摘要冒充当前运行状态 |
|
|
13
|
+
|
|
14
|
+
完整系统不因未出现“完整”二字就降级。对“开发一套系统”等新系统意图,默认按完整系统执行。任务范围判定与帐号身份分开:创始人身份不等于每项客户需求都在修改平台内核,但平台基础能力变更仍执行四项同步和平台回归。
|
|
15
|
+
|
|
16
|
+
每次开工列明实际读取的基础入口、总控、适用参考和专项 Skills;只声称已经读取的内容。首次读取、版本变化或目标不明时扩大读取。同一会话中可复用已完整读取且内容哈希未变化的知识;新会话、压缩后无法确认读取记录或哈希变化时重新读取。
|
|
17
|
+
|
|
18
|
+
## 先发现,再精确读取,再修改
|
|
19
|
+
|
|
20
|
+
1. 确认实际服务器、完整租户坐标、当前身份和业务目标;不得为了减少读取切换到其它连接。
|
|
21
|
+
2. 先获取目录或搜索结果,确认目标 Id、路径、版本与关系。目录摘要、行片段和字段投影不能表示全库、完整文件或完整业务模型。
|
|
22
|
+
3. 修改前读取目标完整语义单元及必要依赖;金额、库存、权限、审批、关联字段和公共组件扩大到后端规则、调用方和跨端回显。仅改文案仍需确认实际按钮、角色条件与运行入口。
|
|
23
|
+
4. 返回 `hasMore`、截断、未知完整性、错误或缺失依赖时继续分页或扩大查询。查无结果不证明资源不存在,必须检查过滤范围与权限。
|
|
24
|
+
5. 按本次精确差异修改,保留其它正确配置;执行前检查当前版本和授权,执行后独立回读,再验证受影响业务和界面。
|
|
25
|
+
|
|
26
|
+
完整新系统先完成可遍历的现有资源盘点与关系审查,避免重复建模;不能只看一页摘要就开始创建。局部修改不重复生成全库示例数据,也不跳过该改动的失败、边界、权限和兼容回归。
|
|
27
|
+
|
|
28
|
+
## 不可变引用与结果证据
|
|
29
|
+
|
|
30
|
+
Manifest 正文可以一次提交,后续以同一内容哈希和会话引用执行 plan、dry-run、apply、validate。引用只是传输优化,不是授权票据、全局锁或幂等保证。
|
|
31
|
+
|
|
32
|
+
- 引用必须绑定当前服务器、完整租户坐标和身份,设容量与有效期;凭据变化、过期、重启或跨会话引用失败时重传已核对正文。
|
|
33
|
+
- 写入仍使用当前真实权限、确认参数、结构与引用校验;不得复用旧验收结论代替当前检查。
|
|
34
|
+
- 写入超时、断线或结果未知时先回读,不得换引用或幂等键盲目重试。
|
|
35
|
+
- 摘要保留状态、错误、警告、资源标识、版本/哈希、验证结果和完整证据引用;完整回执可按需取回。不能截断 JSON 后把片段作为可执行正文。
|
|
36
|
+
- 对权限变化、冲突、部分成功、回滚和未知状态明确区分;失败不能被压缩成成功数量。
|
|
37
|
+
- Manifest 的 `roleName`、`moduleNames` 必须唯一指向本次声明;现有资源使用当前租户回读的 Id。显式名称解析失败不得回退管理员或丢弃菜单;整批权限 Id 解析完成后才执行第一笔权限写入。资源保存成功但缺 Id 时停止并回读已完成步骤,不声称跨资源已回滚。
|
|
38
|
+
- 系统验收必须同时满足 `Code=1`、布尔 `Data.Passed=true`,且 `Errors` 缺省或为空数组。缺失、非布尔或矛盾的回包均不通过,保留原始错误供诊断;不能用 HTTP 成功、JSON 可解析或单项回读补成整体验收通过。
|
|
39
|
+
|
|
40
|
+
## 定制应用的最小充分接入
|
|
41
|
+
|
|
42
|
+
| 场景 | 读取范围与复用方式 | 必须保留的验收 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| Vue / UniApp 定制前端 | 对应前端、SDK、资源与 UI Skills;现有微服务脚手架、登录、上传和 API 封装 | 真实登录、租户隔离、失败状态、跨端回显、构建和浏览器 |
|
|
45
|
+
| 游戏 / Unity / WebGL | 对应应用或 Unity Skill;仅按实际需要接入帐号、存档、排行、房间和支付 | 状态一致性、重连、并发、服务端防伪、设备/GPU 验收边界 |
|
|
46
|
+
| 算法工程 | 算法源码、数据契约和可重复样例;平台仅提供需要的数据、权限与任务能力 | 正确性、边界、性能和真实数据分布;不能只验示例 |
|
|
47
|
+
| 硬件 / IoT | 实际协议及对应 TCP、HTTP、MQTT Skill,受信配置和模拟器 | 幂等、超时、结果未知、真实设备执行;网络写入成功不等于设备已执行 |
|
|
48
|
+
|
|
49
|
+
平台没有覆盖的能力必须明确实现和验收,不能用通用模板掩盖缺口。脚手架和模拟器减少重复建设,不能替代真实服务或硬件证据。
|
|
50
|
+
|
|
51
|
+
## 计量与验收标准
|
|
52
|
+
|
|
53
|
+
以同模型、同需求、同初始数据和同验收标准比较小修改、定制页面、完整系统。记录真实输入、缓存输入、输出、供应商报告的推理用量(如有)、工具轮数、重复读取、错误重试、耗时和完成率。多 Agent 的用量也计入总量。
|
|
54
|
+
|
|
55
|
+
MCP 可以准确统计传输字节和调用次数,不能据此声称供应商 token 或费用。缺少供应商 Usage 时标记未知;字符估算单独标记。缓存命中降低费用或延迟,不等于逻辑 token 消失。外部 Codex/IDE 的历史摘要与供应商缓存由宿主管理,吾码不得宣称已强制控制。
|
|
56
|
+
|
|
57
|
+
评测必须同时检验资源完整、权限/事务/关系正确、局部差异精确和必要回归通过。任何质量退步都不接受;不通过删测试、减少验收或隐瞒失败来展示节省比例。
|
|
56
58
|
<!-- /microi-progressive:chunk -->
|
|
@@ -6,16 +6,20 @@
|
|
|
6
6
|
|
|
7
7
|
临时文件回归必须调用真实 Full `finally` 与发布 `EXIT` 收尾,分别验证成功、原始失败、可捕获中断及清理失败;不能仅断言源码有 `finally`。覆盖祖先/子项链接、Git 标记、已有目录、空格及方括号路径、受保护属性与独占文件锁,断言保护项字节不变、普通删除不传 `-Force`、失败不自动强制重试、回执可定位残留。测试异常与清理异常同时发生时保留原始异常,发布锁仍释放;平台进程被硬杀不能假称已完成收尾。用例位于 `Microi.Tests/ReleaseGate/test-artifact-cleanup.test.mjs` 与 `release-scratch.test.mjs`,不为这些文件生命周期回归启动数据库或 Docker 容器。
|
|
8
8
|
|
|
9
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-006 sha256=
|
|
9
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-006 sha256=30d24447c0ee767e09df1fb2ecb91b146da5afc0a100dcb2c5ba310b27bd9f7d -->
|
|
10
10
|
## 自动化测试必须覆盖的坑
|
|
11
11
|
|
|
12
12
|
### 后端统一测试与发布门禁
|
|
13
13
|
|
|
14
|
+
完整发布的步骤与耗时目标以 [部署 Skill 的固定流程](../../microi-deployment/SKILL.md#普通吾码发布固定流程30-分钟) 为准。默认版本 +1、NuGet、API/PC Docker 和官网全部发布;`PlatformRelease` 执行常规 Microi.Tests(平台单元/组件,不自动追加 Full 专项)、吾码前端通用 Node 测试、真实接口检查与最终加密产物启动/运行冒烟;扩展浏览器验收仅在显式传入 `--platform-frontend-tests` 时追加。真实付费 AI、鸿地/JUNCHI、XJY 等指定客户数据专项和 SQL Server 等独立提供商专项默认不纳入,不再逐次询问;只有用户另行明确要求专项时才执行,回执逐项列为“不适用/未执行”,不能冒充通过。独立 Code/Agent 测试不属于此范围。1800 秒是共享耗时目标,超出时记录并继续,不仅因耗时超标终止。默认读取 `.microi-local` 复用现有项目依赖,不创建本地 Docker 测试环境、不安装聊天应用或新建租户;需要已授权测试夹具但缺失时准确列出并阻断完整成功,不能静默跳过。
|
|
15
|
+
|
|
16
|
+
发布入口回归须验证:遗留桌面 Node 配置不影响 `PlatformRelease`;新租户准入、聊天应用安装及 Code/Agent 测试入口均不触发;平台测试失败/零用例/跳过仍阻止发布;新推送也必须核对远端 digest,回读失败或不一致不能写成功;超过 30 分钟后仍执行当前及后续发布命令、正常成功仍返回成功并记录超标,真实失败或取消仍非零。使用隔离命令夹具覆盖这些行为,不为验证发布流程启动租户或安装应用。
|
|
17
|
+
|
|
14
18
|
- 官方或社区独立业务应用、游戏和客户项目在应用自己的 `tests/` 或独立测试工程维护回归,由应用自己的测试及发布入口执行;不得通过直接放文件、转调包装或自动扫描加入平台 Quick/Full。官方商城发布不使业务应用变为平台内置能力。平台 SDK、商城协议、安装器及通用缺陷的最小回归仍由平台负责。
|
|
15
19
|
|
|
16
20
|
- 每个平台新功能或 Bug 修复必须提供对应回归用例;平台 C# 进入 `Microi.Tests`,平台前端与内置资源/V8 测试进入平台 Node 自动发现范围。修复先保留失败证据,再跑成功、边界、异常、权限及旧格式兼容用例;不能仅添加字符串存在断言替代行为测试。
|
|
17
21
|
- `run-node-regressions.mjs` 自动发现 `Microi.Tests`、`OfficialApplications/Resource`、`Microi.Client/tests` 的确定性测试。新文件无法分类即失败;Playwright 用例必须走真实浏览器入口,不能用 Node 执行后把跳过当通过。所有计数需回读,0 用例、失败、取消、skipped、todo 均拒绝发布。
|
|
18
|
-
-
|
|
22
|
+
- 普通吾码发布(含仅推送模式)必须取得所选产品发布锁并执行 PlatformRelease:平台自动化、编译、加密产物冒烟、Docker 推送及远端摘要回读,以 30 分钟为可度量预算,超时如实记未达标。普通发布不运行 Microi Code/Agent 测试,不新建租户或安装聊天应用;Full 保留为显式独立深度测试。源码候选哈希、构建上下文哈希与 `release-artifact.mjs` 回执必须一致,且每个 Docker push 前再验证;无回执的历史产物不允许上传。文档专用模式不运行无关后端业务测试。
|
|
19
23
|
- 测试评审按身份/权限、多租户隔离、CRUD/事务、V8 同步异步与 `return/V8.Result`、存储安全、缓存/任务幂等、升级回滚、应用包幂等、浏览器登录/目标路由、发布脚本失败关闭分类盘点。新增能力补所在分类,不承诺一轮测试覆盖所有未知业务。
|
|
20
24
|
|
|
21
25
|
- 吾码后端统一测试入口是 `Microi.Server/Microi.Tests/Microi.Tests.csproj`,
|
|
@@ -23,12 +27,12 @@
|
|
|
23
27
|
- 日常源码验证运行
|
|
24
28
|
`Microi.Server/Microi.Tests/run-tests.ps1 -Mode Quick`。Quick 只做
|
|
25
29
|
单元/组件回归,不连接远端、不写数据库,不能称为“全量生产验收”。
|
|
26
|
-
-
|
|
30
|
+
- 普通 API 发布运行 `-Mode PlatformRelease`。只有明确选择 Full 深度测试时才运行 `-Mode Full`,并提供隔离测试租户、专用测试表、
|
|
27
31
|
测试 ApiEngine、测试 Token,并显式设置
|
|
28
32
|
`MICROI_TEST_ALLOW_WRITES=YES`。只有用户明确授权时才可对真实租户执行;
|
|
29
33
|
真实租户默认只做登录和只读烟测,写入必须限定到名称/说明明确为自动化
|
|
30
34
|
测试用途的专用表,并使用唯一前缀、`finally` 清理和清理回读。
|
|
31
|
-
- Full 的本地程序与依赖按 `../../workspace-conventions/SKILL.md` 的“本地测试程序与依赖生命周期”执行:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS 和健康本地源码程序或隔离编译产物,以租户、数据库或命名空间隔离;不按任务创建整套 Docker/Compose,不例行询问临时容器许可。本机没有容器或旧夹具已清理时,仍先核实 MCP
|
|
35
|
+
- Full 的本地程序与依赖按 `../../workspace-conventions/SKILL.md` 的“本地测试程序与依赖生命周期”执行:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS 和健康本地源码程序或隔离编译产物,以租户、数据库或命名空间隔离;不按任务创建整套 Docker/Compose,不例行询问临时容器许可。本机没有容器或旧夹具已清理时,仍先核实 MCP 的实际依赖。确实不能复用才记录证据并采用最小替代方案。每轮成功、失败、取消或资源不足退出时,结束自有进程,精确删除本次临时容器及纯测试资源,并回读进程、端口、容器和测试命名空间;既有共享服务保持原状。这些要求不减少所选模式的用例、断言或发布门禁;普通 PlatformRelease 不触发新租户准入和聊天应用安装。
|
|
32
36
|
- Full 至少覆盖完整 Release 构建、FormEngine 单条/批量/按条件 CRUD、
|
|
33
37
|
查询和计数、ApiEngine GET/JSON POST、API 实际启动与健康检查、真实登录、
|
|
34
38
|
匿名系统配置脱敏、清理回读、NuGet 漏洞/弃用审计。NuGet 全面升级后不能
|
|
@@ -47,7 +51,7 @@
|
|
|
47
51
|
|
|
48
52
|
### 按指定 MCP 选择发布测试矩阵
|
|
49
53
|
|
|
50
|
-
测试范围以 `workspace-conventions/SKILL.md`
|
|
54
|
+
测试范围以 `workspace-conventions/SKILL.md` 的“平台回归与独立应用测试归属”为准。本次修复或显式 Full 需要真实依赖时,先核实用户指定的 Profile、ApiBase、OsClient 和实际依赖,再冻结专项必测清单;普通 PlatformRelease 不默认扩展为这些深度集成测试;不能从本机恰好存在的连接或历史 Full 清单推导额外兼容矩阵。
|
|
51
55
|
|
|
52
56
|
| 依赖 | 常规发布范围 | 验收依据 |
|
|
53
57
|
|---|---|---|
|
|
@@ -2,70 +2,70 @@
|
|
|
2
2
|
|
|
3
3
|
> 原规则按适用范围无损迁移;触发对应工作时必须完整读取相关章节。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=
|
|
6
|
-
## 平台安全与存量兼容验收(强制)
|
|
7
|
-
|
|
8
|
-
AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
|
|
9
|
-
|
|
10
|
-
### FormEngine 混合授权
|
|
11
|
-
|
|
12
|
-
- Token 只完成身份认证,不是任意表的访问凭证。浏览器、UniApp、SDK 等外部请求必须继续校验表、菜单、角色、操作权限和数据范围。
|
|
13
|
-
- 显式 `_SysMenuId` / `ModuleEngineKey` 进入精确菜单校验;伪造、传错或借用其它表菜单时失败关闭,不能退回兼容推断。
|
|
14
|
-
- 为兼容存量前端 V8,无菜单请求由后端从当前用户真正拥有的菜单授权快照中推断目标表权限。没有候选菜单、范围无法安全合并或解析失败时失败关闭;不要要求所有历史项目一次性补 `_SysMenuId`。
|
|
15
|
-
- 标准 PC facade 只给当前菜单绑定的当前表注入菜单 Id,跨表调用不借用主表菜单。没有菜单入口的 SDK/定制页才使用最小【高级表权限】。
|
|
16
|
-
- 后端接口引擎、后端表单 V8 和平台内部调用由服务端建立可信上下文,不要求 `_SysMenuId`;客户端伪造 `_TrustedServerInvocation` 或 `_InvokeType:'Server'` 不能获得信任。
|
|
17
|
-
- `TableChild` 使用父记录范围内委托:验证父菜单、父表字段配置、子菜单、父记录数据范围和外键,并由服务端强制注入外键。隐藏子菜单不要求存量角色逐个补权限。
|
|
18
|
-
- 菜单 `SqlWhere` / `SqlJoin` 只约束列表、计数、导出等集合查询;单行详情只校验同表菜单访问权。主表写入由 `Add` / `Edit` / `Del` / `Import` 专项权限控制,不把查询范围追加到写入 SQL,也不因查询 Join 拒绝。行级写业务限制放在后端表单 V8 或专用接口引擎。
|
|
19
|
-
|
|
20
|
-
### 保护表、控制面与缓存
|
|
21
|
-
|
|
22
|
-
- 平台表按 `PlatformResourceSecurity` 的管理员专用、只读委托、按角色管理三类校验,不使用过时的统一硬拒绝清单。`sys_apiengine` 的标准 FormEngine 管理按真实菜单/表操作授权,不能因 `Level < 9999` 拒绝已获授权的开发角色;无授权、伪造菜单、匿名和撤权必须拒绝。
|
|
23
|
-
- 接口代码写权限只授予可信开发角色;任务、Redis 等其它控制面门禁、接口运行权限和 MCP 专用开发权限仍独立执行,不能只靠前端隐藏菜单,也不能从接口管理菜单权限推导其它控制面权限。
|
|
24
|
-
- 权限缓存使用按 `OsClient` 隔离的共享 Redis `epoch`、用户快照、短 TTL L1/L2。用户/角色/菜单/权限变化后提升 `epoch`;验收至少使用两个节点确认无需清 Redis或重启即可生效。
|
|
25
|
-
- Upgrade15 只清理普通角色的保护表直接授权,不能删除正常业务菜单权限。
|
|
26
|
-
|
|
27
|
-
### 上传、私有文件与 SaaS
|
|
28
|
-
|
|
29
|
-
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
30
|
-
- 无字段上下文的普通交互式上传默认私有桶,一级安全目录为 `file`、`img`、`avatar`、`editor`;可由管理员在普通 `sys_config.HdfsUploadRules` 按真实角色授权业务目录与公有权限。通配符必须有界并先校验实际路径,保留目录与跨租户不能放行。标准表单仍按权威字段配置执行。可信后端 V8 仍受全局文件大小硬上限。
|
|
31
|
-
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
32
|
-
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
33
|
-
- `V8.OsClientModel` / `V8.SysConfig` 只使用脱敏副本,不返回整个对象。新租户不能复制主租户整条 `sys_osclients`;数据库、认证、Redis、存储、MQ/MQTT、搜索凭据必须独立创建或由服务端托管。
|
|
34
|
-
- Redis 管理器只允许超级管理员使用当前租户或已保存连接;匿名/temporary 任意 Host 连接必须拒绝,MCP 写操作必须 `confirmExecution`,禁止传递 Redis 密码。
|
|
35
|
-
|
|
36
|
-
### 网络、登录和发布兼容
|
|
37
|
-
|
|
38
|
-
- `CorsAllowOrigins` 和全局 CORS 来源都为空时默认允许任意来源;配置后才按精确来源/通配符收紧。CORS 不是鉴权边界。
|
|
39
|
-
- 严格 SSRF 默认关闭,未配置时不得拒绝存量非 HTTP(S)、URL 凭据、私网、云元数据和重定向调用;显式启用后才执行严格拦截与精确主机白名单。
|
|
40
|
-
- 登录 RSA 仅避免密码在请求体直接显示,HTTPS 才是安全边界。必须保留历史 RSA fallback,专属公私钥成对切换,不能因删除旧常量造成所有客户无法登录。
|
|
41
|
-
- 登录传 `_ClientType`,请求携带稳定 `did`,每次响应接收 `authorization`。多标签续签 single-flight;`TokenReplaced` 先检查新 Token,旧响应不能清掉新登录态。
|
|
42
|
-
- 安全升级不得删除私有子 Git 的 `Microi.Server/Microi.net/License/keys/`。授权签名资产与登录 RSA 用途不同,禁止以安全清理为由混删。
|
|
43
|
-
- 不得修改默认 CORS/SSRF/RSA 行为后只用新装环境验收;必须覆盖旧前端、历史 V8、滚动升级和至少两个节点。
|
|
44
|
-
|
|
45
|
-
### 安全自动化最低断言
|
|
46
|
-
|
|
47
|
-
1. 普通角色保护表读写、伪造菜单、伪造可信标记均失败。
|
|
48
|
-
2. 真实菜单、历史无菜单推断和父记录范围内 TableChild 均成功,跨父记录失败。
|
|
49
|
-
3. 查询范围在列表、计数、导出中生效;详情按同表菜单访问权成功;有写权限的单表/Join 模块写入成功,无写权限失败,后端 V8 行级业务校验可回滚。
|
|
50
|
-
4. 节点 A 改权限后节点 B 无需重启生效。
|
|
51
|
-
5. 上传大小/数量/双日额度、多节点并发和 Redis 故障行为正确。
|
|
52
|
-
6. 私有文件跨菜单/记录/字段失败,授权访问成功,匿名失败。
|
|
53
|
-
7. CORS 空配置兼容、配置后收紧;SSRF 默认兼容、严格模式拦截。
|
|
54
|
-
8. 历史 RSA fallback 和专属匹配密钥均可登录;并发续签不反复退出。
|
|
55
|
-
9. SaaS 脱敏投影不包含基础设施密钥,Redis anonymous/temporary/非管理员管理失败。
|
|
56
|
-
|
|
5
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=1cf73c1365e3f8245b2069f5f2e24bcbfdc7f6e67c0f13524998b16f7bbf029b -->
|
|
6
|
+
## 平台安全与存量兼容验收(强制)
|
|
7
|
+
|
|
8
|
+
AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
|
|
9
|
+
|
|
10
|
+
### FormEngine 混合授权
|
|
11
|
+
|
|
12
|
+
- Token 只完成身份认证,不是任意表的访问凭证。浏览器、UniApp、SDK 等外部请求必须继续校验表、菜单、角色、操作权限和数据范围。
|
|
13
|
+
- 显式 `_SysMenuId` / `ModuleEngineKey` 进入精确菜单校验;伪造、传错或借用其它表菜单时失败关闭,不能退回兼容推断。
|
|
14
|
+
- 为兼容存量前端 V8,无菜单请求由后端从当前用户真正拥有的菜单授权快照中推断目标表权限。没有候选菜单、范围无法安全合并或解析失败时失败关闭;不要要求所有历史项目一次性补 `_SysMenuId`。
|
|
15
|
+
- 标准 PC facade 只给当前菜单绑定的当前表注入菜单 Id,跨表调用不借用主表菜单。没有菜单入口的 SDK/定制页才使用最小【高级表权限】。
|
|
16
|
+
- 后端接口引擎、后端表单 V8 和平台内部调用由服务端建立可信上下文,不要求 `_SysMenuId`;客户端伪造 `_TrustedServerInvocation` 或 `_InvokeType:'Server'` 不能获得信任。
|
|
17
|
+
- `TableChild` 使用父记录范围内委托:验证父菜单、父表字段配置、子菜单、父记录数据范围和外键,并由服务端强制注入外键。隐藏子菜单不要求存量角色逐个补权限。
|
|
18
|
+
- 菜单 `SqlWhere` / `SqlJoin` 只约束列表、计数、导出等集合查询;单行详情只校验同表菜单访问权。主表写入由 `Add` / `Edit` / `Del` / `Import` 专项权限控制,不把查询范围追加到写入 SQL,也不因查询 Join 拒绝。行级写业务限制放在后端表单 V8 或专用接口引擎。
|
|
19
|
+
|
|
20
|
+
### 保护表、控制面与缓存
|
|
21
|
+
|
|
22
|
+
- 平台表按 `PlatformResourceSecurity` 的管理员专用、只读委托、按角色管理三类校验,不使用过时的统一硬拒绝清单。`sys_apiengine` 的标准 FormEngine 管理按真实菜单/表操作授权,不能因 `Level < 9999` 拒绝已获授权的开发角色;无授权、伪造菜单、匿名和撤权必须拒绝。
|
|
23
|
+
- 接口代码写权限只授予可信开发角色;任务、Redis 等其它控制面门禁、接口运行权限和 MCP 专用开发权限仍独立执行,不能只靠前端隐藏菜单,也不能从接口管理菜单权限推导其它控制面权限。
|
|
24
|
+
- 权限缓存使用按 `OsClient` 隔离的共享 Redis `epoch`、用户快照、短 TTL L1/L2。用户/角色/菜单/权限变化后提升 `epoch`;验收至少使用两个节点确认无需清 Redis或重启即可生效。
|
|
25
|
+
- Upgrade15 只清理普通角色的保护表直接授权,不能删除正常业务菜单权限。
|
|
26
|
+
|
|
27
|
+
### 上传、私有文件与 SaaS
|
|
28
|
+
|
|
29
|
+
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
30
|
+
- 无字段上下文的普通交互式上传默认私有桶,一级安全目录为 `file`、`img`、`avatar`、`editor`;可由管理员在普通 `sys_config.HdfsUploadRules` 按真实角色授权业务目录与公有权限。通配符必须有界并先校验实际路径,保留目录与跨租户不能放行。标准表单仍按权威字段配置执行。可信后端 V8 仍受全局文件大小硬上限。
|
|
31
|
+
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
32
|
+
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
33
|
+
- `V8.OsClientModel` / `V8.SysConfig` 只使用脱敏副本,不返回整个对象。新租户不能复制主租户整条 `sys_osclients`;数据库、认证、Redis、存储、MQ/MQTT、搜索凭据必须独立创建或由服务端托管。
|
|
34
|
+
- Redis 管理器只允许超级管理员使用当前租户或已保存连接;匿名/temporary 任意 Host 连接必须拒绝,MCP 写操作必须 `confirmExecution`,禁止传递 Redis 密码。
|
|
35
|
+
|
|
36
|
+
### 网络、登录和发布兼容
|
|
37
|
+
|
|
38
|
+
- `CorsAllowOrigins` 和全局 CORS 来源都为空时默认允许任意来源;配置后才按精确来源/通配符收紧。CORS 不是鉴权边界。
|
|
39
|
+
- 严格 SSRF 默认关闭,未配置时不得拒绝存量非 HTTP(S)、URL 凭据、私网、云元数据和重定向调用;显式启用后才执行严格拦截与精确主机白名单。
|
|
40
|
+
- 登录 RSA 仅避免密码在请求体直接显示,HTTPS 才是安全边界。必须保留历史 RSA fallback,专属公私钥成对切换,不能因删除旧常量造成所有客户无法登录。
|
|
41
|
+
- 登录传 `_ClientType`,请求携带稳定 `did`,每次响应接收 `authorization`。多标签续签 single-flight;`TokenReplaced` 先检查新 Token,旧响应不能清掉新登录态。
|
|
42
|
+
- 安全升级不得删除私有子 Git 的 `Microi.Server/Microi.net/License/keys/`。授权签名资产与登录 RSA 用途不同,禁止以安全清理为由混删。
|
|
43
|
+
- 不得修改默认 CORS/SSRF/RSA 行为后只用新装环境验收;必须覆盖旧前端、历史 V8、滚动升级和至少两个节点。
|
|
44
|
+
|
|
45
|
+
### 安全自动化最低断言
|
|
46
|
+
|
|
47
|
+
1. 普通角色保护表读写、伪造菜单、伪造可信标记均失败。
|
|
48
|
+
2. 真实菜单、历史无菜单推断和父记录范围内 TableChild 均成功,跨父记录失败。
|
|
49
|
+
3. 查询范围在列表、计数、导出中生效;详情按同表菜单访问权成功;有写权限的单表/Join 模块写入成功,无写权限失败,后端 V8 行级业务校验可回滚。
|
|
50
|
+
4. 节点 A 改权限后节点 B 无需重启生效。
|
|
51
|
+
5. 上传大小/数量/双日额度、多节点并发和 Redis 故障行为正确。
|
|
52
|
+
6. 私有文件跨菜单/记录/字段失败,授权访问成功,匿名失败。
|
|
53
|
+
7. CORS 空配置兼容、配置后收紧;SSRF 默认兼容、严格模式拦截。
|
|
54
|
+
8. 历史 RSA fallback 和专属匹配密钥均可登录;并发续签不反复退出。
|
|
55
|
+
9. SaaS 脱敏投影不包含基础设施密钥,Redis anonymous/temporary/非管理员管理失败。
|
|
56
|
+
|
|
57
57
|
<!-- /microi-progressive:chunk -->
|
|
58
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-003 sha256=
|
|
59
|
-
## 前端交付检查清单
|
|
60
|
-
|
|
61
|
-
- 底部 tabBar 图标不 404。
|
|
62
|
-
- 首页、分类、详情、Banner、头像、订单凭证图全部真实加载。
|
|
63
|
-
- 主题切换是全局生效,不是只对一个页面生效。
|
|
64
|
-
- 列表页和详情页显示同一主体名称、头像、状态,不能列表对、详情错。
|
|
65
|
-
- 关联人名不得退化成“卖家BMB9”“匿名卖家”等可推断 Id 的兜底,除非确实无数据。
|
|
66
|
-
- 关键业务资产不得默认选中第一条,必须用户手动选择。
|
|
67
|
-
- 自己不能抢自己的单,不能约自己的单,必须给明确提示。
|
|
68
|
-
- 消息/待办/约单/审核类提醒必须有未读角标,已读后消失。
|
|
69
|
-
- 订单状态角标只给需要处理的状态,不给“全部/已完成/已取消”等静态分类堆数字。
|
|
70
|
-
|
|
58
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-003 sha256=8e2891f2a149d6828b653b9f0735ea39a4df5ba60178c79f0e5b0065ce72ee84 -->
|
|
59
|
+
## 前端交付检查清单
|
|
60
|
+
|
|
61
|
+
- 底部 tabBar 图标不 404。
|
|
62
|
+
- 首页、分类、详情、Banner、头像、订单凭证图全部真实加载。
|
|
63
|
+
- 主题切换是全局生效,不是只对一个页面生效。
|
|
64
|
+
- 列表页和详情页显示同一主体名称、头像、状态,不能列表对、详情错。
|
|
65
|
+
- 关联人名不得退化成“卖家BMB9”“匿名卖家”等可推断 Id 的兜底,除非确实无数据。
|
|
66
|
+
- 关键业务资产不得默认选中第一条,必须用户手动选择。
|
|
67
|
+
- 自己不能抢自己的单,不能约自己的单,必须给明确提示。
|
|
68
|
+
- 消息/待办/约单/审核类提醒必须有未读角标,已读后消失。
|
|
69
|
+
- 订单状态角标只给需要处理的状态,不给“全部/已完成/已取消”等静态分类堆数字。
|
|
70
|
+
|
|
71
71
|
<!-- /microi-progressive:chunk -->
|
|
@@ -33,6 +33,19 @@ description: Microi 模块引擎与 sys_menu 配置指南。用于创建或修
|
|
|
33
33
|
不得仅因 DOM 有文字就判定回显成功,需验证窄搜索槽位中的真实宽度、90~110 密度、选项
|
|
34
34
|
Key/Label 映射、清除与查询条件一致;不能为修复显示改动实际查询 Key 或业务数据源。
|
|
35
35
|
|
|
36
|
+
操作列按当前页各行真实 DOM 布局取最大宽度,自动响应密度、语言、字体、角标及按钮显隐
|
|
37
|
+
变化;`TableActionFixedWidth` 只作为安全最小值。首帧或隐藏时的字符估算仅为兼容兜底,
|
|
38
|
+
不能用固定字符系数代替已渲染宽度。验收包含最长翻译、最多/最少按钮与刷新后边界。
|
|
39
|
+
|
|
40
|
+
PC 卡片优先选择当前终端 Card 视图,没有时复用 Mobile Card;关键字段通过模块
|
|
41
|
+
`Layout.Card.Fields` 或旧 `MobileListFields` 配置,不在平台组件中按业务表写死。
|
|
42
|
+
配置前核对真实字段、权限和查询返回值;标题/状态之外应保留 2~4 个有判断价值的可读字段,
|
|
43
|
+
相同字段跨区域去重、空区域隐藏。底部按钮保持原配置及显隐,【更多】显示当前语言文字
|
|
44
|
+
与展开图标,不能只剩三点;卡片高度由内容与密度决定,不用大段留白代替缺失字段。
|
|
45
|
+
普通与树形列表的显式查询列均须补齐视图依赖字段,未配置/星号全列查询不能被窄化;
|
|
46
|
+
空白与空多选在展示态隐藏,`0/false` 保留,行内编辑空字段继续可录入。
|
|
47
|
+
验收覆盖小/标准/大密度、长文本、多个行外按钮、明暗主题与桌面/移动布局。
|
|
48
|
+
|
|
36
49
|
## 必读参考
|
|
37
50
|
|
|
38
51
|
- 字段、打开方式、查询配置、ViewSchema 和接口替换:
|
|
@@ -128,6 +128,17 @@ FontWeight/DisplayStyle`。运行时会把引用字段并入 `_SelectFields`;
|
|
|
128
128
|
返回这些字段。多字段模板沿用对应 `diy_field.V8TmpEngineTable`,不在 ViewSchema 内保存
|
|
129
129
|
可执行脚本。
|
|
130
130
|
|
|
131
|
+
桌面采用卡片模式时,优先使用 PC/All 的 Card 视图,没有匹配视图时复用 Mobile Card;
|
|
132
|
+
移动端也保留相反终端的兼容回退。`Fields` 解析到字段时作为正文来源,否则兼容
|
|
133
|
+
`MobileListFields`。标题、头像、顶部、副标题、右侧、正文、Meta 与底部按现有运行时规则
|
|
134
|
+
去重,空值隐藏;不要凭“字段元数据存在”判断已展示,还须检查查询响应与实际页面。
|
|
135
|
+
核心正文建议配置 2~4 个可读业务字段及 `ShowLabel=true`,秘密和内部 Id 不作为装饰信息。
|
|
136
|
+
副标题保留 `ShowLabel/Icon`,正文支持 `ShowLabel=false`;空白与空多选在展示态隐藏,
|
|
137
|
+
`0/false` 仍显示,行内编辑空字段继续可录入。普通与树形列表的显式 `_SelectFields`
|
|
138
|
+
都须补齐视图依赖字段;未配置或 `*` 的全列查询不能因补字段而被窄化。
|
|
139
|
+
操作区必须保留行外按钮、权限与显隐逻辑,【更多】使用本地化文字与展开图标;
|
|
140
|
+
密度切换、长文本、多个按钮和移动断点下不得溢出或只剩难以辨认的图标。
|
|
141
|
+
|
|
131
142
|
PC 复合列的常规高度上限是两行:`Field` 占主行,`Lines` 通常只放 1 项。多个信息组拆成
|
|
132
143
|
多个两行复合列;只有确有层级价值且完成桌面截图验收后,才允许在同一列放第 2 个
|
|
133
144
|
`Lines`。`TrailingFields` 位于右侧,不应被误用成增加纵向信息层级。
|
|
@@ -159,6 +170,12 @@ Hero 必须在 PageTabs 上方渲染。PC 无指标/含指标头部分别为 `44
|
|
|
159
170
|
按钮对象必须有稳定唯一 Id、Sort、Name、显隐逻辑和动作。后台任务按钮还要配置
|
|
160
171
|
ApiEngineKey、Workload、幂等字段、并发 Key、业务状态/任务 Id/进度/ETA 字段。
|
|
161
172
|
|
|
173
|
+
PC 操作列使用当前页每行已渲染按钮、图标、间距、角标与单元格边界的实际宽度,取最宽行;
|
|
174
|
+
`TableActionFixedWidth` 为安全最小值,不能用它截断动态内容。隐藏/未完成首帧测量时才保留
|
|
175
|
+
兼容估算;显示后按实际布局校准。DOM 文本/子节点/样式变化、密度/主题/语言变化、字体加载
|
|
176
|
+
与窗口尺寸变化合帧重测,停用和卸载时清理观察器。回归应覆盖异步翻译、按钮显隐、角标、
|
|
177
|
+
最多与最少按钮行以及卡片切回表格,不能只按中文字符数验证。
|
|
178
|
+
|
|
162
179
|
`PageTabs` 与五类按钮共用统计字段:`BadgeEnabled`、`BadgeApiEngineKey`、`BadgeValuePath`、`BadgeField`、
|
|
163
180
|
`BadgeTone`、`BadgeColor`、`BadgeMax`、`BadgeShowZero`、`BadgeRefreshSeconds`。接口一次接收当前页 `Ids` 与
|
|
164
181
|
`ButtonKeys`,推荐返回:
|
|
@@ -91,6 +91,7 @@ return {
|
|
|
91
91
|
- OCR 宿主机端口只绑定 `127.0.0.1`;Docker 化 API 与 OCR 同时加入 external bridge 网络 `microi-ocr`,一键安装的内部 endpoint 固定为 `http://microi-install-ocr:8080/ocr`。不得通过公网/LAN 回环调用同机 OCR。
|
|
92
92
|
- `install-microi.sh` 默认尝试安装 OCR,但先部署 API/Web 并通过 liveness、完整 `ServerVersion` 升级链和 readiness。随后必须依次满足“固定镜像拉取并回读为 amd64 → OCR healthy → Upgrade29 的 9 个物理字段数据库回读 → 唯一活动主租户 → 配置写入后回读 → API 重启 readiness”才设置 `OcrEnabled=1`;任一步失败都保持 OCR 能力关闭并记录警告,但不得中断已经可用的核心平台。字段每秒回读一次且最多 15 秒;正常升级应首轮命中,镜像过旧或迁移失败应快速关闭 OCR,禁止无意义等待 5 分钟。不要用安装脚本直接伪造 `diy_field` 元数据绕过 Upgrade29。
|
|
93
93
|
- API/Web 官方浮动 `latest` 必须在 Compose 启动时强制回源拉取,避免旧本机镜像缺少 Upgrade29。核心门禁失败时输出“安装未完成”恢复汇总并保留非零退出码;OCR 字段、服务或配置门禁失败时,成功汇总明确显示“OCR SaaS 未启用”和附加能力警告。两种汇总都不是启用 OCR 的依据。
|
|
94
|
+
- 内存保护优先于默认安装:新安装识别物理内存低于 7680MiB 或模型启动前可用内存低于 2048MiB 时,OCR 和翻译在本次安装始终保持停用,已有同名安装容器精确停止并关闭自动重启,保留卷和数据;核心升级后只对唯一活动主租户设置 `OcrEnabled=0` 并回读,再刷新 API。不要因停止后可用内存增加或存在 Swap 而重新启用,也不要在降级主机继续触发真实 OCR 推理。内存充足时 OCR Compose 默认限制 1024MiB RAM、1536MiB RAM+Swap、0.75CPU,且原生数学库线程为 1。
|
|
94
95
|
- OCR 使用固定不可变版本,不加入只跟踪 API/Web 浮动标签的 Watchtower 自动更新列表;升级镜像时先发布新 tag、匿名回读 digest/架构,再修改 Compose 与安装器。
|
|
95
96
|
- 登录国内镜像源必须从本机发布配置读取凭据并走 `docker login --password-stdin`,不得输出密码。推送成功不是发布验收,必须使用隔离的匿名 Docker config 回读 manifest/digest,必要时再做匿名拉取。
|
|
96
97
|
- 不要在内存不足的共享开发机上直接构建模型镜像。构建前检查物理内存、Docker 占用与同类进程;保留至少 `max(6 GB, 物理内存 20%)`,不足时延后构建而不是停止他人服务。
|
|
@@ -7,6 +7,8 @@ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化
|
|
|
7
7
|
|
|
8
8
|
# Microi 吾码 Playwright E2E 自动化测试
|
|
9
9
|
|
|
10
|
+
用户浏览器的扩展、连接或控制能力不可用时,必须执行 [浏览器不可用时继续交付](../workspace-conventions/SKILL.md#浏览器不可用时继续交付强制入口):尝试宿主内置浏览器,展示需要用户登录的页面,并继续独立的 MCP、源码与验证工作。明确的安全拒绝不属于可换工具绕过的能力故障;等待登录、页面打开或接口成功都不能冒充业务验收完成。
|
|
11
|
+
|
|
10
12
|
桌面人工补充或新建浏览器验收默认只选一个常规 CSS 视口:优先复现用户实际浏览器尺寸,未知时用 1920×1080。截图文件像素还受设备缩放影响,不能据此强制 4K;仅用户明确要求或问题涉及超宽屏时追加 4K,移动端或响应式改动按需补充相关窄屏。沿用已有有效验收,不为截图分辨率重复整套用例;正式脚本既有 Full 不在运行中删减。核心发布已冻结后,新增规范文案独立交付,不因此重启合格候选的构建、测试或上传。
|
|
11
13
|
|
|
12
14
|
每轮测试成功、失败、取消或中断退出时,在 `finally` / teardown 中关闭本任务 browser/context 和临时写入进程,再按 [测试临时文件随任务清理](../workspace-conventions/SKILL.md#测试临时文件必须随任务清理强制) 删除本任务 `.tmp` 下的一次性脚本、夹具及无用途的截图、trace、video、日志和编译副本。交付必需证据先最小归档并回读,失败排查只暂留有明确归属和清理时机的最小集合;报告和截图路径规则不构成永久保留许可,结束后必须单独验收清理结果。
|
|
@@ -232,16 +232,23 @@ UnblockIp:<ip>
|
|
|
232
232
|
### CDN 模块
|
|
233
233
|
|
|
234
234
|
- 现有 `microi-platform-service` 的系统日志页增加 CDN Tab;不另建同名应用。固定管理员入口为 `mci-cdn-manager`,内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`,四个引擎归 `app.microi.sys-log` 的 Managed 资源。
|
|
235
|
-
- 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
|
|
235
|
+
- 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / Usage / CacheHit / OriginTraffic / Billing / StorageHealth / StorageLogs / Logs / LogDelivery / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
|
|
236
236
|
- 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败,不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret,由可信后端解密到后端 `ServerPrivateSettings`;不返回原文。
|
|
237
|
-
-
|
|
237
|
+
- 用量与金额分开:`Trend` 带宽点不能按小时积分冒充流量;`Usage(Field=traf)` 的字节量才用于流量合计,金额读取 `Billing`,禁止统一乘固定单价标为实际费用。`Usage` 接受 `UsageType`(不是平台保留参数 `Type`)、`DataProtocol`、`Field`、`Area`;流量/带宽只允许 all 类型与协议,请求数只允许 all 地区。UTC 起止时间与实际 `DataInterval` 必须保留;300/3600/86400 秒的 Usage 单次跨度分别不超过3/7/31天。`CacheHit/OriginTraffic` 同粒度跨度为3/31/366天,不传 Area,单位分别为百分比/字节。
|
|
238
|
+
- `Billing.Kind` 固定为 `Overview/Instance/Packages/PackageUsage`,返回 `Data.Result`。先用 `BillingCycle=YYYY-MM` 概览发现产品代码,再按 `ProductCode` 查 `Instance` 的 MONTHLY/DAILY 计费项;DAILY 的 BillingDate 必须属于账期。MaxResults不超过300,完整消费NextToken;Packages用Page/PageSize,PackageUsage绑定InstanceId、以中国站账单时间格式原样查询并将NextToken映射LastToken。应付PretaxAmount、原价PretaxGrossAmount、实付PaymentAmount和资源包抵扣不混用;当前包列表不证明历史抵扣,当月暂计、数据延迟、权限失败不伪造为零。
|
|
239
|
+
- 账单API固定后端`business.aliyuncs.com/2017-12-14`,复用当前租户完整凭据,不接受客户端Endpoint/密钥。概览、实例明细、资源包与抵扣权限分别为`bss:DescribeBillList`、`bssapi:DescribeInstanceBill`、`bss:DescribeInstances`、`bss:FrDeductLogQueryRequest`;权限不足显式返回,不自动扩权。诊断同时拆分CDN下行与OSS的NetworkOut/CdnOut,后者分别为公网流出/向CDN回源流出;CDN处置无法阻止OSS直连,不能单凭高流量认定攻击。
|
|
240
|
+
- Aliyun 运营报表 ID:1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。定制免费,通常次日6点后产出且不补订阅前数据;未订阅不能伪造成零流量,也不能将历史 TOP 当作分钟级规则数据;未知流量单位保持原始值。
|
|
241
|
+
- 报表订阅是账号唯一任务:先读`DescribeCdnSubList`,保留旧domains/reportId及时间边界,显式合并新域名;没有任务用CreateCdnSubTask,已有任务用UpdateCdnSubTask(没有SubId入参)。按集合、enable状态和有效期严格回读,禁止substring判断;省略DomainName会扩大到全账号,不能据此实现单域订阅。已有all、停用或过期任务须保留并明确处理范围,不暗中缩小或重新启用。
|
|
238
242
|
- 报表参数按类型分开:只有 13/15 传非空 Area,1/3/9/11 传非空 HttpCode,21/23 传 IsOverseas;17 不传 DomainName。不得统一附加无关或空筛选项,否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject,不向它写入配置对象,创建独立 JS 请求并从服务端读取接入配置。
|
|
239
|
-
-
|
|
240
|
-
-
|
|
243
|
+
- `LogDelivery`只读发现实时投递,Unauthorized不等于未开通。`Logs`只返回离线日志元数据,最近31天、单次一天、每页最多100,按HasMore完整分页;不返回LogPath。独立管理员`LogDownload`必须绑定同域/同窗云端清单的精确LogName,临时DownloadUrl仅供受控审计进程,不进入前端、日志、安装包或公开报告;原始日志有界流式读取并去除查询凭据。离线日志不是实时自动封禁来源。
|
|
244
|
+
- `StorageHealth`从当前租户SaaS读取公私桶/Endpoint、日志与存储统计;不接受客户端覆盖桶/Endpoint/凭据,多环境歧义停止。`ProbeInternal=true`仅探测同地域固定内网候选,保持SSRF保护;分区标签不证明内网可用,失败不自动改配置。`StorageLogs(StorageScope=Public|Private,Day,Marker)`按真实日志配置的日期前缀只读列举,每页1000,完整消费HasMore/NextMarker;未开通与错误区分。`StorageLogDownload`仅匹配当前页精确LogName、单文件≤128MiB,5分钟签名仅给受控流式脱敏进程,不进UI/日志/报告。对象/IP/UA/时段证据与账单分别核对,不能把SDK重复下载当成攻击,也不能把公网Endpoint全部流量推定为公网计费。
|
|
245
|
+
- `RuleJson.Source=CDN` 为域名站内预警:固定 bytes/fixed/observe,窗口为5分钟倍数,延迟15分钟取Usage traf/all,并要求完整300秒样本。连续命中/冷却/稳定EventId防重复,固定当前租户Account=admin超管和MsgKey=cdn_traffic_alert;`AlertPending/AlertSent/AlertFailed`及ResultJson中的真实msg_event Succeeded/Failed/LogIds分开记录。失败保存LastError/LastFailureAt且不推进窗口;观察、排队或接口成功不能冒称消息送达。
|
|
246
|
+
- `RuleJson.Source=SLS` 只用固定查询模板与已校验域名/项目/地域/Logstore;基于`remote_ip`、`response_size`及独立全窗口聚合健康,返回HealthComplete/TotalRequests/DeliveryNotGuaranteed。Truncated、MissingBytes、日志不新鲜、查询不完整或动态基线不足只观察不封禁;查询完成不等于投递完整。保留连续命中、白名单、冷却与限额;私网/环回/链路本地/组播/未指定地址、IPv4映射IPv6与保护CIDR均受保护,默认观察。
|
|
247
|
+
- 云端变更先`Preview`再`Submit`,RequestKey必须绑定同一命令内容;保留既有黑名单、模式与ip_acl_xfwd语义,缺省xfwd按on失败关闭。配置快照比较、独立持久状态不可省略;所有规则评估共享规则租约,域操作900秒租约在写前续租并在锁内重查限额。超时/崩溃记Unknown且只读Reconcile,不自动重发;Reconcile仅接受Running/Unknown/AwaitingVerification,不复活终态。到期只回收本应用新增条目,含Running/Unknown的重叠持有延后回收;轮询须有界且公平,不能让最新未知项饿死旧操作。
|
|
241
248
|
- CMS 历史公有媒体的专用动作是 `RefreshCmsMedia/CmsRefreshStatus`;先验证 Capabilities 的 `CmsMediaRefresh/CmsRefreshTaskReadback`。管理员只能提交 `RendId/CmsTaskId`;服务端必须从当前租户已 Offline 的衍生、同站/同版本/同 InputHash 的原源删除检查点、可信 FileServer 与 `/当前租户/mci-cms-public/` 路径计算唯一旧 URL。拒绝任意 URL/目录/正则/客户端任务 Id/云密钥;普通 CMS 角色不能进入管理员入口,内部调用仍须重查权威撤销记录。
|
|
242
249
|
- 云刷新前独立提交操作请求键、租约、原任务快照和 `CloudWriteStarted`;未知只读回原任务,不重复云写入。缺失 TaskId 仅可依据原 URL、执行时间与前快照恢复唯一新任务,歧义保持 Unknown。任务全部 Complete/100%、原 URL 严格 HTTP404 后,CMS 还必须重查源对象不存在和当前发布权限,并在站点锁内消费当前租户权威 outbox。客户端 CacheVerified 标记、隐藏前台、源404、刷新受理或加随机参数404均不能作撤权成功。用户保存/下载副本不可召回。
|
|
243
250
|
- 精确文件刷新通常约5~6分钟;单 URL 入口保留默认每日10,000文件刷新额度、50QPS写入与5QPS任务读取边界,任务历史仅3天且同秒同 URL 任务可能合并,不假定请求与 TaskId 一一对应。刷新本身无独立费用,回源对象存储请求/流量仍可能计费。以阿里云 [RefreshObjectCaches](https://www.alibabacloud.com/help/en/cdn/developer-reference/api-cdn-2018-05-10-refreshobjectcaches)、[DescribeRefreshTasks](https://www.alibabacloud.com/help/en/cdn/developer-reference/api-cdn-2018-05-10-describerefreshtasks)及[刷新预热说明](https://help.aliyun.com/zh/cdn/user-guide/refresh-and-prefetch/)核对实际额度。验收先 warm 自有测试旧 URL 至真实缓存命中,再原请求撤回,保留源删除后旧 URL 仍200的红证、云任务与原 URL404绿证;Node模型通过不能替代真实云端。
|
|
244
|
-
- 单域名
|
|
251
|
+
- 单域名IP黑名单与账号范围严格分开;`GlobalBlock/GlobalUnblock`当前禁止写入,未具备账号级共享租约、限额及完整保护配置时不得以单域预览代替。海量服务需阿里云开通,验收不自动开通付费服务。`limit_rate`是至少100 KB/s的下载速率,不是QPS;日志规则也不等于实时边缘WAF。
|
|
245
252
|
- `mci-cdn-security-tick` 回收到期封禁;每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构,不带云密钥、规则实例、白名单或任何测试 IP。
|
|
246
253
|
- 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时,如实标为待配置,不伪造云端通过。
|
|
247
254
|
|
|
@@ -74,6 +74,8 @@ LibreTranslate 是动态翻译供应商,不是 `diy_lang` 的替代品。一
|
|
|
74
74
|
|
|
75
75
|
用户可追加经过白名单校验的语言 Key。语言越多,首次模型下载越慢;一键安装不得等待模型下载或 HTTP 就绪。应先用同版本镜像独立初始化持久化 `api_keys.db`、写入并回读随机 API Key,再启动正式容器并确认其进入运行状态,让语言模型在容器中继续初始化,不阻塞吾码主体安装。
|
|
76
76
|
|
|
77
|
+
默认部署服从内存保护:新安装的物理内存低于 7680MiB 或模型启动前可用内存低于 2048MiB 时,本次安装始终停用 OCR/LibreTranslate,不拉取/初始化/启动模型;已有同名安装容器精确停止并关闭自动重启,保留模型和密钥库。核心升级后唯一活动主租户的 `TranslateProvider` 设置为 `None` 并回读,再刷新 API;保留 URL/Key,不能写空 Provider,因为空值会按保留 URL 自动回退。内存保护已触发时不做真实模型推理验收。内存充足时 LibreTranslate 默认限制 768MiB RAM、1280MiB RAM+Swap、0.75CPU,保持 `LT_THREADS=1` 和原生模型单线程;Swap 不计入物理内存准入。
|
|
78
|
+
|
|
77
79
|
服务端统一从 SaaS 引擎租户配置读取 `TranslateProvider`、`TranslateUrl`(兼容 `TranslateApiUrl` / `LibreTranslateUrl`)、`TranslateApiKey`(兼容 `TranslateKey`)和 `TranslateTimeout`;不要再为翻译供应商增加 API 容器环境变量。密钥不得进入前端、日志或文档示例的固定默认值。
|
|
78
80
|
|
|
79
81
|
一键安装先部署平台 API/Web,并通过 liveness、完整 `ServerVersion` 升级链和 readiness;随后才预初始化并回读 API Key 数据库、启动 LibreTranslate 容器,再回读 Upgrade31 的 4 个翻译物理字段。字段每秒回读一次且最多 15 秒,正常升级应首轮命中,镜像过旧或迁移失败应快速关闭翻译能力。只有数据库回读确认字段已存在,才能把当前 `OsClient` 的 `TranslateProvider=LibreTranslate`、Docker 内网 `TranslateUrl`、匹配的 `TranslateApiKey` 和超时写入并立即回读一致性。禁止在 API/Upgrade 启动前直接更新新字段,也禁止遇到 `Unknown column` 后由安装器伪造元数据。LibreTranslate 的网络、镜像、Key、容器、字段或配置任一步失败都应保持翻译能力未启用、记录附加能力警告并继续核心安装。日志只显示 Provider 与 URL,禁止输出密钥。模型尚未完成时翻译能力可以暂时不可用,但不得拖住其它服务的安装。
|
|
@@ -244,7 +244,7 @@ ApiAddress: /saml/{OsClient}/sp/{ConnectionKey}/metadata
|
|
|
244
244
|
|
|
245
245
|
开启后接口可直接输出二进制流:
|
|
246
246
|
|
|
247
|
-
后端会统一处理响应头和文件头校验:图片/PDF 浏览器直接打开,其它文件下载;V8 代码只返回文件三字段,不要在接口里手写复杂的魔数判断。`ContentType`
|
|
247
|
+
后端会统一处理响应头和文件头校验:图片/PDF 浏览器直接打开,其它文件下载;V8 代码只返回文件三字段,不要在接口里手写复杂的魔数判断。`ContentType` 必须匹配真实字节,第三方 PLM `KD_C_PLM` 等业务封装流不能伪装成 `application/pdf`。
|
|
248
248
|
|
|
249
249
|
响应文件动态路由必须同时接受 `GET` 和 `HEAD`。OnlyOffice 等服务端预览器可能先用 `HEAD` 探测文件类型、长度和可达性;如果浏览器直接下载正常但 `HEAD` 返回 `405`,在线预览仍可能一直停在“加载文档”。
|
|
250
250
|
|