@microi.net/cli 5.7.0 → 5.7.1

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.
@@ -132,7 +132,9 @@ await V8.Notification.MarkRead({ All: true });
132
132
  - `Users` 面向当前租户用户,`Tenants` 仅允许主租户选择当前环境和网络的启用子租户,`Editions` 仅由宿主现有 License 发放判断确定官方身份。官方选项需明确选择 `OpenSource / Personal / Enterprise`,不得默认给全部版本发送。请求中的用户、租户、官方标志和产品版本不构成授权。
133
133
  - 试用提醒只绑定一个子租户,配置到期时间和提前分钟数,不改 License。所有提醒都必须有有效结束时间,支持 `Once / EveryEntry / AfterServerRestart`;定时支持一次、每日、每周和分钟间隔。每日/每周是固定时间间隔;时间传 UTC,界面显示浏览器时区;恢复上线不补弹所有历史周期。
134
134
  - 后端三个 Managed Key 为 `platform-reminder-runtime / platform-reminder-official-feed / platform-reminder-tick`。运行时动作包括 `Capabilities / Recipients / List / Get / Validate / Save / Publish / Withdraw / History / Inbox / Presented / Acknowledge`。发布需草稿 Id、`ExpectedRevision` 和稳定 `RequestId`;每次进入模式的收件箱和回执需稳定的本页面 `EntryId`。
135
- - `AccountScope=SuperAdmins` 由接收服务的真实 DiyToken、数据库用户和有效本地角色核验;`AllAccounts` 面向全部帐号。缺省字段保留旧公告的全部帐号语义;新 UI 和 MCP 的跨租户/版本默认范围为超级管理员。普通服务器不能伪造官方 License 发放身份。
135
+ - `AccountScope=SuperAdmins` 由接收服务的真实 DiyToken、数据库用户 Level >= 9999 和有效本地角色核验,不限 admin;`AllAccounts` 面向全部帐号。缺省字段保留旧公告的全部帐号语义;新 UI 和 MCP 的跨租户/版本默认范围为超级管理员。普通服务器不能伪造官方 License 发放身份。
136
+ - 自动授权提醒通过 `LicensePolicyGet/LicensePolicyValidate/LicensePolicySave` 配置,`ScopeType=Editions` 仅官方,`Tenants` 仅主租户。Policy 为 `{Personal:{AdvanceDays:7,Content:''},Enterprise:{AdvanceDays:7,Content:''}}`,天数 1–3650;空文案回退默认,支持 `{版本}/{到期时间}/{倒计时}`,分钟倒计时总会保留。保存携带 ExpectedRevision(首次 0)并回读,不通过普通公告 Save/Withdraw 修改策略。MCP 复用 get_notification_context(recipientScope)和 manage_system_reminder(scopeType、policy),确认串 `LicensePolicySave:<scopeType>`。
137
+ - 接收端先检查固定官方源,再独立检查主租户对子租户的授权提醒。签名期限、子租户期限和超级管理员身份只接受宿主可信上下文;每次真实登录分别去重,未确认刷新继续出现,站内“查看授权”不能写确认回执。右上角版本标签固定在不足 7 天时显示秒级倒计时。验收覆盖两层同时触发、各自确认、30 天配置、空默认与非 admin 管理员。
136
138
  - `AfterServerRestart` 用可信后端进程启动标识和主租户当前运行分区的共享 Redis 最新批次计算 occurrence,`Presented` 按数据库稳定回执主键抢占领取资格;同帐号多页面只有一个领取,刷新和重新登录不再次弹出。展示成功前回执应已持久化;响应丢失以同一个页面 `EntryId` 恢复,不以 localStorage 作为事实源。`ShownAt` 与 `ClosedAt` 分离,当前已领取弹窗需保留到关闭、撤回或过期。
137
139
  - 超级管理员范围和重启频率的最低接收协议为 2;官方 feed 必须对协议 1 隐去此类公告,接收端出缓存后再次按当前身份裁剪。未知范围、异常协议或无法核验的启动批次失败关闭。重启频率不能再叠加周期计划;多节点滚动发布采用共享最新启动批次,验证负载切换不回退、不重复。
138
140
  - 定时任务 `platform-reminder-tick` 每分钟只发送唤醒信号;权威计划与回执保存在数据库。前端监听 `ReceivePlatformReminder` 后回读,SignalR 正常约 60 秒对账、断线约 15 秒轮询并对错误退避;关闭失败重试、撤回和过期收回,禁止使用本机定时器或 localStorage 作为已读事实源。
@@ -113,7 +113,9 @@ export async function login(account, pwd, captcha = {}) {
113
113
 
114
114
  AI 生成的前端微服务不能假定永远在主平台 iframe/micro-app 宿主中运行:
115
115
 
116
- - `window.microApp` 存在且宿主下发 Token 时,直接配置同一个 SDK 实例并进入业务页,不重复显示登录。
116
+ - `window.microApp` 存在且宿主下发 Token 时,直接配置同一个 SDK 实例并进入业务页,不重复显示登录。
117
+ - 平台会话验证使用 `platform-current-user` 等权威身份接口,不得用某个业务模块的 `Options/Bootstrap` 成功与否判断是否已登录。`ROLE_DENIED`、未配置职责、业务初始化失败和网络错误分别显示权限/配置/重试状态,不能把有效平台会话降级为账号密码页。
118
+ - 嵌入宿主时不渲染独立登录表单;短暂等待上下文显示骨架,失败显示原始原因与重新连接入口,真实失效才引导从主站恢复登录。独立地址保留平台账号登录;子应用收到响应续签必须通过 `micro-app:token` 把新旧 Token 回传宿主,防止切换页面后重新使用旧会话。
117
119
  - 独立访问时从 `.microi-micro-app.json`/构建配置取得 `apiBase` 与 `osClient`,先复用 SDK 已保存的有效 Token;无 Token 时显示平台帐号密码登录。
118
120
  - 初始化必须调用 `V8.GetSysConfig(true)` 并按 `EnableCaptcha` 动态决定验证码。验证码接口固定为 `GET /api/Captcha/GetCaptcha`,响应头读取 `captchaid`;只有启用时才向 `V8.Login` 追加 `_CaptchaId/_CaptchaValue`。
119
121
  - 登录仍签发平台 DiyToken,不创建平行 Token、平行用户表或微服务自有密码体系。失效事件回到登录态,Token 续签仍按本 Skill 的单实例规则处理。
@@ -216,6 +216,7 @@ AI 生成菜单微服务时,应优先封装一个 `callMicroiHost(action, data
216
216
 
217
217
  ### 3D 数字孪生动态资产与许可门禁
218
218
 
219
+ - 通用 3D 设计器/渲染器与某一楼宇的定制数字孪生应使用不同 AppKey、源码目录、路由清单、运行资产与商城安装包。官方 `Platform` 包只拥有通用引擎和平台菜单;项目专属模型/贴图、业务表与字段、IoT 接口、演示数据和业务菜单属于独立业务应用(本项目采用 `MicroService`)。批量“安装/更新全部平台应用”只覆盖 `ApplicationType=Platform`,不得借平台包向所有租户散发某个客户的项目。拆分时要检查旧商城包的 `SelectMenu/SelectTable/SelectApiEngine/SelectData` 回退选择,清空旧选择后重新制作安装包,并分别回读两个包的资源快照与真实浏览器入口。
219
220
  - 道路车辆、人物、设备动画不能只靠静态截图验收。浏览器测试应同时断言对象数量、时间推进后的坐标/骨骼变化、路径末端回绕、切换楼层后的恢复及 `prefers-reduced-motion` 设置下的实际行为;测试探针只暴露非敏感数量和位置,不暴露 Token、人员或设备隐私。若持续运动本身是用户明确要求的核心功能,不得把系统的“减少动态效果”误用为整体动画总开关;只降级装饰性过渡,并提供可见、可键盘操作的暂停/恢复控制。页面隐藏或暂停期间冻结业务动画时钟,恢复时扣除停顿时间,避免物体瞬移。
220
221
  - 外部 GLB/GLTF 进入官方运行包前,逐项保存作者、原始地址、许可证、是否允许商用和再分发、署名方式、三角面数、纹理大小及优化记录。“免费下载”、搜索摘要或仓库内没有许可证都不构成可再分发授权;`NC`、`ND` 或用途不明的资产默认不进入商业应用包。
221
222
  - 品牌车辆和真实建筑只能在拥有明确资产/商标使用依据时描述为精确复刻。程序化或原创近似模型使用“风格化/演示模型”措辞,不得把车型标签当作厂商认证。视觉签收与功能、运行发布、商城包、目标租户安装是不同证据层。
@@ -63,10 +63,11 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
63
63
  - `Microi.UI/src/uniapp`:uni-app Vue 3 组件。
64
64
 
65
65
  <!-- /microi-progressive:chunk -->
66
- <!-- microi-progressive:chunk id=microi-ui-003 sha256=29586a620e8e76e0d08fa6cf48c1275154d009b734f341da455c802426cc315b -->
66
+ <!-- microi-progressive:chunk id=microi-ui-003 sha256=a099b33b210ebc71ac9d76076e9cea92e03ce34fd1a2d1ace63d4c6660dee7e0 -->
67
67
  ## 默认要求
68
68
 
69
69
  - **禁止弧形包边**:Tab、卡片、导航、提示条不使用随容器圆角弯曲的强调色侧边框。默认无侧框;需要选中侧标时使用独立的直竖线,与上下边缘留白,不能沿圆角包住上下边缘。中性容器边框与直线端点小圆角不受影响;完整规则见 `../ui-design/SKILL.md`。
70
+ - 圆角项上的彩色单侧 `inset box-shadow` 也属于禁止的包边,不能作为 `border-left` 的替代。纵向导航侧标用独立短直线;移动端改为横向导航时隐藏侧标。验收须放大查看侧栏与提示条的上下角,并回归菜单切换,具体 CSS 反例与验收见 `../ui-design/SKILL.md`。
70
71
  - Web `MciModal` 默认将焦点移入弹窗、约束 Tab、支持 Esc、关闭恢复原焦点并隔离背后页面;多层弹窗只允许最上层交互。桌面标题栏默认可拖动且不能拖出视口,使用 `draggable=false` 可关闭;`closeOnEscape=false` 只用于确需保持的受控状态,必须保留明确关闭路径。
71
72
  - 表单提交按钮使用 `MciButton type="submit"`(可配原生 `form` 属性);`MciFormField required` 必须真实触发原生必填验证。自定义 `select`/控件插槽需提供与可见标签一致的 `aria-label` 或 `aria-labelledby`,不能将全部选项文字混入控件名称。
72
73
  - 链接、描边按钮和强调文字使用 `--mci-text-link`;品牌填充使用 `--mci-color-primary` 与 `--mci-text-on-primary`。暗色卡片必须使用暗色语义渐变,逐配色核对背景与文字的组合;普通文字和按钮文字对比度至少 4.5:1。
@@ -35,7 +35,14 @@ description: Microi 模块引擎与 sys_menu 配置指南。用于创建或修
35
35
  4. 用字段名配置 `listFields/searchFields/sortFields/hiddenFields/mobileFields`;
36
36
  MCP 解析为字段 Id 和 `SelectFields/SearchFieldIds/...`。
37
37
  5. 同一次创建配齐业务按钮、FormBtns、PageTabs 和批量按钮。
38
- 6. 写后回读模块,检查字段映射、按钮 JSON、路由和目标页面。
38
+ 6. 写后回读模块,检查字段映射、按钮 JSON、路由和目标页面。
39
+
40
+ ### 菜单图标必须可辨识(强制)
41
+
42
+ - 每个新建或修改的菜单都必须设置与业务相关的图标;根目录、分类及子菜单不能批量使用同一个默认图标。优先按名称和实际功能选择,例如客户用 `UserFilled`、日程用 `Calendar`、仓储用 `Box`、办公用 `OfficeBuilding`。
43
+ - 主后台侧栏读取 `sys_menu.IconClass`(CSS/组件图标),不是图片字段 `Icon`。优先填写当前前端已注册的 Element Plus 图标名;使用 FontAwesome/CSS 名称时先核对兼容映射,不能填入不存在的类名后让全部菜单回退为 `Document`。
44
+ - 没有贴切图标时,从实际可用图标集合中随机选一个,并将选择结果保存;可以按稳定菜单 Id 生成确定的随机分配,避免每次刷新或重新发布都变图标。同组菜单应有适当差异,不强求不同业务绝对不重复。
45
+ - 通过 `microi_create_module` / `microi_update_module` 或 Manifest 的模块配置写入,并把图标纳入应用包。只修改图片字段、只检查数据库字符串或只改本地 Manifest 不算完成;必须回读 `IconClass`,在真实侧栏检查图标可见且有区别。
39
46
 
40
47
  ### 新模块表单打开方式(强制默认)
41
48
 
@@ -1,4 +1,4 @@
1
- ---
1
+ ---
2
2
  name: system-observability
3
3
  description: Microi 系统日志/监控查询、诊断与治理规范。用于分析系统日志、Trace、热点接口、CPU/内存吃满、OOM、异常分配、接口引擎/V8 事件归因、重启事故恢复、网络流量、安全事件和监控性能成本。
4
4
  ---
@@ -9,78 +9,78 @@ description: Microi 系统日志/监控查询、诊断与治理规范。用于
9
9
 
10
10
  本 Skill 用于读取、解释、扩展和验收 Microi 的统一【系统日志/监控】能力。它不授权查看其它租户、绕过菜单/平台管理员权限,或把当前节点样本扩写成全局结论。
11
11
 
12
- ## 大权限对象与 SQL 参数处理回归
13
- - 浏览器 Pinia 持久化应按已选字段独立深度监听,缓存序列化片段;非持久化的时钟/加载状态不得触发完整权限遍历,主题变化不得重新序列化用户。权限嵌套修改、登录退出、显式保存、恢复钩子、失败恢复和 dispose 必须回归,嵌入 WebOS 窗口保持只读存储边界。前端镜像验收与后端分开记录。
14
- 待办的多项只读计数由内部 `IFormEngineReadOnlyCountRuntime` 在一个批次中拥有一份独立身份;业务参数不能提供非空 `_CurrentUser`,每项仍经过原表单查询与租户/角色/数据范围检查,事务内顺序执行。抄送分页及可能执行行 V8 的 CRUD 保留独立身份。私有文件 HTTP 原子可接收本次 DiyToken 验证后独占的身份,后台可信上下文仍复制;资源引用、权限、审计和 `Limit=true` 不变。上述优化需要更新后端镜像,不能靠修改 V8 参数来启用或跳过鉴权。
15
-
16
- - `FromSection.formatSql` 是 ORM 结果缓存键处理,独立于页面 SQL 展示。大型 IN 权限快照需测试这条真实路径的分配量、参数前缀、字面量、替换值含参数文本、空值和缓存键稳定性;禁止用逐参数 `String.Replace`。单对象 HTTP 表单仅可转交本次 DiyToken 验证后独立身份,批量行与已有 JSON 持有者必须保留副本,不能推广为共享可变身份缓存。
17
-
18
- - 保持用户需要的 `PrintSqlToPage` 开启。参数准备、页面可执行 SQL 与慢日志不得逐参数扫描和复制整条 SQL;使用单次扫描,并测试字符串、注释、参数名前缀、替换值含参数文本及完整页面输出。
19
- - 动态 FormEngine 参数不得把 `_CurrentUser` 复制进业务行数据;一轮转换只拥有一份独立身份树,不能为性能共享可变用户缓存或修改调用方对象。用接近实际规模的权限树测量分配,并验证租户、访问密钥、角色和可变子对象隔离。
20
- - 接口引擎正常、异常与慢日志使用 `ApiEngineLogParameters.Serialize`,在序列化前排除顶层内部 `_CurrentUser`,用户仍由独立 UserId/UserName 字段记录;业务嵌套同名字段、类型和空值保留,不修改原参数。不允许先深复制/序列化权限树再截断。托管文件 URL、后台任务和菜单接口向可信原子只投影业务参数,后端仍独立验证身份、租户和资源权限。
21
-
22
- 登录身份权限异常膨胀时,先比对 sys_rolelimit 的有效行与 IsDeleted=1 历史行。原生权限快照与菜单授权编辑只加载有效权限,IsDeleted 为 NULL 的存量记录仍有效;没有该列的旧表保持兼容,新增列后立即采用过滤,元数据或查询异常不回退为全量授权。该修复需要更新后端镜像;已有登录缓存通过正常重新登录或 RefreshToken 刷新,不删除权限历史,不改变 DiyToken、角色/数据范围或 PrintSqlToPage。用真实数据库回归旧表、新列、撤销权限、无权限角色、注入参数和查询失败,不能仅凭身份体积下降宣称请求耗时已经恢复。
23
-
24
- 接口引擎构造脚本参数时,顶层 `_CurrentUser` 属于宿主保留身份,不再复制到 `V8.Param`;脚本读取已认证身份应使用 `V8.CurrentUser`。权限树仍保留完整内容,身份验证、令牌撤销、访问密钥范围、跨租户检查和独立脚本快照保持执行;嵌套业务对象中同名字段仍保留。实时通知检测只读取成功结果的 Code 与 DataAppend,避免为了检查不存在的事件而序列化整份用户/列表/文件 Data;事件字段白名单、大小限制、提交后发送和订阅权限不变。两项优化都需要更新后端镜像。
25
- - 公共鉴权的角色基础权限读取只检查 `_Roles`,不得复制整份用户的表/菜单权限树;显式 Bearer 请求在同一过滤器中只加载一次有效会话。优化必须保留签名、过期、安全版本、租户一致性、Redis 活动令牌、历史敏感字段清理及访问密钥撤销/范围检查;不得用跨请求身份缓存或共享可变 V8 用户对象换取速度。
26
- - 分层归因同时核对 `FormAuthorization` 与其内部 `AuthorizationVersion`;原生 Redis 授权版本读取不经过通用 `RedisRead`,不能只用后者排除缓存等待。
27
- - HTTP Controller 到首个接口引擎可单次交接已经实时验证的身份;交接必须绑定原始参数对象和同一 HttpContext,不能放入 JSON/可复制注解。参数克隆、租户或身份投影变化、重复消费、后续请求及嵌套调用均回到原验证路径。脱敏须继续覆盖全部嵌套字段,优化临时分配不能跳过大权限树。
28
- - V8 AI 代理在创建时固定不可变身份,首次调用 AI 才构造可变 JSON;普通 V8 不应为未使用的 AI 复制完整权限树。必须测试脚本修改后的身份隔离、全部权限保留、JSON 类型/注解和二进制值隔离,不能延迟读取仍由脚本持有的身份对象。
29
- - 原生统计失败时不自动重跑全部兼容查询。兼容回退只处理能力确实缺失的旧后端,避免故障放大。
30
- - 用相同测试记录修复前失败、修复后通过;实际请求需区分冷启动、稳定调用、页面并发、数据库执行与 HTTP 总耗时。镜像、应用包和线上节点分别验收。
31
-
32
- ## 请求等待分层归因
33
-
34
- - 用唯一 TraceId 对齐浏览器计时与 `RecentRequests[].Latency`,分别解释发出前排队、首字节等待、响应接收和服务端顺序阶段;不能将总耗时减 TTFB 当作下载时间。
35
- - `Latency.Parts` 是含子调用、可能并行的累计墙钟时间,不可相加或等同 CPU。连接打开/连接池等待与 SQL 命令分开;Reader 后续读行不计入 DatabaseCommand。
36
- - `RuntimeIntervals` 是当前节点最近 30 个约 1 秒同窗样本。分别核对 CPU 执行、I/O wait、steal、GC 暂停、线程池积压、采样唤醒延迟和 cgroup 节流;缺值按不可用处理。旧 Linux CPU 百分比包含 I/O wait,不能直接判定计算饱和。
37
- - `Memory.HelperProcesses.Collector/RecoveryAnalyzer` 是当前 API 管理的诊断采集/恢复子进程。两次查询间的 CPU 结合 PID、启动时间和 RSS 判断监控成本;首次、重建、不可用时 CPU 为 null。它不是 NAS 全部进程清单,不能将剩余主机负载直接归给某个服务。
38
- - `Snapshot(includeHost:true)` 的 `Host.Processes`(`process-resources/v1`)每 5 秒持续采样,CPU/RSS/Swap/I/O 前 10 名及最近 12 次样本;核对 Fresh、Scope、HostProcessesVisible、不可读/缺项计数。CPU 100% 是一核;首次、PID 重用、计数重置为 null,RSS 不能累加作独占内存。不采命令行/环境变量。Linux 无固定只读 `/proc:/host/proc:ro` 挂载时只声明当前 PID 命名空间,不能声称看到了全部宿主进程;镜像更新不能新增挂载,不能为诊断开放 Docker socket 或特权容器。
39
- - `Host.DiskIO.Devices` 包含 SATA/NVMe/RAID/映射设备的速率、IOPS、BusyPercent、AwaitMs 和 InFlight;分区按 sysfs 标记识别,名称以数字结尾不能排除。汇总只累加物理整盘,避免与 RAID/dm 双计;独立时间窗,首次/重置速率为 null。Docker 不可访问不等于宿主没有 Docker。
40
- - 宿主进程排名的 CPU/IO 速率分别使用每个进程计数器的实际读取时间窗 `CpuWindowSeconds / IoWindowSeconds`,顶层 `WindowSeconds` 只是扫描周期。GC 或调度暂停导致扫描耗时变长时,不能继续用扫描开始时间作为计数分母;单次计数读取超过 250 ms 则该次时间无效,速率为 null。旧后端长扫描的 CPU 尖峰不能直接用来证明宿主饱和。
41
- - `Trace.RuntimeRequests` 只从当前租户、当前节点最近 500 个请求中返回最多 20 个匹配记录;淘汰和重启导致缺证,不代表快。协议为 `request-latency/v1`,现有 MCP 查询参数不变;本次底层指标没有新增商城声明式资源,后端升级即可读取。
42
-
43
- - 批量角标/计数变慢时核对 Identity 次数是否随项数增长。只读 `GetTableDataCountBatch` 允许批内复用一份脱离缓存的可信身份;保留逐项表权限/数据范围、跨批次实时校验及普通 CRUD 的可变身份隔离,不能把该优化扩展为跨请求缓存权限或共享脚本可修改身份。
44
- - `RoutingMs` 包含在 `BeforeActionMs` 中;路由阶段也可能访问缓存和数据库,不可只看 Controller/表单内部计时。
45
-
46
- ## 先选入口
12
+ ## 大权限对象与 SQL 参数处理回归
13
+ - 浏览器 Pinia 持久化应按已选字段独立深度监听,缓存序列化片段;非持久化的时钟/加载状态不得触发完整权限遍历,主题变化不得重新序列化用户。权限嵌套修改、登录退出、显式保存、恢复钩子、失败恢复和 dispose 必须回归,嵌入 WebOS 窗口保持只读存储边界。前端镜像验收与后端分开记录。
14
+ 待办的多项只读计数由内部 `IFormEngineReadOnlyCountRuntime` 在一个批次中拥有一份独立身份;业务参数不能提供非空 `_CurrentUser`,每项仍经过原表单查询与租户/角色/数据范围检查,事务内顺序执行。抄送分页及可能执行行 V8 的 CRUD 保留独立身份。私有文件 HTTP 原子可接收本次 DiyToken 验证后独占的身份,后台可信上下文仍复制;资源引用、权限、审计和 `Limit=true` 不变。上述优化需要更新后端镜像,不能靠修改 V8 参数来启用或跳过鉴权。
15
+
16
+ - `FromSection.formatSql` 是 ORM 结果缓存键处理,独立于页面 SQL 展示。大型 IN 权限快照需测试这条真实路径的分配量、参数前缀、字面量、替换值含参数文本、空值和缓存键稳定性;禁止用逐参数 `String.Replace`。单对象 HTTP 表单仅可转交本次 DiyToken 验证后独立身份,批量行与已有 JSON 持有者必须保留副本,不能推广为共享可变身份缓存。
17
+
18
+ - 保持用户需要的 `PrintSqlToPage` 开启。参数准备、页面可执行 SQL 与慢日志不得逐参数扫描和复制整条 SQL;使用单次扫描,并测试字符串、注释、参数名前缀、替换值含参数文本及完整页面输出。
19
+ - 动态 FormEngine 参数不得把 `_CurrentUser` 复制进业务行数据;一轮转换只拥有一份独立身份树,不能为性能共享可变用户缓存或修改调用方对象。用接近实际规模的权限树测量分配,并验证租户、访问密钥、角色和可变子对象隔离。
20
+ - 接口引擎正常、异常与慢日志使用 `ApiEngineLogParameters.Serialize`,在序列化前排除顶层内部 `_CurrentUser`,用户仍由独立 UserId/UserName 字段记录;业务嵌套同名字段、类型和空值保留,不修改原参数。不允许先深复制/序列化权限树再截断。托管文件 URL、后台任务和菜单接口向可信原子只投影业务参数,后端仍独立验证身份、租户和资源权限。
21
+
22
+ 登录身份权限异常膨胀时,先比对 sys_rolelimit 的有效行与 IsDeleted=1 历史行。原生权限快照与菜单授权编辑只加载有效权限,IsDeleted 为 NULL 的存量记录仍有效;没有该列的旧表保持兼容,新增列后立即采用过滤,元数据或查询异常不回退为全量授权。该修复需要更新后端镜像;已有登录缓存通过正常重新登录或 RefreshToken 刷新,不删除权限历史,不改变 DiyToken、角色/数据范围或 PrintSqlToPage。用真实数据库回归旧表、新列、撤销权限、无权限角色、注入参数和查询失败,不能仅凭身份体积下降宣称请求耗时已经恢复。
23
+
24
+ 接口引擎构造脚本参数时,顶层 `_CurrentUser` 属于宿主保留身份,不再复制到 `V8.Param`;脚本读取已认证身份应使用 `V8.CurrentUser`。权限树仍保留完整内容,身份验证、令牌撤销、访问密钥范围、跨租户检查和独立脚本快照保持执行;嵌套业务对象中同名字段仍保留。实时通知检测只读取成功结果的 Code 与 DataAppend,避免为了检查不存在的事件而序列化整份用户/列表/文件 Data;事件字段白名单、大小限制、提交后发送和订阅权限不变。两项优化都需要更新后端镜像。
25
+ - 公共鉴权的角色基础权限读取只检查 `_Roles`,不得复制整份用户的表/菜单权限树;显式 Bearer 请求在同一过滤器中只加载一次有效会话。优化必须保留签名、过期、安全版本、租户一致性、Redis 活动令牌、历史敏感字段清理及访问密钥撤销/范围检查;不得用跨请求身份缓存或共享可变 V8 用户对象换取速度。
26
+ - 分层归因同时核对 `FormAuthorization` 与其内部 `AuthorizationVersion`;原生 Redis 授权版本读取不经过通用 `RedisRead`,不能只用后者排除缓存等待。
27
+ - HTTP Controller 到首个接口引擎可单次交接已经实时验证的身份;交接必须绑定原始参数对象和同一 HttpContext,不能放入 JSON/可复制注解。参数克隆、租户或身份投影变化、重复消费、后续请求及嵌套调用均回到原验证路径。脱敏须继续覆盖全部嵌套字段,优化临时分配不能跳过大权限树。
28
+ - V8 AI 代理在创建时固定不可变身份,首次调用 AI 才构造可变 JSON;普通 V8 不应为未使用的 AI 复制完整权限树。必须测试脚本修改后的身份隔离、全部权限保留、JSON 类型/注解和二进制值隔离,不能延迟读取仍由脚本持有的身份对象。
29
+ - 原生统计失败时不自动重跑全部兼容查询。兼容回退只处理能力确实缺失的旧后端,避免故障放大。
30
+ - 用相同测试记录修复前失败、修复后通过;实际请求需区分冷启动、稳定调用、页面并发、数据库执行与 HTTP 总耗时。镜像、应用包和线上节点分别验收。
31
+
32
+ ## 请求等待分层归因
33
+
34
+ - 用唯一 TraceId 对齐浏览器计时与 `RecentRequests[].Latency`,分别解释发出前排队、首字节等待、响应接收和服务端顺序阶段;不能将总耗时减 TTFB 当作下载时间。
35
+ - `Latency.Parts` 是含子调用、可能并行的累计墙钟时间,不可相加或等同 CPU。连接打开/连接池等待与 SQL 命令分开;Reader 后续读行不计入 DatabaseCommand。
36
+ - `RuntimeIntervals` 是当前节点最近 30 个约 1 秒同窗样本。分别核对 CPU 执行、I/O wait、steal、GC 暂停、线程池积压、采样唤醒延迟和 cgroup 节流;缺值按不可用处理。旧 Linux CPU 百分比包含 I/O wait,不能直接判定计算饱和。
37
+ - `Memory.HelperProcesses.Collector/RecoveryAnalyzer` 是当前 API 管理的诊断采集/恢复子进程。两次查询间的 CPU 结合 PID、启动时间和 RSS 判断监控成本;首次、重建、不可用时 CPU 为 null。它不是 NAS 全部进程清单,不能将剩余主机负载直接归给某个服务。
38
+ - `Snapshot(includeHost:true)` 的 `Host.Processes`(`process-resources/v1`)每 5 秒持续采样,CPU/RSS/Swap/I/O 前 10 名及最近 12 次样本;核对 Fresh、Scope、HostProcessesVisible、不可读/缺项计数。CPU 100% 是一核;首次、PID 重用、计数重置为 null,RSS 不能累加作独占内存。不采命令行/环境变量。Linux 无固定只读 `/proc:/host/proc:ro` 挂载时只声明当前 PID 命名空间,不能声称看到了全部宿主进程;镜像更新不能新增挂载,不能为诊断开放 Docker socket 或特权容器。
39
+ - `Host.DiskIO.Devices` 包含 SATA/NVMe/RAID/映射设备的速率、IOPS、BusyPercent、AwaitMs 和 InFlight;分区按 sysfs 标记识别,名称以数字结尾不能排除。汇总只累加物理整盘,避免与 RAID/dm 双计;独立时间窗,首次/重置速率为 null。Docker 不可访问不等于宿主没有 Docker。
40
+ - 宿主进程排名的 CPU/IO 速率分别使用每个进程计数器的实际读取时间窗 `CpuWindowSeconds / IoWindowSeconds`,顶层 `WindowSeconds` 只是扫描周期。GC 或调度暂停导致扫描耗时变长时,不能继续用扫描开始时间作为计数分母;单次计数读取超过 250 ms 则该次时间无效,速率为 null。旧后端长扫描的 CPU 尖峰不能直接用来证明宿主饱和。
41
+ - `Trace.RuntimeRequests` 只从当前租户、当前节点最近 500 个请求中返回最多 20 个匹配记录;淘汰和重启导致缺证,不代表快。协议为 `request-latency/v1`,现有 MCP 查询参数不变;本次底层指标没有新增商城声明式资源,后端升级即可读取。
42
+
43
+ - 批量角标/计数变慢时核对 Identity 次数是否随项数增长。只读 `GetTableDataCountBatch` 允许批内复用一份脱离缓存的可信身份;保留逐项表权限/数据范围、跨批次实时校验及普通 CRUD 的可变身份隔离,不能把该优化扩展为跨请求缓存权限或共享脚本可修改身份。
44
+ - `RoutingMs` 包含在 `BeforeActionMs` 中;路由阶段也可能访问缓存和数据库,不可只看 Controller/表单内部计时。
45
+
46
+ ## 先选入口
47
47
 
48
48
  | 目标 | 推荐入口 |
49
49
  |---|---|
50
50
  | 人工排查、看趋势、打开日志详情 | 平台菜单【系统日志/监控】 |
51
51
  | AI 查询、自动诊断、验收 | MCP `microi_query_system_observability` |
52
- | AI 封禁或解封 IP | MCP `microi_manage_system_observability` |
53
- | 连接池耗尽时在线诊断/恢复 | 查询 `DatabasePools / DatabasePoolRecovery`,治理 `ResetDatabasePools` |
52
+ | AI 封禁或解封 IP | MCP `microi_manage_system_observability` |
53
+ | 连接池耗尽时在线诊断/恢复 | 查询 `DatabasePools / DatabasePoolRecovery`,治理 `ResetDatabasePools` |
54
54
  | 应用页面读取 | Managed 接口引擎 `mci-system-observability-query` |
55
55
  | 应用页面治理 | Managed 接口引擎 `mci-system-observability-action` |
56
56
  | 扩展宿主、进程、Mongo 或安全底层原子能力 | `V8.Method.GetSystemObservability` / `V8.Method.ManageSystemObservability` |
57
57
 
58
58
  AI 第一次使用时先查询 `action=Capabilities`,再按返回的动作、权限和边界选择查询。优先使用专用工具,它已经限制动作、参数、分页、确认和审计。旧进程缺少新 Memory 动作时,仅允许通过标准 `microi_run_engine` 临时只读执行固定查询引擎;完整版本排查与降级边界见 [内存事故排查手册](references/memory-incident-triage.md)。不得创建临时维护引擎或绕过后端权限。
59
59
 
60
- ## 查询动作
61
-
62
- ### 连接池故障应急入口
63
-
64
- - 收到 `obtaining a connection from the pool` 时,直接用 `microi_query_system_observability(action=DatabasePools,poolTarget=Both)`;故障池可能阻塞普通 `Capabilities` 或 Managed 引擎,此动作走固定 `/api/Diagnostics/database-pools` 应急协议。要求后端支持 `database-pools/v1`,只更新 MCP 不能安装后端。
65
- - `microi_manage_system_observability(action=ResetDatabasePools,poolTarget=Both)` 无确认值时只预览。执行必须带同一预览的 `operationId`、`poolIds`、`poolTarget` 和 `confirmExecution=ResetDatabasePools:<operationId>`。预览票据 2 分钟有效;执行前仍复核配置摘要。
66
- - 请求超时或响应未知,使用查询动作 `DatabasePoolRecovery` 与原 `operationId` 回读,禁止换编号重试。每租户 60 秒冷却;命令期限 90 秒;回执保留 10 分钟,过期编号不能重新执行。
67
- - 回执逐节点区分 `Pending / Incomplete / PartialFailure / CompletedForRegisteredNodes`。只有最后一项证明已注册节点完成;未升级节点不在覆盖范围,最后还需验证原故障只读接口。不得把当前节点探测成功说成全站恢复。
68
- - 支持当前租户 MySQL/SQL Server 主、读池;`Both / Write / Read`,相同池去重。已加载的其它租户共享池时拒绝;扩展库和其它驱动明确不支持。池上限、驱动版本、退避和失败码可读,`Opening` 不等于驱动借出数。
69
- - 服务继续验证 DiyToken、Redis 有效会话和主库管理员;访问密钥需要 `mcp:admin`。仅鉴权使用有界无池连接,每节点应急请求最多 2 个、连接和命令超时各 5 秒;修复后的探测使用原业务池。不得创建匿名维护引擎或另设万能密码。
70
- - 不杀事务、不全局清池、不重放 SQL、不自动放大池上限,不以重启数据库/API 作为默认恢复。无有效会话、Redis/主库不可用或内存保护触发时不能绕过防护。持续泄漏、慢 SQL、容量与网络故障仍需定位根因。
71
- - 此功能属框架运行时应急协议,不新增表/菜单/引擎,不需要发布商城资源;责任同步为 Core/Dos.ORM、MCP、本文档与内嵌知识。验收必须覆盖真实池耗尽、HTTP 撤权/失效会话、两个独立进程、幂等重试、配置漂移与事务存活。
72
-
73
- `microi_query_system_observability` 支持:
60
+ ## 查询动作
61
+
62
+ ### 连接池故障应急入口
63
+
64
+ - 收到 `obtaining a connection from the pool` 时,直接用 `microi_query_system_observability(action=DatabasePools,poolTarget=Both)`;故障池可能阻塞普通 `Capabilities` 或 Managed 引擎,此动作走固定 `/api/Diagnostics/database-pools` 应急协议。要求后端支持 `database-pools/v1`,只更新 MCP 不能安装后端。
65
+ - `microi_manage_system_observability(action=ResetDatabasePools,poolTarget=Both)` 无确认值时只预览。执行必须带同一预览的 `operationId`、`poolIds`、`poolTarget` 和 `confirmExecution=ResetDatabasePools:<operationId>`。预览票据 2 分钟有效;执行前仍复核配置摘要。
66
+ - 请求超时或响应未知,使用查询动作 `DatabasePoolRecovery` 与原 `operationId` 回读,禁止换编号重试。每租户 60 秒冷却;命令期限 90 秒;回执保留 10 分钟,过期编号不能重新执行。
67
+ - 回执逐节点区分 `Pending / Incomplete / PartialFailure / CompletedForRegisteredNodes`。只有最后一项证明已注册节点完成;未升级节点不在覆盖范围,最后还需验证原故障只读接口。不得把当前节点探测成功说成全站恢复。
68
+ - 支持当前租户 MySQL/SQL Server 主、读池;`Both / Write / Read`,相同池去重。已加载的其它租户共享池时拒绝;扩展库和其它驱动明确不支持。池上限、驱动版本、退避和失败码可读,`Opening` 不等于驱动借出数。
69
+ - 服务继续验证 DiyToken、Redis 有效会话和主库管理员;访问密钥需要 `mcp:admin`。仅鉴权使用有界无池连接,每节点应急请求最多 2 个、连接和命令超时各 5 秒;修复后的探测使用原业务池。不得创建匿名维护引擎或另设万能密码。
70
+ - 不杀事务、不全局清池、不重放 SQL、不自动放大池上限,不以重启数据库/API 作为默认恢复。无有效会话、Redis/主库不可用或内存保护触发时不能绕过防护。持续泄漏、慢 SQL、容量与网络故障仍需定位根因。
71
+ - 此功能属框架运行时应急协议,不新增表/菜单/引擎,不需要发布商城资源;责任同步为 Core/Dos.ORM、MCP、本文档与内嵌知识。验收必须覆盖真实池耗尽、HTTP 撤权/失效会话、两个独立进程、幂等重试、配置漂移与事务存活。
72
+
73
+ `microi_query_system_observability` 支持:
74
74
 
75
75
  | action | 用途 | 关键参数 |
76
76
  |---|---|---|
77
77
  | `Capabilities` | 能力目录与真实边界 | 无 |
78
78
  | `Snapshot` | 请求、进程、主机、Docker、队列、诊断和实时网络 | `windowMinutes=1..15`、`top`、`includeHost`、`includeDocker` |
79
- | `Memory` | 当前节点内存压力、线程池及共享请求槽占用/等待、执行分配、对象类型和采集质量 | 无;必须先核对采集器心跳与存储错误 |
80
- | `MemoryIncidents` | 当前租户共享事故与本机持久记录摘要;持续线程池积压也会触发留证 | 最近最多 50 条 |
81
- | `MemoryIncident` | 执行链、代码哈希、CLR 分配栈和退出证据 | 32 位小写十六进制 `incidentId` |
82
-
83
- | `Logs` | 日志列表和完整详情数据 | `keyword/type/category/source/level/searchMonth/pageIndex/pageSize` |
79
+ | `Memory` | 当前节点内存压力、线程池及共享请求槽占用/等待、执行分配、对象类型和采集质量 | 无;必须先核对采集器心跳与存储错误 |
80
+ | `MemoryIncidents` | 当前租户共享事故与本机持久记录摘要;持续线程池积压也会触发留证 | 最近最多 50 条 |
81
+ | `MemoryIncident` | 执行链、代码哈希、CLR 分配栈和退出证据 | 32 位小写十六进制 `incidentId` |
82
+
83
+ | `Logs` | 日志列表和完整详情数据 | `keyword/type/category/source/level/searchMonth/pageIndex/pageSize` |
84
84
  | `LogTypes` | 日志类型与数量 | `keyword/searchMonth` |
85
85
  | `LogStats` | 总数、错误、警告、慢 SQL、慢执行、异常 | `keyword/searchMonth` |
86
86
  | `Signal` | 时间窗内的诊断信号 | `windowSeconds=60..86400` 与日志过滤项 |
@@ -91,10 +91,10 @@ AI 第一次使用时先查询 `action=Capabilities`,再按返回的动作、
91
91
  | `SecurityData` | 访问、攻击或封锁记录 | `kind=Access|Attack|Block`、分页 |
92
92
  | `TrafficHistory` | MySQL 固定时间桶流量趋势 | `rangeKey`;可选 `dimensionType` |
93
93
  | `HistoricalDashboard` | 同一时间范围内的热点接口、IP、帐号、租户、内容类型与请求/流量总览 | `rangeKey=live5|today|yesterday|3d|7d|15d|30d|3m|6m|1y`、`top` |
94
- | `TrafficDetails` | 跨月大文件、上传下载和可疑传输 MongoDB 明细 | `rangeKey`、`pageIndex/pageSize`;可选 `keyword/transferAction/ip/userId/endpoint` |
95
-
96
- `Memory` 和事故帧中的 `PressureGlobal*`、`PressureV8Global*` 给出共享槽占用与排队;持续满额排队触发 `SustainedRequestGateWait` 留证。它说明当前节点共享闸门拥堵,需结合租户执行链定位长请求,不能只凭片段数归责某租户。
97
- 请求先取单接口/单租户槽,再取共享 V8/全局槽,避免故障租户在自身槽前排队时占住其它租户的共享容量。不得把 V8.Http 全局默认 600 秒改短来处理单个上游故障;业务需要时按接口明确配置超时。
94
+ | `TrafficDetails` | 跨月大文件、上传下载和可疑传输 MongoDB 明细 | `rangeKey`、`pageIndex/pageSize`;可选 `keyword/transferAction/ip/userId/endpoint` |
95
+
96
+ `Memory` 和事故帧中的 `PressureGlobal*`、`PressureV8Global*` 给出共享槽占用与排队;持续满额排队触发 `SustainedRequestGateWait` 留证。它说明当前节点共享闸门拥堵,需结合租户执行链定位长请求,不能只凭片段数归责某租户。
97
+ 请求先取单接口/单租户槽,再取共享 V8/全局槽,避免故障租户在自身槽前排队时占住其它租户的共享容量。不得把 V8.Http 全局默认 600 秒改短来处理单个上游故障;业务需要时按接口明确配置超时。
98
98
 
99
99
  示例:
100
100
 
@@ -140,6 +140,18 @@ UnblockIp:<ip>
140
140
  7. 执行累计分配和 EventPipe 抽样不是存活堆或 RSS;父执行包含子调用,不能相加或把最高分配者直接宣布为唯一根因。CLR 栈关联脚本哈希和资源身份,不保证 JavaScript 行号。
141
141
  8. MongoDB 驻留内存、WiredTiger 缓存和日志库存储空间分开解释;磁盘大小不能当作进程 RAM。未正常退出只说明检查点未完成正常关闭,不单独证明 OOM。
142
142
 
143
+ ## 关键事故 MySQL 持久化与等待归因
144
+
145
+ - 包含 `critical-incidents/mysql-v1` 的后端将关键事故异步直写当前租户主库 `mci_runtime_incident`,不依赖本地写文件或 Mongo 成功。表和索引必须由【系统日志/监控】官方应用安装;不新增启动 DDL 或环境开关。
146
+ - 持久目录中的事故由独立写库线程每 10 秒分批补写 MySQL,重启后继续;MySQL 版本确认文件与 Mongo 的 `.ack` 独立。核对 `SpoolReplayError`,未挂持久卷且尚未写库的内存队列不在重启恢复保证内。
147
+ - `Memory.RequestWaits` 包含按接口/阶段/目标的 Groups、活动 Samples 和 Recent。HTTP 目标只有主机/端口与路径哈希,不采路径明文、参数或凭据;TraceId 关联执行。Admission 与 Http 是不同计数,不能相加成工作线程数。
148
+ - 事故 `WaitEvidence` 保留分组并发峰值、最长请求样本及最差线程池帧,恢复后的空快照不覆盖现场。各分组 `ObservedAtUtc` 可能不同,不能相加为同一时刻并发量;DiscardedGroups/DiscardedSamples 和 EvidenceTruncated 表示有界取证缺口。
149
+ - `Gate:V8Tenant` 表示租户闸门等待;`AwaitingHttpCompletion` 包含连接/远端处理/接收,不虚构 DNS/TCP 分段。等待超过 10 秒只留证,不改 600 秒默认与显式长超时。
150
+ - 核对 `Evidence.CriticalStorage` 的 AcknowledgedWrites、LastAcknowledgedAtUtc、Pending、DroppedSnapshots、Error;只有已确认写入才能宣称可跨容器重建读取。MySqlError:1146 提示先核对应用表升级。关系库后备当前仅支持 MySQL,其他驱动明确降级,不能说全部数据库已验收。
151
+ - MySQL 详情标记 `StorageKind=MySqlCriticalEvidence`、RawStacksStoredHere=false;EvidenceTruncated 和 RequestWaits 省略/溢出计数必须报告。MemoryIncidents/MemoryIncident 分别报告 RelationalStorage 与 SharedStorage,Mongo 失败不能掩盖 SQL 成功。
152
+ - 采样与写库使用独立线程。最多 2 个无池连接,连接/命令各 2 秒,失败退避 10 秒;64 个合并待写快照、每条 256 KiB、每租户 14 天或最新 512 条。保留幂等与版本检查,旧快照不能覆盖新证据。
153
+ - 必测:目录不可写 + Mongo 不可用时仍写 MySQL、业务连接池耗尽、跨节点与租户隔离、旧快照重放、线程池饥饿、容器删除后新节点查询。原始栈仍需持久卷;数据库同时故障与尚未确认的强杀窗口不承诺零丢失。
154
+
143
155
  ## 内存事故留证规范
144
156
 
145
157
  处理内存吃满、OOM、异常分配、长循环或重启丢日志时,必须继续读取 [内存事故排查手册](references/memory-incident-triage.md),按字段与证据质量完成归因,不得仅返回一个热点排行。
@@ -180,16 +192,16 @@ UnblockIp:<ip>
180
192
 
181
193
  需要压测或修改热路径时同时读取 `../performance-testing/SKILL.md`;排查 V8/日志写法时读取 `../v8-debugging/SKILL.md`。
182
194
 
183
- ## AI 诊断顺序
184
-
185
- ### 宿主数据库进程高 CPU
186
-
187
- - `Host.Processes` 确认 `mysqld` 高 CPU 后,继续用 `microi_query_external_database` 对已授权实例只读查询实际 `performance_schema`/`information_schema`。先核对数据库版本与可用列;使用规范化 `DIGEST_TEXT`,不回传连接串或含业务值的 SQL 正文。
188
- - 至少间隔一个业务周期采集两次 `events_statements_summary_by_digest`,计算 `COUNT_STAR/SUM_TIMER_WAIT/SUM_ROWS_EXAMINED/SUM_SELECT_SCAN` 差值;累计总耗时与并发墙钟时间不等于 CPU。当前页面 SQL 很快不能排除后台任务在同库扫描。
189
- - 核对实际索引与锁/事务状态。典型例子是 `mic_data_version` 缺少 `(TableId,TableRowId,CreateTime)`,定时任务运行时间刷新又不断生成版本,形成越来越重的历史扫描。索引由所属应用声明,新旧库都应交付;在线修复后必须回读并观察后续 digest 和同窗宿主进程。
190
- - 原生建索引工具若不能表达生产所需的在线算法、锁等待上限,应通过受控管理员数据库工具预览固定语句,再按已有明确修复授权执行并回读;不得因响应超时重复建索引,不做表重建或删除历史来掩盖问题。
191
-
192
- 1. 先查 `Capabilities`,确认当前版本和边界。
195
+ ## AI 诊断顺序
196
+
197
+ ### 宿主数据库进程高 CPU
198
+
199
+ - `Host.Processes` 确认 `mysqld` 高 CPU 后,继续用 `microi_query_external_database` 对已授权实例只读查询实际 `performance_schema`/`information_schema`。先核对数据库版本与可用列;使用规范化 `DIGEST_TEXT`,不回传连接串或含业务值的 SQL 正文。
200
+ - 至少间隔一个业务周期采集两次 `events_statements_summary_by_digest`,计算 `COUNT_STAR/SUM_TIMER_WAIT/SUM_ROWS_EXAMINED/SUM_SELECT_SCAN` 差值;累计总耗时与并发墙钟时间不等于 CPU。当前页面 SQL 很快不能排除后台任务在同库扫描。
201
+ - 核对实际索引与锁/事务状态。典型例子是 `mic_data_version` 缺少 `(TableId,TableRowId,CreateTime)`,定时任务运行时间刷新又不断生成版本,形成越来越重的历史扫描。索引由所属应用声明,新旧库都应交付;在线修复后必须回读并观察后续 digest 和同窗宿主进程。
202
+ - 原生建索引工具若不能表达生产所需的在线算法、锁等待上限,应通过受控管理员数据库工具预览固定语句,再按已有明确修复授权执行并回读;不得因响应超时重复建索引,不做表重建或删除历史来掩盖问题。
203
+
204
+ 1. 先查 `Capabilities`,确认当前版本和边界。
193
205
  2. 查 `Snapshot`,记录节点、窗口、请求率、活动请求、CPU/内存、队列、HTTP 流量与未归因残差。
194
206
  内存问题同时查 `Memory`、`MemoryIncidents`、`MemoryIncident`,先确定采集健康,再关联接口/V8 事件、表/工作流节点、代码哈希和 Trace。
195
207
  3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度,区分“计算慢”与“传输大”;再用 `TrafficDetails` 定位具体帐号/匿名、IP、接口、文件元数据和 TraceId。
@@ -199,24 +211,24 @@ UnblockIp:<ip>
199
211
  7. 对匿名上传、大响应、重复轮询或攻击信号先核对业务合法性,再限流、对象存储直传/CDN、Range、压缩或封禁。
200
212
  8. 优化后用相同窗口与负载复测 P50/P95/P99、RPS、错误率、CPU、内存、分配率和网络字节,不能只凭单次页面刷新下结论。
201
213
 
202
- ## 扩展与商城交付
203
-
204
- ### CDN 模块
205
-
206
- - 现有 `microi-platform-service` 的系统日志页增加 CDN Tab;不另建同名应用。固定管理员入口为 `mci-cdn-manager`,内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`,四个引擎归 `app.microi.sys-log` 的 Managed 资源。
207
- - 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
208
- - 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败,不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret,由可信后端解密到后端 `ServerPrivateSettings`;不返回原文。
209
- - Aliyun 运营报表 ID:1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。未订阅不能伪造成零流量,也不能将历史 TOP 当作分钟级规则数据;未知流量单位保持原始值。
210
- - 报表参数按类型分开:只有 13/15 传非空 Area,1/3/9/11 传非空 HttpCode,21/23 传 IsOverseas;17 不传 DomainName。不得统一附加无关或空筛选项,否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject,不向它写入配置对象,创建独立 JS 请求并从服务端读取接入配置。
211
- - SLS 只用固定查询模板与已校验域名/项目/地域/Logstore;自动判断基于 `remote_ip`、`response_size` 字节以及完整窗口、采集延迟、连续命中、白名单、冷却与限额。私网/环回/链路本地/组播和与保护 CIDR 重叠的地址不封禁。动态阈值须满足历史样本数,默认观察。
212
- - 云端变更先 `Preview` 再 `Submit`,请求号幂等、配置快照比较、独立持久化状态和租约不可省略。超时/崩溃记 Unknown 并 `Reconcile`,不能自动重发不确定写入。到期只删除本应用新增条目,重叠封禁延后回收。
213
- - 单域名 IP 黑名单与全账号海量封禁必须分开;后者需阿里云开通,须明确 `ALL_CDN_DOMAINS`,不在验收时自动开通付费服务。`limit_rate` 是至少 100 KB/s 的下载速率,不是 QPS;日志规则也不等于实时边缘 WAF。
214
- - `mci-cdn-security-tick` 回收到期封禁;每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构,不带云密钥、规则实例、白名单或任何测试 IP。
215
- - 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时,如实标为待配置,不伪造云端通过。
216
-
217
- - 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
218
- - 历史日志兼容入口为 `POST/GET /api/SysLog/AddSysLog`;它只接受当前 DiyToken 用户和租户上下文,返回进入异步持久化流程不等于日志已经落库,必须以后续记录回读作为验收事实。
219
- - 只有接口引擎缺少宿主进程、Docker、Mongo 聚合、安全运行态等可复用底层能力时,才扩展最小 V8 原子方法;Controller 不承载业务编排。
214
+ ## 扩展与商城交付
215
+
216
+ ### CDN 模块
217
+
218
+ - 现有 `microi-platform-service` 的系统日志页增加 CDN Tab;不另建同名应用。固定管理员入口为 `mci-cdn-manager`,内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`,四个引擎归 `app.microi.sys-log` 的 Managed 资源。
219
+ - 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
220
+ - 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败,不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret,由可信后端解密到后端 `ServerPrivateSettings`;不返回原文。
221
+ - Aliyun 运营报表 ID:1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。未订阅不能伪造成零流量,也不能将历史 TOP 当作分钟级规则数据;未知流量单位保持原始值。
222
+ - 报表参数按类型分开:只有 13/15 传非空 Area,1/3/9/11 传非空 HttpCode,21/23 传 IsOverseas;17 不传 DomainName。不得统一附加无关或空筛选项,否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject,不向它写入配置对象,创建独立 JS 请求并从服务端读取接入配置。
223
+ - SLS 只用固定查询模板与已校验域名/项目/地域/Logstore;自动判断基于 `remote_ip`、`response_size` 字节以及完整窗口、采集延迟、连续命中、白名单、冷却与限额。私网/环回/链路本地/组播和与保护 CIDR 重叠的地址不封禁。动态阈值须满足历史样本数,默认观察。
224
+ - 云端变更先 `Preview` 再 `Submit`,请求号幂等、配置快照比较、独立持久化状态和租约不可省略。超时/崩溃记 Unknown 并 `Reconcile`,不能自动重发不确定写入。到期只删除本应用新增条目,重叠封禁延后回收。
225
+ - 单域名 IP 黑名单与全账号海量封禁必须分开;后者需阿里云开通,须明确 `ALL_CDN_DOMAINS`,不在验收时自动开通付费服务。`limit_rate` 是至少 100 KB/s 的下载速率,不是 QPS;日志规则也不等于实时边缘 WAF。
226
+ - `mci-cdn-security-tick` 回收到期封禁;每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构,不带云密钥、规则实例、白名单或任何测试 IP。
227
+ - 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时,如实标为待配置,不伪造云端通过。
228
+
229
+ - 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
230
+ - 历史日志兼容入口为 `POST/GET /api/SysLog/AddSysLog`;它只接受当前 DiyToken 用户和租户上下文,返回进入异步持久化流程不等于日志已经落库,必须以后续记录回读作为验收事实。
231
+ - 只有接口引擎缺少宿主进程、Docker、Mongo 聚合、安全运行态等可复用底层能力时,才扩展最小 V8 原子方法;Controller 不承载业务编排。
220
232
  - 官方引擎声明 `ResourcePolicies.ApiEngines=Managed`,由本次已校验包正文覆盖其拥有的资源;客户扩展使用独立 Key 或 `CreateIfMissing`,既有扩展不被覆盖。不得把 Managed 的旧本地改动当作拒绝应用升级的理由,也不得扩大到无关资源。
221
233
  - 按应用发布契约交付表、字段、索引/DDL、接口引擎、菜单、版本日志和微服务运行产物;私有源码由源码同步链交付。`DatabaseOnly/SourceNotIncluded` 必须如实标识,不能声称商城包包含全部源码。安装后回读固定版本快照并在真实页面验收。
222
234
  - 后端框架和商城应用是两条升级链:只升级其中一条不能证明功能完整。目标端应先升级兼容框架,再安装/更新最新【系统日志/监控】应用。
@@ -38,7 +38,9 @@
38
38
  | `Collector.LostEvents/OverflowSamples/UnattributedEstimatedBytes` | 丢事件、溢出和无归属量同时报告,不把未知量分摊给热点接口 |
39
39
  | `Executions.RegistryOverflowCount` | 活动执行登记有硬容量,溢出时不能声称清单完整 |
40
40
  | `Evidence.LocalStorageError/DroppedUnuploadedFiles` | 写盘失败与预算淘汰影响能否事后恢复;磁盘满优先排查 |
41
- | `Evidence.SharedStorageError/PendingUploads` | Mongo 异常时使用本机证据,另一节点看不到尚未上传记录 |
41
+ | `Evidence.SharedStorageError/PendingUploads` | Mongo 完整证据同步状态;关键证据另查 MySQL,不能据此判断全部历史不可用 |
42
+ | `Evidence.CriticalStorage` | 核对 MySQL 确认次数/时间、待写、丢弃和错误。未确认队列不是持久化成功 |
43
+ | `RequestWaits / WaitEvidence` | 实时等待与事故保留峰值分别读取。峰值分组的 ObservedAtUtc 可能不同,不能相加为并发总数或线程数 |
42
44
  | 事故 `Stacks` / `Evidence.StackQuality` | 报告缺栈样本、截断、丢事件;部分证据不能称为完整分配栈 |
43
45
 
44
46
  每 2 秒检查点、约 2 分钟压力窗口、共享 14 天历史、本机 256 MiB 历史预算均为有界默认值。原始片段单段最多 64 MiB,保留最近两段,加上正在写入的一段最多 192 MiB;主体达到 16 MiB 就提前收尾,EventPipe 缓冲固定 64 MiB。完整 API 的 rundown 实测约 35 MiB,原 16/32 MiB 缓冲会丢事件,不能仅以小型测试宿主验收采集完整性。极快退出、调度阻塞、卷丢失、磁盘满和早期崩溃仍可能扩大缺口。整个容器退出后尝试尾段与前段恢复,并保留 `MissingStackSamples/Truncated`。不要删除日志卷来“修复”采集。
@@ -51,7 +53,9 @@
51
53
  4. `Trace` 串联慢 SQL、外部请求、返回字节和调用顺序。检查无分页读表、循环内查询、递归调用、大对象序列化、文件/Base64、日志正文与缓存增长;选择与样本类型/CLR 栈吻合的假设。
52
54
  5. 独占分配与含子调用分配分别解释,不能父子相加。累计分配不是存活内存,分配第一名不是唯一根因,CLR 栈不保证 JavaScript 行号。
53
55
  6. RSS 高但分配不吻合时继续查长期保留、静态缓存、非托管内存与其它进程。Mongo 的 RAM、WiredTiger 缓存、日志库磁盘空间分别判断;磁盘 22 GB 不能改写成进程内存 22 GB。
54
- 7. 修复后在隔离环境按相同数据、并发、脚本与窗口比较结果正确性、分配率、堆/RSS、GC、P95/P99 与错误率。生产不制造真实 OOM 来验收。
56
+ 7. 修复后在隔离环境按相同数据、并发、脚本与窗口比较结果正确性、分配率、堆/RSS、GC、P95/P99 与错误率。生产不制造真实 OOM 来验收。
57
+
58
+ 主机 CPU、内存正常而 API 不响应时,先查 `WaitEvidence.Groups/Samples` 的租户、接口、Gate 阶段、HTTP 目标与 TraceId,再与 `WorstThreadPoolFrame`、共享槽指标及外部服务记录对齐。HTTP 目标使用路径哈希,可对候选 URL 的路径计算 SHA-256 比对;不保存凭据或查询参数。长等待本身可以是正常业务,默认 600 秒与显式长超时不因此缩短。没有采到当时的线程池状态时,不能凭请求数量倒推出工作线程耗尽。
55
59
 
56
60
  结论须包含“已证实事实、原因假设与依据、缺失证据、修复、复测、交付版本边界”。不得用单次演练外推固定成功概率;具体接口/事件定位与存活对象/代码行根因是不同精度。
57
61
 
@@ -66,7 +70,7 @@
66
70
 
67
71
  ## 完整交付验收
68
72
 
69
- - API:包含诊断运行时和 helper、可写持久 `logs` 卷、心跳与质量可读。
73
+ - API:包含诊断运行时和 helper,关键事故 MySQL 表及索引已通过商城安装并回读确认。原始分配栈仍要求可写持久 `logs` 卷;容器无卷时 MySQL 已确认记录可跨重建读取,但不能声称完整栈已保留。
70
74
  - 商城/页面:查询引擎、内存与事故界面、固定发布版本一致,真实页面可读事故。
71
75
  - MCP:发行包实际 initialize/tools/list/describe_tool 成功,三个只读动作通路与非法 Id 拦截正常;没有通过查询生成业务写入或放宽权限。
72
76
  - Skills/文档:本手册随 CLI/插件打包;官方文档使用既有“系统日志/监控”页面,解释使用流程和成本。
@@ -16,10 +16,12 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
16
16
  ---
17
17
 
18
18
  <!-- microi-progressive:begin -->
19
- <!-- microi-progressive:chunk id=ui-design-000 sha256=ba3ee4e932e517b3ad893abb399b2d64322434e0581c06a31ec2032e47abb427 -->
19
+ <!-- microi-progressive:chunk id=ui-design-000 sha256=ba7fc233da47ef8d477540bc5a2b982eb0fef852cfffe9da12e5c0d03a57614d -->
20
20
  ## 整体风格定义
21
21
 
22
22
  - **禁止弧形包边**:Tab、卡片、导航项、提示条和分组标题不得把强调色 `border-left` / `border-right` 与容器圆角组合成沿上下圆角弯曲的侧框,也不得用渐变、阴影或伪元素模拟同样的包边。默认不加侧框;需要强调时使用与容器边框独立的直竖线,垂直居中、与上下边缘留出间距且不随容器圆角弯折。直线端点可以有轻微圆角,容器本身仍可使用中性圆角边框。横向 Tabs 继续使用独立选中表面,不添加装饰线。亮色、暗色与移动端截图都必须核对这一规则。
23
+ - **禁止用内阴影绕过侧标规则**:圆角选中项上的 `box-shadow: inset 3px 0 <强调色>` 与 `border-left: 4px solid <强调色>` 都是反例,改名为“背景线”也不例外。需要侧标时用独立伪元素:`position:absolute; inset-inline-start:0; top:25%; width:3px; height:50%; border-radius:0; pointer-events:none`,背景使用主题强调色;容器仅提供定位和选中表面。移动断点将纵向菜单改成横向 Tabs 时必须隐藏侧标。提示条优先保留中性细边框和语义底色,不加彩色侧框。
24
+ - **侧标必须按实际像素验收**:放大检查选中项与提示条左/右上角、下角;强调色不能接触上下边缘、弯折成括号或沿轮廓包裹。截图覆盖深色侧栏、浅色提示条、移动横向导航,并点击至少两个不同菜单核对选中态;仅检查 `border-left:0` 或构建成功不能证明通过,内阴影、渐变与伪元素也必须检查。
23
25
 
24
26
  - **默认基线**:优先呈现清爽、清新、易读的界面,减少重复层级、冗长说明、同义统计卡和无业务意义的装饰,把视觉重量留给真实内容与关键操作。
25
27
  - **信息密度**:清爽不是空白越多越好;应用应以任务完成效率决定首屏密度,并通过字号、间距、对齐和语义表面建立层次。
@@ -203,7 +203,10 @@ SELECT * FROM Contact WHERE OwnerId = $CurrentUser.Id$ AND Spouse = $CurrentUser
203
203
  ❌ 跨租户操作不验证当前用户权限 → 越权风险
204
204
  ❌ 子租户缺少 MQ/MQTT/Search 独立凭据时回退主账号 → 全平台越权
205
205
 
206
- ## 检查清单
206
+ ## 检查清单
207
+
208
+ - 子租户授权使用官方 SaaS 应用的 `sys_osclients.LicenseProductType` 与 `LicenseExpirationDate`(UTC)字段;两项留空继承主授权。只允许主租户超级管理员设置,不能超过已验签主授权的版本和日期;运行时再次裁剪。两项不得通过主配置合并自动复制到子租户。不要在可编辑 V8 里代替可信授权边界。
209
+ - 授权到期文案和提前天数在消息通知页设置。官方与主租户策略分别触发,不能因官方已触发或未触发而跳过主租户检查。签发帐号 `sys_user.LicenseExpirationDate` 未设置表示永久有效,但可签发版本及请求日期仍需校验。
207
210
 
208
211
  - [ ] 缓存只通过 `V8.Cache` 使用逻辑 Key 或当前租户完整 Key
209
212
  - [ ] 所有 MongoDB DbName 都包含 `V8.OsClient`