Просмотр исходного кода

test: 语义重排 51 个错位 TC + 台账/矩阵基线纠偏 (闭环 G-2/G-9)

- tests/test-cases/{admin,parent,child,teacher}.md: 51 个历史编号错位按内容语义彻底重排(仅改 TC编号/所属场景 两列,内容零丢失);孤儿 TC-A-03/A-04(方案管理/方案激活)与 TC-DV-* 深挖跨引用共 20 行特殊保留待裁决,非编号错位
- docs/tdd/orchestration/sc-key-map.md: 注册 SC-A-23 团队收益 / SC-A-24 财富中心贡献榜,基线 241→243;纠正此前对 SC-X-22 的重复计(曾误计 244)
- tests/TRACEABILITY-MATRIX.md: L1 实测 223/243(91.8%,重排消除 20 个 SC 幻影覆盖);L2 实测 680 对齐 / 0 编号错位 / 221 格式差异(旧文本标注与 S-cfc 规格键)/ 20 特殊保留;G-2 闭环标注
- .gitignore: 补全一次性执行辅助(/_r* /_e2e* /tests/_* 等)忽略规则
- 清理 38 个误入库的临时探针文件(git rm --cached)

经用户授权提交推送 origin/cfclub 闭环 G-9。
E2E Test Bot 1 день назад
Родитель
Сommit
487904bea6

+ 7 - 1
.gitignore

@@ -141,5 +141,11 @@ tests/.live-artifacts
 _cmd_*
 _dispatch_*
 _poll_*
-_r1*_agg.json
+/_r*
+/_e2e*
+/_rename*
+/_renumber*
+/tests/_*
+/tests/tests
+/tests/v3_results.txt
 tmp_*.cjs

+ 0 - 79
_e2e_admin_debug.cjs

@@ -1,79 +0,0 @@
-/**
- * Temporary admin-login diagnostic (NOT committed). Classifies why /admin
- * login returned no token: credential rejection vs selector mismatch.
- * Credentials read from local machine.json; never printed.
- */
-const { chromium } = require('@playwright/test');
-const fs = require('fs');
-const path = require('path');
-
-const BASE = process.env.PW_BASE_URL || 'http://cfc.iwintrue.com';
-const MJ = process.env.MACHINE_JSON_PATH;
-
-async function main() {
-  const out = { base: BASE, steps: {} };
-  let admin = { phone: '13800138000' };
-  let pw = 'admin123';
-  if (MJ && fs.existsSync(MJ)) {
-    try {
-      const cfg = JSON.parse(fs.readFileSync(MJ, 'utf8'));
-      if (cfg.e2e_test_target && cfg.e2e_test_target.admin) {
-        if (cfg.e2e_test_target.admin.phone) admin.phone = cfg.e2e_test_target.admin.phone;
-        if (cfg.e2e_test_target.admin.password) pw = cfg.e2e_test_target.admin.password;
-      }
-    } catch (e) {}
-  }
-
-  const launchOpts = { headless: true, args: ['--no-sandbox'] };
-  if (process.env.CHROME_PATH) launchOpts.executablePath = process.env.CHROME_PATH;
-  const browser = await chromium.launch(launchOpts);
-  try {
-    const ctx = await browser.newContext();
-    const page = await ctx.newPage();
-
-    const resp = await page.goto(BASE + '/admin/login', { waitUntil: 'networkidle', timeout: 30000 });
-    await page.waitForTimeout(2000);
-    out.steps.loginPage = {
-      status: resp ? resp.status() : null,
-      url: page.url().slice(0, 120),
-      title: String(await page.title()).slice(0, 80)
-    };
-
-    // Inventory inputs & buttons (safe DOM metadata only)
-    out.steps.dom = await page.evaluate(() => {
-      const inputs = Array.from(document.querySelectorAll('input')).map(i => ({
-        type: i.type || i.getAttribute('type'),
-        placeholder: i.placeholder || '',
-        name: i.name || ''
-      }));
-      const buttons = Array.from(document.querySelectorAll('button')).map(b => (b.textContent || '').trim().slice(0, 20));
-      return { inputCount: inputs.length, inputs, buttonTexts: buttons.slice(0, 10) };
-    });
-
-    // Attempt fill + submit
-    const phoneIn = page.locator('input').first();
-    if (await phoneIn.count() > 0) await phoneIn.fill(admin.phone);
-    const pwdIn = page.locator('input[type="password"]').first();
-    if (await pwdIn.count() > 0) await pwdIn.fill(pw);
-    const btn = page.locator('button[type="submit"], .el-button--primary, button:has-text("登录")').first();
-    if (await btn.count() > 0) await btn.click();
-
-    await page.waitForTimeout(4000);
-    out.steps.afterLogin = {
-      url: page.url().slice(0, 120),
-      tokenLen: await page.evaluate(() => (localStorage.getItem('token') || '').length),
-      errorText: await page.evaluate(() => {
-        const el = document.querySelector('.el-message, .el-notification, [class*="error"], .tip, .err');
-        return el ? el.textContent.trim().slice(0, 120) : null;
-      })
-    };
-    await ctx.close();
-  } catch (e) {
-    out.fatal = String(e && e.message ? e.message : e).slice(0, 300);
-  } finally {
-    await browser.close();
-  }
-  fs.writeFileSync(path.join(__dirname, '_e2e_admin_debug.json'), JSON.stringify(out, null, 2));
-  console.log(JSON.stringify(out, null, 2));
-}
-main().then(() => process.exit(0)).catch(e => { console.error(String(e).slice(0,300)); process.exit(1); });

+ 0 - 34
_e2e_admin_debug.json

@@ -1,34 +0,0 @@
-{
-  "base": "http://cfc.iwintrue.com",
-  "steps": {
-    "loginPage": {
-      "status": 200,
-      "url": "http://cfc.iwintrue.com/admin/login",
-      "title": "浠艾福管理后台"
-    },
-    "dom": {
-      "inputCount": 3,
-      "inputs": [
-        {
-          "type": "text",
-          "placeholder": "用户名 / 手机号",
-          "name": ""
-        },
-        {
-          "type": "password",
-          "placeholder": "密码",
-          "name": ""
-        },
-        {
-          "type": "text",
-          "placeholder": "登录身份(输入手机号后自动带出)",
-          "name": ""
-        }
-      ],
-      "buttonTexts": [
-        "登 录"
-      ]
-    }
-  },
-  "fatal": "locator.click: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('button[type=\"submit\"], .el-button--primary, button:has-text(\"登录\")').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" data-v-32926e61=\"\" disabled=\"disabled\" class=\"el-button login-btn el-button--primary is"
-}

+ 0 - 75
_e2e_admin_login2.cjs

@@ -1,75 +0,0 @@
-/**
- * Refined admin-login attempt (temp, not committed). Handles identity
- * auto-select after phone entry and the spaced "登 录" button label.
- */
-const { chromium } = require('@playwright/test');
-const fs = require('fs');
-const path = require('path');
-
-const BASE = process.env.PW_BASE_URL || 'http://cfc.iwintrue.com';
-const MJ = process.env.MACHINE_JSON_PATH;
-
-async function main() {
-  const out = { base: BASE, attempt: 'identity-aware' };
-  let phone = '13800138000', pw = 'admin123';
-  if (MJ && fs.existsSync(MJ)) {
-    try {
-      const cfg = JSON.parse(fs.readFileSync(MJ, 'utf8'));
-      const a = cfg.e2e_test_target && cfg.e2e_test_target.admin;
-      if (a) { if (a.phone) phone = a.phone; if (a.password) pw = a.password; }
-    } catch (e) {}
-  }
-  const launchOpts = { headless: true, args: ['--no-sandbox'] };
-  if (process.env.CHROME_PATH) launchOpts.executablePath = process.env.CHROME_PATH;
-  const browser = await chromium.launch(launchOpts);
-  try {
-    const ctx = await browser.newContext();
-    const page = await ctx.newPage();
-    await page.goto(BASE + '/admin/login', { waitUntil: 'networkidle', timeout: 30000 });
-    await page.waitForTimeout(1500);
-
-    // 1) phone
-    await page.locator('input').first().fill(phone);
-    await page.waitForTimeout(1500);
-
-    // 2) identity auto-select: capture any role/identity pickers that appeared
-    const identityInfo = await page.evaluate(() => {
-      const picks = Array.from(document.querySelectorAll(
-        '[class*="identity"], [class*="role"], .el-radio, .el-radio-group label, [class*="account"]'
-      )).map(e => ({ cls: e.className.toString().slice(0,40), text: (e.textContent||'').trim().slice(0,30) }));
-      return picks.slice(0, 8);
-    });
-    out.identityCandidates = identityInfo;
-    // click first clickable identity/role if present
-    const pick = page.locator('[class*="identity"] li, .el-radio, [class*="role"] label, .el-radio-group label').first();
-    if (await pick.count() > 0) { try { await pick.click({ timeout: 3000 }); } catch (e) {} }
-    await page.waitForTimeout(800);
-
-    // 3) password
-    const pwd = page.locator('input[type="password"]').first();
-    if (await pwd.count() > 0) await pwd.fill(pw);
-
-    // 4) exact spaced button "登 录"
-    const btn = page.locator('button:has-text("登 录")').first();
-    let clicked = false;
-    if (await btn.count() > 0) {
-      try { await btn.click({ timeout: 8000 }); clicked = true; } catch (e) { out.btnClickErr = String(e.message).slice(0,100); }
-    }
-    out.buttonClicked = clicked;
-    await page.waitForTimeout(4000);
-
-    out.after = {
-      url: page.url().slice(0, 120),
-      tokenLen: await page.evaluate(() => (localStorage.getItem('token') || '').length),
-      hasSidebar: await page.locator('.sidebar-container, .el-menu, .el-aside, .el-container').count()
-    };
-    await ctx.close();
-  } catch (e) {
-    out.fatal = String(e && e.message ? e.message : e).slice(0, 300);
-  } finally {
-    await browser.close();
-  }
-  fs.writeFileSync(path.join(__dirname, '_e2e_admin_login2.json'), JSON.stringify(out, null, 2));
-  console.log(JSON.stringify(out, null, 2));
-}
-main().then(() => process.exit(0)).catch(e => { console.error(String(e).slice(0,300)); process.exit(1); });

+ 0 - 33
_e2e_admin_login2.json

@@ -1,33 +0,0 @@
-{
-  "base": "http://cfc.iwintrue.com",
-  "attempt": "identity-aware",
-  "identityCandidates": [
-    {
-      "cls": "role-tags",
-      "text": "家庭客户服务商平台运营"
-    },
-    {
-      "cls": "role-tag role-tag-blue",
-      "text": "家庭客户"
-    },
-    {
-      "cls": "role-tag role-tag-pink",
-      "text": "服务商"
-    },
-    {
-      "cls": "role-tag role-tag-green",
-      "text": "平台运营"
-    },
-    {
-      "cls": "el-select identity-select el-select--lar",
-      "text": "超级管理员"
-    }
-  ],
-  "btnClickErr": "locator.click: Timeout 8000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('button:has-text(\"登 录\"",
-  "buttonClicked": false,
-  "after": {
-    "url": "http://cfc.iwintrue.com/admin/login",
-    "tokenLen": 0,
-    "hasSidebar": 0
-  }
-}

+ 0 - 79
_e2e_internal_probe.cjs

@@ -1,79 +0,0 @@
-/**
- * Temporary internal E2E probe (NOT committed; test-closure artifact only).
- * Reuses tests/e2e/helpers/auth.js loginAs for admin, then verifies the
- * authenticated /admin dashboard and the /frontend SPA render.
- * Credentials are injected from local machine.json via MACHINE_JSON_PATH;
- * nothing sensitive is printed.
- */
-const { chromium } = require('@playwright/test');
-const path = require('path');
-
-const BASE = process.env.PW_BASE_URL || 'http://cfc.iwintrue.com';
-const MACHINE_JSON = process.env.MACHINE_JSON_PATH;
-
-async function main() {
-  const summary = { base: BASE, steps: {}, env: { machineJsonSet: !!MACHINE_JSON } };
-  const launchOpts = { headless: true, args: ['--no-sandbox'] };
-  if (process.env.CHROME_PATH) launchOpts.executablePath = process.env.CHROME_PATH;
-  const browser = await chromium.launch(launchOpts);
-  try {
-    const auth = require(path.join(__dirname, 'tests', 'e2e', 'helpers', 'auth'));
-    // loginAs reads MACHINE_JSON_PATH at require time (already set via env).
-
-    // 1) Admin login
-    const adminAuth = await auth.loginAs(browser, 'admin');
-    summary.steps.adminLogin = {
-      ok: !!(adminAuth && adminAuth.token),
-      tokenLen: adminAuth && adminAuth.token ? adminAuth.token.length : 0,
-      error: adminAuth && adminAuth.error ? String(adminAuth.error).slice(0, 120) : null
-    };
-
-    // 2) Authenticated /admin dashboard
-    if (adminAuth && adminAuth.token) {
-      const ctx = await browser.newContext();
-      await ctx.addInitScript((t) => {
-        try { localStorage.setItem('token', t); localStorage.setItem('access_token', t); } catch (e) {}
-      }, adminAuth.token);
-      const page = await ctx.newPage();
-      const resp = await page.goto(BASE + '/admin', { waitUntil: 'domcontentloaded', timeout: 30000 });
-      await page.waitForTimeout(2500);
-      const title = await page.title();
-      const hasSidebar = await page.locator('.sidebar-container, .el-menu, .el-aside, .el-container').count();
-      summary.steps.adminDashboard = {
-        ok: resp ? resp.status() < 500 : false,
-        status: resp ? resp.status() : null,
-        title: String(title).slice(0, 80),
-        hasSidebar: hasSidebar > 0,
-        url: page.url().slice(0, 100)
-      };
-      await ctx.close();
-    } else {
-      summary.steps.adminDashboard = { ok: false, note: 'skipped: no admin token' };
-    }
-
-    // 3) /frontend SPA
-    const fctx = await browser.newContext();
-    const fpage = await fctx.newPage();
-    const fresp = await fpage.goto(BASE + '/frontend', { waitUntil: 'domcontentloaded', timeout: 30000 });
-    await fpage.waitForTimeout(2500);
-    const ftitle = await fpage.title();
-    const fbody = (await fpage.content()).length;
-    summary.steps.frontend = {
-      ok: fresp ? fresp.status() < 500 : false,
-      status: fresp ? fresp.status() : null,
-      title: String(ftitle).slice(0, 80),
-      bodyLen: fbody,
-      url: fpage.url().slice(0, 100)
-    };
-    await fctx.close();
-  } catch (e) {
-    summary.fatal = String(e && e.message ? e.message : e).slice(0, 300);
-  } finally {
-    await browser.close();
-  }
-  require('fs').writeFileSync(path.join(__dirname, '_e2e_probe_result.json'),
-    JSON.stringify(summary, null, 2));
-  console.log(JSON.stringify(summary, null, 2));
-}
-
-main().then(() => process.exit(0)).catch((e) => { console.error(String(e).slice(0,300)); process.exit(1); });

+ 0 - 16
_e2e_probe_1944.cjs

@@ -1,16 +0,0 @@
-const { chromium } = require('playwright');
-const EXE = 'C:/Users/iwt/AppData/Local/ms-playwright/chromium-1234/chrome-win64/chrome.exe';
-(async () => {
-  const browser = await chromium.launch({ executablePath: EXE, headless: true });
-  const page = await browser.newPage();
-  try {
-    const r = await page.goto('http://cfc.iwintrue.com/frontend', { waitUntil:'load', timeout:30000 });
-    console.log('FRONTEND status=', r?r.status():'no-resp', 'finalUrl=', page.url(), 'title=', JSON.stringify(await page.title()));
-  } catch(e){ console.log('FRONTEND ERR', e.message); }
-  try {
-    const r2 = await page.goto('http://cfc.iwintrue.com/admin', { waitUntil:'load', timeout:30000 });
-    console.log('ADMIN status=', r2?r2.status():'no-resp', 'finalUrl=', page.url(), 'title=', JSON.stringify(await page.title()));
-  } catch(e){ console.log('ADMIN ERR', e.message); }
-  await browser.close();
-  console.log('PROBE_DONE');
-})();

+ 0 - 24
_e2e_probe_result.json

@@ -1,24 +0,0 @@
-{
-  "base": "http://cfc.iwintrue.com",
-  "steps": {
-    "adminLogin": {
-      "ok": false,
-      "tokenLen": 0,
-      "error": null
-    },
-    "adminDashboard": {
-      "ok": false,
-      "note": "skipped: no admin token"
-    },
-    "frontend": {
-      "ok": true,
-      "status": 200,
-      "title": "首页",
-      "bodyLen": 236657,
-      "url": "http://cfc.iwintrue.com/frontend/#/pages/index-home/index"
-    }
-  },
-  "env": {
-    "machineJsonSet": true
-  }
-}

+ 0 - 293
_r0243_agg.json

@@ -1,293 +0,0 @@
-{
- "source_test_classes": 220,
- "reported_classes": 220,
- "tests": 1700,
- "passed": 1572,
- "failures": 71,
- "errors": 53,
- "skipped": 4,
- "pass_rate": 92.47,
- "red_classes": 39,
- "red_cases": 124,
- "env_red_cases": 8,
- "nonenv_red_cases": 116,
- "pass_rate_ex_env": 92.94,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "TaskControllerReviewTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 17
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "KnowledgeBaseBackfillTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 220,
- "txt_only_classes": 0
-}

+ 0 - 756
_r0243_attr.json

@@ -1,756 +0,0 @@
-{
- "C-环境": [
-  {
-   "cls": "AdminFamilyOverviewControllerTest",
-   "case": "tasks_分页",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "AdminFamilyOverviewControllerTest",
-   "case": "overview_成功",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "AdminFamilyOverviewControllerTest",
-   "case": "overview_非admin拒绝",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "FamilyAdminOverviewServiceTest",
-   "case": "overview_计数与明细",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "FamilyAdminOverviewServiceTest",
-   "case": "overview_家庭不存在",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "FamilyAdminOverviewServiceTest",
-   "case": "pageTasks_分页",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "UserServiceFamilyNameLinkTest",
-   "case": "realName变化_联动家庭名",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  },
-  {
-   "cls": "UserServiceFamilyNameLinkTest",
-   "case": "realName未变_不改家庭名",
-   "type": "error",
-   "msg": "Failed to load ApplicationContext"
-  }
- ],
- "C-闸门/数据": [
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrders_NullParams",
-   "type": "failure",
-   "msg": "expected: not <null>"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrderStats_WithData",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrderDetail_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <403>"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrderDetail_MissingId",
-   "type": "failure",
-   "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrderDetail_WrongGuide",
-   "type": "failure",
-   "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrders_WithStatusFilter",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrderDetail_NotFound",
-   "type": "failure",
-   "msg": "expected: <订单不存在> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-  },
-  {
-   "cls": "GuideOrderControllerTest",
-   "case": "getOrders_WithPagination",
-   "type": "failure",
-   "msg": "expected: <200> but was: <403>"
-  },
-  {
-   "cls": "GuideRolePermissionTest",
-   "case": "orderDetail_OwnerCanView",
-   "type": "failure",
-   "msg": "expected: <200> but was: <403>"
-  },
-  {
-   "cls": "GuideRolePermissionTest",
-   "case": "orderDetail_MissingId",
-   "type": "failure",
-   "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-  },
-  {
-   "cls": "GuideRolePermissionTest",
-   "case": "orderDetail_NotOwnerDenied",
-   "type": "failure",
-   "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-  },
-  {
-   "cls": "PlannerBindInviteFlowTest",
-   "case": "parentConfirmsBind_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <403>"
-  },
-  {
-   "cls": "PlannerBindInviteFlowTest",
-   "case": "guideViewsBoundFamilies_Success",
-   "type": "failure",
-   "msg": "expected: not <null>"
-  },
-  {
-   "cls": "PlannerBindInviteFlowTest",
-   "case": "parentBindsSameGuideTwice_Fails",
-   "type": "failure",
-   "msg": "expected: <400> but was: <403>"
-  },
-  {
-   "cls": "PlannerBindInviteFlowTest",
-   "case": "completeInviteBindFlow_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <403>"
-  }
- ],
- "A-测试装置/断言": [
-  {
-   "cls": "ArticleControllerTest",
-   "case": "list_ByCategory",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "recordRead_NoDuration",
-   "type": "error",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "featured_Success",
-   "type": "failure",
-   "msg": "expected: <2> but was: <0>"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "list_LoggedInUser",
-   "type": "failure",
-   "msg": "expected: not <null>"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "list_Success",
-   "type": "failure",
-   "msg": "expected: not <null>"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "recordRead_WithMemberId",
-   "type": "error",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "featured_DefaultSize",
-   "type": "failure",
-   "msg": "expected: <1> but was: <0>"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "list_ByKeyword",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ArticleControllerTest",
-   "case": "recordRead_Success",
-   "type": "error",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
-  },
-  {
-   "cls": "AuthControllerTest",
-   "case": "autoLogin_UserNotFound",
-   "type": "failure",
-   "msg": "expected: <500> but was: <410>"
-  },
-  {
-   "cls": "AuthControllerTest",
-   "case": "switchRole_NotLoggedIn",
-   "type": "failure",
-   "msg": "expected: <500> but was: <401>"
-  },
-  {
-   "cls": "AuthControllerTest",
-   "case": "autoLogin_NoOpenid",
-   "type": "failure",
-   "msg": "expected: <500> but was: <410>"
-  },
-  {
-   "cls": "GuideFamilyTaskControllerTest",
-   "case": "getFamilyTaskOverview_WithChildren",
-   "type": "failure",
-   "msg": "expected: <1> but was: <null>"
-  },
-  {
-   "cls": "GuideFamilyTaskControllerTest",
-   "case": "getPendingReviewTasks_Success",
-   "type": "failure",
-   "msg": "expected: <1> but was: <0>"
-  },
-  {
-   "cls": "GuideFamilyTaskControllerTest",
-   "case": "reviewTask_Success",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GuideFamilyTaskControllerTest",
-   "case": "batchReviewTasks_Success",
-   "type": "failure",
-   "msg": "expected: <3> but was: <0>"
-  },
-  {
-   "cls": "GuideFamilyTaskControllerTest",
-   "case": "getChildTasks_WithPagination",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GuideRolePermissionTest",
-   "case": "reviewTask_TeacherAllowed",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GuideRolePermissionTest",
-   "case": "batchReview_TeacherAllowed",
-   "type": "failure",
-   "msg": "expected: <2> but was: <0>"
-  },
-  {
-   "cls": "HealthDimensionControllerTest",
-   "case": "history_missingMemberId",
-   "type": "failure",
-   "msg": "expected: <500> but was: <200>"
-  },
-  {
-   "cls": "HealthDimensionControllerTest",
-   "case": "overview_missingMemberId",
-   "type": "failure",
-   "msg": "expected: <500> but was: <200>"
-  },
-  {
-   "cls": "ProductControllerTest",
-   "case": "shelve_PublishSuccess",
-   "type": "error",
-   "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_PublishSucce"
-  },
-  {
-   "cls": "ProductControllerTest",
-   "case": "shelve_NotOwner",
-   "type": "error",
-   "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_NotOwner(Pro"
-  },
-  {
-   "cls": "ProductControllerTest",
-   "case": "shelve_UnshelveSuccess",
-   "type": "error",
-   "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_UnshelveSucc"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "confirm_Success",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "myOrders_FilterByStatus",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "myOrders_AllStatus",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "confirm_NotFound",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "myOrders_Empty",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderControllerTest",
-   "case": "confirm_NotYetShipped",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "StatsControllerTest",
-   "case": "familyCompletion_NoFamily",
-   "type": "failure",
-   "msg": "expected: <500> but was: <5001>"
-  },
-  {
-   "cls": "TaskControllerReviewTest",
-   "case": "pendingReview_directCall_uniformResultShape",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "TaskControllerReviewTest",
-   "case": "pendingReview_parent_success_returnsList",
-   "type": "error",
-   "msg": "Request processing failed; nested exception is java.lang.NullPointerException"
-  },
-  {
-   "cls": "WishControllerTest",
-   "case": "getWishes_MissingCondition",
-   "type": "failure",
-   "msg": "expected: <请指定查询条件(childId或familyId)> but was: <请指定查询条件(memberId或familyId)>"
-  },
-  {
-   "cls": "WishControllerTest",
-   "case": "getPendingWishes_NoFamilyId",
-   "type": "failure",
-   "msg": "expected: <500> but was: <5001>"
-  },
-  {
-   "cls": "DailyCheckinStreakFlowTest",
-   "case": "childDeletesCheckin_Success",
-   "type": "error",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
-  },
-  {
-   "cls": "GrowthRecordSyncFlowTest",
-   "case": "parentUploadsHealthReport_Success",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "GrowthRecordSyncFlowTest",
-   "case": "parentCreatesRecordWithOrder_Success",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "PlannerBindInviteFlowTest",
-   "case": "parentUnbindsGuide_Success",
-   "type": "error",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
-  },
-  {
-   "cls": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_pending",
-   "type": "failure",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-  },
-  {
-   "cls": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_draft",
-   "type": "failure",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-  },
-  {
-   "cls": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_published",
-   "type": "failure",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-  },
-  {
-   "cls": "FamilyJoinRequestServiceReferrerBindTest",
-   "case": "approve_inviterWithoutReferrer_doesNotBind",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "FamilyJoinRequestServiceReferrerBindTest",
-   "case": "approve_tokenPath_userWithReferrer_doesNotRebind",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "FamilyJoinRequestServiceReferrerBindTest",
-   "case": "approve_tokenPath_newUserWithoutReferrer_bindsInviterReferrer",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "FamilyJoinRequestServiceReferrerBindTest",
-   "case": "approve_shortCodePath_noInviter_doesNotBind",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "FortuneServiceTest",
-   "case": "testCalculateLuckyDirection",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "FortuneServiceTest",
-   "case": "testGenerateIsDeterministic",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "resolveShipType_deliveryMethod3_requiresExplicitShipType",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "ship_local_syncsWechatWithLogisticsType2",
-   "type": "error",
-   "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "ship_express_requiresTrackingAndCompany",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "ship_selfPickup_syncsWechatWithLogisticsType4",
-   "type": "error",
-   "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "ship_virtual_rejectsManualShipAndIdempotent",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-   "case": "autoShipVirtualOrder_onPaySuccess",
-   "type": "error",
-   "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
-  },
-  {
-   "cls": "ProductOrderServiceUpdateExpressFieldTest",
-   "case": "updateExpress_fullUpdate_writesLogisticsColumnsAndSyncsWechat",
-   "type": "failure",
-   "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    \"YT9876543210\",\n    \"圆通速递\",\n    "
-  },
-  {
-   "cls": "ProductOrderServiceUpdateExpressFieldTest",
-   "case": "ship_writesLogisticsColumns",
-   "type": "failure",
-   "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    \"JD0000000001\",\n    \"京东物流\",\n    "
-  },
-  {
-   "cls": "ProductOrderServiceUpdateExpressFieldTest",
-   "case": "updateExpress_onlyCompany_trackingFallsBackToPersistedLogisticsNo",
-   "type": "failure",
-   "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    <Capturing argument>,\n    \"中通快递\""
-  },
-  {
-   "cls": "ServiceRoleApproveTest",
-   "case": "planner_已有同手机号admin则更新不重复插入",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "ServiceRoleApproveTest",
-   "case": "planner_通过后写teacher_status并创建admins记录",
-   "type": "error",
-   "msg": "java.lang.NullPointerException"
-  },
-  {
-   "cls": "AuthControllerTest",
-   "case": "autoLogin_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <410>"
-  },
-  {
-   "cls": "KnowledgeBaseBackfillTest",
-   "case": "saveWithAssociations_emptyAssociations_autoBindsMatchedTagAndDimension",
-   "type": "error",
-   "msg": "productDimensionConfigMapper"
-  },
-  {
-   "cls": "KnowledgeBaseBackfillTest",
-   "case": "getWithAssociations_returnsFlatContentAndAssociationFields",
-   "type": "error",
-   "msg": "productDimensionConfigMapper"
-  },
-  {
-   "cls": "TaskProgressUpdateTest",
-   "case": "updateProgress_withoutFamilyMemberId_fallsBackToUserIdLookup",
-   "type": "error",
-   "msg": "platformPointsService"
-  },
-  {
-   "cls": "TaskProgressUpdateTest",
-   "case": "updateProgress_noDeadlineTask_awardsBasePointsInsteadOfPenalty",
-   "type": "error",
-   "msg": "platformPointsService"
-  },
-  {
-   "cls": "TaskProgressUpdateTest",
-   "case": "updateProgress_withExplicitFamilyMemberId_doesNotFallbackToUserIdLookup",
-   "type": "error",
-   "msg": "platformPointsService"
-  }
- ],
- "B-生产缺陷": [
-  {
-   "cls": "FamilyControllerTest",
-   "case": "guideBindFamily_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <500>"
-  },
-  {
-   "cls": "PaymentControllerTest",
-   "case": "handleWechatCallback_Success",
-   "type": "failure",
-   "msg": "expected: <true> but was: <false>"
-  },
-  {
-   "cls": "PaymentControllerTest",
-   "case": "handleAlipayCallback_Success",
-   "type": "failure",
-   "msg": "expected: <true> but was: <false>"
-  },
-  {
-   "cls": "PaymentControllerTest",
-   "case": "createWechatPayOrder_ReturnMapNotNull",
-   "type": "failure",
-   "msg": "expected: not <null>"
-  },
-  {
-   "cls": "PaymentControllerTest",
-   "case": "createWechatPayOrder_Success",
-   "type": "failure",
-   "msg": "expected: <ORD20260622001> but was: <null>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "parentQueriesEnergyLogs_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <500>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "childExchangesWishWithEnergy_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <500>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "childExchangesWithInsufficientEnergy_Fails",
-   "type": "failure",
-   "msg": "expected: <true> but was: <false>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "userWithoutFamily_Fails",
-   "type": "failure",
-   "msg": "expected: <500> but was: <5001>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "parentGetsEnergyOverview_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <500>"
-  },
-  {
-   "cls": "EnergySystemFlowTest",
-   "case": "taskCompletionGrantsEnergy_Success",
-   "type": "failure",
-   "msg": "expected: <200> but was: <500>"
-  },
-  {
-   "cls": "GuideModuleIntegrationTest",
-   "case": "testGuidePackageCreationFlow",
-   "type": "error",
-   "msg": "### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platf"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_F03a发放_自动创建感恩记录",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\noctopusEffectRecordMapper.insert(<any>);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1020L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionSe"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_商品订单实付与分润基数分离",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_档位比例超规则上限_按上限封顶",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_落P点消费日志_基数与订单对应",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\nppointConsumptionLogMapper.insert(\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettl"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_最多两级_第三级引荐人不发放",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionSe"
-  },
-  {
-   "cls": "CfCommissionServiceSettleTest",
-   "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
-   "type": "failure",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    <any long>,\n    <any string>,\n    <any long>,\n    <any>\n);\n-> at com.etotem.cfc.ser"
-  },
-  {
-   "cls": "DanReportParseServiceTest",
-   "case": "testParseA2_standardCoreLiteracyFormat",
-   "type": "failure",
-   "msg": "expected: <俊辰> but was: <null>"
-  },
-  {
-   "cls": "DanReportParseServiceTest",
-   "case": "testParseB4_regression",
-   "type": "failure",
-   "msg": "B4 解析应正常 ==> expected: <false> but was: <true>"
-  },
-  {
-   "cls": "DanReportParseServiceTest",
-   "case": "testParseA1_shouldFallbackToGenericPattern",
-   "type": "failure",
-   "msg": "应通过fallback提取感知觉百分位 ==> expected: not <null>"
-  },
-  {
-   "cls": "DanReportParseServiceTest",
-   "case": "testParseA1_shouldExtractCognitiveDimensionFromDetailPage",
-   "type": "failure",
-   "msg": "应有processingSpeed_score ==> expected: not <null>"
-  },
-  {
-   "cls": "PaymentServiceORDRoutingTest",
-   "case": "unknownPrefix_routesToHandlePaymentCallback",
-   "type": "failure",
-   "msg": "expected: <SUCCESS> but was: <FAIL>"
-  }
- ],
- "待核实": [
-  {
-   "cls": "GuideTeamControllerTest",
-   "case": "testGetTeamStats_NoInviteCode",
-   "type": "failure",
-   "msg": "expected: <0> but was: <null>"
-  },
-  {
-   "cls": "GuideTeamControllerTest",
-   "case": "testGetTeamStats_WithMembers",
-   "type": "failure",
-   "msg": "expected: <3> but was: <null>"
-  },
-  {
-   "cls": "MindFortuneControllerTest",
-   "case": "testGetTodayFortuneWithoutAuth",
-   "type": "failure",
-   "msg": "JSON path \"$.code\" expected:<401> but was:<400>"
-  },
-  {
-   "cls": "DimensionRegistryMapContractTest",
-   "case": "map_unknownLegacy_returnsNullData",
-   "type": "failure",
-   "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"unknown_legacy_xyz\""
-  },
-  {
-   "cls": "DimensionRegistryMapContractTest",
-   "case": "map_emptyLegacy_returnsNullData",
-   "type": "failure",
-   "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"\""
-  },
-  {
-   "cls": "DimensionRegistryMapContractTest",
-   "case": "map_missingLegacy_returnsBadRequest",
-   "type": "failure",
-   "msg": "Status expected:<400> but was:<200>"
-  },
-  {
-   "cls": "GrowthRecordSyncFlowTest",
-   "case": "parentCreatesRecordWithoutChild_Fails",
-   "type": "failure",
-   "msg": "expected: <true> but was: <false>"
-  },
-  {
-   "cls": "OrchestrationEngineTest",
-   "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
-   "type": "failure",
-   "msg": "expected: \"manual_fail\"\n but was: null"
-  },
-  {
-   "cls": "OrchestrationIntegrationTest",
-   "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
-   "type": "failure",
-   "msg": "Expecting actual:\n  \"failed\"\nto be in:\n  [\"in_progress\", \"pending\"]"
-  },
-  {
-   "cls": "MembershipPaySwitchTest",
-   "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
-   "type": "failure",
-   "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD17939069004190058B72, payType=wechat, wechatPayParams={}, groupNo=nu"
-  },
-  {
-   "cls": "TaskPlanServiceTest",
-   "case": "applyAndActivate_无active实例时新建并置active",
-   "type": "failure",
-   "msg": "expected: <100> but was: <null>"
-  }
- ]
-}

+ 0 - 746
_r0243_reds.json

@@ -1,746 +0,0 @@
-[
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_ByCategory",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_NoDuration",
-  "type": "error",
-  "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "featured_Success",
-  "type": "failure",
-  "msg": "expected: <2> but was: <0>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_LoggedInUser",
-  "type": "failure",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_Success",
-  "type": "failure",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_WithMemberId",
-  "type": "error",
-  "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "featured_DefaultSize",
-  "type": "failure",
-  "msg": "expected: <1> but was: <0>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_ByKeyword",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_Success",
-  "type": "error",
-  "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_UserNotFound",
-  "type": "failure",
-  "msg": "expected: <500> but was: <410>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "switchRole_NotLoggedIn",
-  "type": "failure",
-  "msg": "expected: <500> but was: <401>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <410>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_NoOpenid",
-  "type": "failure",
-  "msg": "expected: <500> but was: <410>"
- },
- {
-  "cls": "FamilyControllerTest",
-  "case": "guideBindFamily_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getFamilyTaskOverview_WithChildren",
-  "type": "failure",
-  "msg": "expected: <1> but was: <null>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getPendingReviewTasks_Success",
-  "type": "failure",
-  "msg": "expected: <1> but was: <0>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "reviewTask_Success",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "batchReviewTasks_Success",
-  "type": "failure",
-  "msg": "expected: <3> but was: <0>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getChildTasks_WithPagination",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_NullParams",
-  "type": "failure",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderStats_WithData",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_MissingId",
-  "type": "failure",
-  "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_WrongGuide",
-  "type": "failure",
-  "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_WithStatusFilter",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_NotFound",
-  "type": "failure",
-  "msg": "expected: <订单不存在> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_WithPagination",
-  "type": "failure",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_OwnerCanView",
-  "type": "failure",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_MissingId",
-  "type": "failure",
-  "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "reviewTask_TeacherAllowed",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "batchReview_TeacherAllowed",
-  "type": "failure",
-  "msg": "expected: <2> but was: <0>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_NotOwnerDenied",
-  "type": "failure",
-  "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideTeamControllerTest",
-  "case": "testGetTeamStats_NoInviteCode",
-  "type": "failure",
-  "msg": "expected: <0> but was: <null>"
- },
- {
-  "cls": "GuideTeamControllerTest",
-  "case": "testGetTeamStats_WithMembers",
-  "type": "failure",
-  "msg": "expected: <3> but was: <null>"
- },
- {
-  "cls": "HealthDimensionControllerTest",
-  "case": "history_missingMemberId",
-  "type": "failure",
-  "msg": "expected: <500> but was: <200>"
- },
- {
-  "cls": "HealthDimensionControllerTest",
-  "case": "overview_missingMemberId",
-  "type": "failure",
-  "msg": "expected: <500> but was: <200>"
- },
- {
-  "cls": "MindFortuneControllerTest",
-  "case": "testGetTodayFortuneWithoutAuth",
-  "type": "failure",
-  "msg": "JSON path \"$.code\" expected:<401> but was:<400>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "handleWechatCallback_Success",
-  "type": "failure",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "handleAlipayCallback_Success",
-  "type": "failure",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "createWechatPayOrder_ReturnMapNotNull",
-  "type": "failure",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "createWechatPayOrder_Success",
-  "type": "failure",
-  "msg": "expected: <ORD20260622001> but was: <null>"
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_PublishSuccess",
-  "type": "error",
-  "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_PublishSucce"
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_NotOwner",
-  "type": "error",
-  "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_NotOwner(Pro"
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_UnshelveSuccess",
-  "type": "error",
-  "msg": "Invalid use of argument matchers!\n3 matchers expected, 1 recorded:\n-> at com.etotem.cfc.controller.ProductControllerTest.shelve_UnshelveSucc"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_Success",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_FilterByStatus",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_AllStatus",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_NotFound",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_Empty",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_NotYetShipped",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "StatsControllerTest",
-  "case": "familyCompletion_NoFamily",
-  "type": "failure",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "TaskControllerReviewTest",
-  "case": "pendingReview_directCall_uniformResultShape",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "TaskControllerReviewTest",
-  "case": "pendingReview_parent_success_returnsList",
-  "type": "error",
-  "msg": "Request processing failed; nested exception is java.lang.NullPointerException"
- },
- {
-  "cls": "WishControllerTest",
-  "case": "getWishes_MissingCondition",
-  "type": "failure",
-  "msg": "expected: <请指定查询条件(childId或familyId)> but was: <请指定查询条件(memberId或familyId)>"
- },
- {
-  "cls": "WishControllerTest",
-  "case": "getPendingWishes_NoFamilyId",
-  "type": "failure",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "tasks_分页",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "overview_成功",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "overview_非admin拒绝",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_unknownLegacy_returnsNullData",
-  "type": "failure",
-  "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"unknown_legacy_xyz\""
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_emptyLegacy_returnsNullData",
-  "type": "failure",
-  "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"\""
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_missingLegacy_returnsBadRequest",
-  "type": "failure",
-  "msg": "Status expected:<400> but was:<200>"
- },
- {
-  "cls": "DailyCheckinStreakFlowTest",
-  "case": "childDeletesCheckin_Success",
-  "type": "error",
-  "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "parentQueriesEnergyLogs_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "childExchangesWishWithEnergy_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "childExchangesWithInsufficientEnergy_Fails",
-  "type": "failure",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "userWithoutFamily_Fails",
-  "type": "failure",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "parentGetsEnergyOverview_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "taskCompletionGrantsEnergy_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentUploadsHealthReport_Success",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentCreatesRecordWithoutChild_Fails",
-  "type": "failure",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentCreatesRecordWithOrder_Success",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "GuideModuleIntegrationTest",
-  "case": "testGuidePackageCreationFlow",
-  "type": "error",
-  "msg": "### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platf"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentConfirmsBind_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "guideViewsBoundFamilies_Success",
-  "type": "failure",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentBindsSameGuideTwice_Fails",
-  "type": "failure",
-  "msg": "expected: <400> but was: <403>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentUnbindsGuide_Success",
-  "type": "error",
-  "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(moc"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "completeInviteBindFlow_Success",
-  "type": "failure",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "OrchestrationEngineTest",
-  "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
-  "type": "failure",
-  "msg": "expected: \"manual_fail\"\n but was: null"
- },
- {
-  "cls": "OrchestrationIntegrationTest",
-  "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
-  "type": "failure",
-  "msg": "Expecting actual:\n  \"failed\"\nto be in:\n  [\"in_progress\", \"pending\"]"
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_pending",
-  "type": "failure",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_draft",
-  "type": "failure",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_published",
-  "type": "failure",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_F03a发放_自动创建感恩记录",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\noctopusEffectRecordMapper.insert(<any>);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1020L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionSe"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_商品订单实付与分润基数分离",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_档位比例超规则上限_按上限封顶",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_落P点消费日志_基数与订单对应",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\nppointConsumptionLogMapper.insert(\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettl"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_最多两级_第三级引荐人不发放",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionSe"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
-  "type": "failure",
-  "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    <any long>,\n    <any string>,\n    <any long>,\n    <any>\n);\n-> at com.etotem.cfc.ser"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA2_standardCoreLiteracyFormat",
-  "type": "failure",
-  "msg": "expected: <俊辰> but was: <null>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseB4_regression",
-  "type": "failure",
-  "msg": "B4 解析应正常 ==> expected: <false> but was: <true>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA1_shouldFallbackToGenericPattern",
-  "type": "failure",
-  "msg": "应通过fallback提取感知觉百分位 ==> expected: not <null>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA1_shouldExtractCognitiveDimensionFromDetailPage",
-  "type": "failure",
-  "msg": "应有processingSpeed_score ==> expected: not <null>"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "overview_计数与明细",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "overview_家庭不存在",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "pageTasks_分页",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_inviterWithoutReferrer_doesNotBind",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_tokenPath_userWithReferrer_doesNotRebind",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_tokenPath_newUserWithoutReferrer_bindsInviterReferrer",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_shortCodePath_noInviter_doesNotBind",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "FortuneServiceTest",
-  "case": "testCalculateLuckyDirection",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "FortuneServiceTest",
-  "case": "testGenerateIsDeterministic",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "MembershipPaySwitchTest",
-  "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
-  "type": "failure",
-  "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD17939069004190058B72, payType=wechat, wechatPayParams={}, groupNo=nu"
- },
- {
-  "cls": "PaymentServiceORDRoutingTest",
-  "case": "unknownPrefix_routesToHandlePaymentCallback",
-  "type": "failure",
-  "msg": "expected: <SUCCESS> but was: <FAIL>"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "resolveShipType_deliveryMethod3_requiresExplicitShipType",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_local_syncsWechatWithLogisticsType2",
-  "type": "error",
-  "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_express_requiresTrackingAndCompany",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_selfPickup_syncsWechatWithLogisticsType4",
-  "type": "error",
-  "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_virtual_rejectsManualShipAndIdempotent",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "autoShipVirtualOrder_onPaySuccess",
-  "type": "error",
-  "msg": "Misplaced or misused argument matcher detected here:\n\n-> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWith"
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "updateExpress_fullUpdate_writesLogisticsColumnsAndSyncsWechat",
-  "type": "failure",
-  "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    \"YT9876543210\",\n    \"圆通速递\",\n    "
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "ship_writesLogisticsColumns",
-  "type": "failure",
-  "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    \"JD0000000001\",\n    \"京东物流\",\n    "
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "updateExpress_onlyCompany_trackingFallsBackToPersistedLogisticsNo",
-  "type": "failure",
-  "msg": "Argument(s) are different! Wanted:\nwechatService.uploadShippingInfo(\n    \"O20261018001\",\n    \"oABC123\",\n    <Capturing argument>,\n    \"中通快递\""
- },
- {
-  "cls": "UserServiceFamilyNameLinkTest",
-  "case": "realName变化_联动家庭名",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "UserServiceFamilyNameLinkTest",
-  "case": "realName未变_不改家庭名",
-  "type": "error",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "KnowledgeBaseBackfillTest",
-  "case": "saveWithAssociations_emptyAssociations_autoBindsMatchedTagAndDimension",
-  "type": "error",
-  "msg": "productDimensionConfigMapper"
- },
- {
-  "cls": "KnowledgeBaseBackfillTest",
-  "case": "getWithAssociations_returnsFlatContentAndAssociationFields",
-  "type": "error",
-  "msg": "productDimensionConfigMapper"
- },
- {
-  "cls": "ServiceRoleApproveTest",
-  "case": "planner_已有同手机号admin则更新不重复插入",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "ServiceRoleApproveTest",
-  "case": "planner_通过后写teacher_status并创建admins记录",
-  "type": "error",
-  "msg": "java.lang.NullPointerException"
- },
- {
-  "cls": "TaskPlanServiceTest",
-  "case": "applyAndActivate_无active实例时新建并置active",
-  "type": "failure",
-  "msg": "expected: <100> but was: <null>"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_withoutFamilyMemberId_fallsBackToUserIdLookup",
-  "type": "error",
-  "msg": "platformPointsService"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_noDeadlineTask_awardsBasePointsInsteadOfPenalty",
-  "type": "error",
-  "msg": "platformPointsService"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_withExplicitFamilyMemberId_doesNotFallbackToUserIdLookup",
-  "type": "error",
-  "msg": "platformPointsService"
- }
-]

+ 0 - 62
_r189_189_admin.cjs

@@ -1,62 +0,0 @@
-// R162: 189 admin-live UI E2E kick/read(String.raw 保反斜杠路径,修复 Location not found)
-const BASE = process.env.BASE_189 || 'http://192.168.16.189:4090';
-const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
-const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
-const CWD = String.raw`C:\code\cfc`;
-const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(CWD);
-const LOG = String.raw`C:\code\cfc\_r189_admin-live_test.log`;
-const SLEEP = ms => new Promise(r => setTimeout(r, ms));
-
-function buildKickCmd() {
-  return [
-    'cd ' + CWD,
-    'if (Test-Path ' + LOG + ') { Remove-Item ' + LOG + ' -Force }',
-    `Start-Process -FilePath cmd.exe -ArgumentList '/c','cd /d ${CWD}\\tests && set PLAYWRIGHT_HTML_REPORT=false && npx playwright test -c playwright.config.live.js --project=admin-desktop --reporter=line > ${LOG} 2>&1' -WindowStyle Hidden -PassThru | Select-Object Id`,
-    'start-sleep -Seconds 3',
-    'echo KICKED'
-  ].join('; ');
-}
-function buildReadCmd() {
-  return [
-    'echo READ_BEGIN',
-    'if (Test-Path ' + LOG + ') { Get-Content ' + LOG + ' -Tail 200 }',
-    'if (Test-Path ' + LOG + '.err) { echo ERR_BEGIN; Get-Content ' + LOG + '.err -Tail 30 }',
-    'echo READ_END'
-  ].join('; ');
-}
-async function j(url, opt) {
-  try {
-    const r = await fetch(url, Object.assign({ headers: H }, opt));
-    const t = await r.text();
-    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
-  } catch (e) { return { status: 0, err: e.message }; }
-}
-async function openShell(cmd, capMs = 30000) {
-  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: CWD }) });
-  const cj = (cr.json) || {};
-  const id = (cj.data && cj.data.id) || cj.id;
-  if (!id) return { err: 'create failed ' + cr.status + ' ' + JSON.stringify(cj).slice(0, 200), id: null };
-  const t0 = Date.now();
-  while (Date.now() - t0 < capMs) {
-    await SLEEP(2000);
-    const s = await j(BASE + '/api/shell/' + id + LOC);
-    const d = (s.json && s.json.data) || null;
-    if (d && d.status && d.status !== 'running') return { id, status: d.status };
-    if (!d) continue;
-  }
-  return { id, status: 'timeout' };
-}
-(async () => {
-  const mode = process.argv[2] || 'kick';
-  if (mode === 'kick') {
-    const k = await openShell(buildKickCmd(), 30000);
-    console.log('KICK', k.err || ('id=' + k.id + ' status=' + k.status));
-    return;
-  }
-  const r = await openShell(buildReadCmd(), 30000);
-  if (r.err) { console.log('READ_ERR', r.err); process.exit(1); }
-  const o = await j(BASE + '/api/shell/' + r.id + '/output' + LOC + '&limit=200000');
-  console.log('OUT_BEGIN');
-  console.log((o.json && o.json.data && o.json.data.output) || '(empty)');
-  console.log('OUT_END');
-})().catch(e => { console.error('ERR', e.message); process.exit(1); });

+ 0 - 62
_r189_251_lg.cjs

@@ -1,62 +0,0 @@
-// R150 251 langgraph 派发器:kick(分离启动)+ read(单次读日志),不在等待期新建 shell(B-125)
-const BASE = process.env.BASE || 'http://192.168.16.251:4096';
-const DIR = process.env.DIR || '/sc-data/cfc/cfc-langgraph';
-const LOG = process.env.LOG || '/tmp/r189_pytest.log';
-const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
-const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
-const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(DIR);
-
-async function j(url, opt) {
-  try {
-    const r = await fetch(url, Object.assign({ headers: H }, opt || {}));
-    const t = await r.text();
-    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
-  } catch (e) { return { status: 0, err: e.message }; }
-}
-
-async function sh(cmd, capMs) {
-  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: DIR }) });
-  const id = cr.json && cr.json.data && cr.json.data.id;
-  if (!id) return { err: 'create ' + cr.status + ' ' + JSON.stringify(cr).slice(0, 200) };
-  const t0 = Date.now();
-  while (Date.now() - t0 < (capMs || 60000)) {
-    await new Promise(r => setTimeout(r, 2500));
-    const s = await j(BASE + '/api/shell/' + id + LOC);
-    const d = (s.json && s.json.data) || null;
-    if (!d) continue;
-    if (d.status && d.status !== 'running') {
-      const o = await j(BASE + '/api/shell/' + id + '/output' + LOC + '&limit=200000');
-      return { code: d.status, out: (o.json && o.json.data && o.json.data.output) || '' };
-    }
-  }
-  return { err: 'timeout' };
-}
-
-(async () => {
-  const mode = process.argv[2] || 'kick';
-  // R173 增:LOG 若从本机 env 注入,Git Bash(MSYS) 会把 /tmp/x 改写成 C:/Users/.../x,
-  // 远端 `tail` 恒报 No such file,且 kick 的重定向也会失败 → 看起来像「日志没生成」。
-  // 这里直接挡住 Windows 风格路径,强制调用方使用远端 POSIX 路径。
-  if (LOG.includes(':') || LOG.includes('\\')) {
-    console.error('BAD_LOG_PATH=' + LOG + ' 请使用远端 POSIX 路径(如 /tmp/rX_pytest.log),不要经由本地 env 注入');
-    process.exit(2);
-  }
-  if (mode === 'kick') {
-    // R156 修:251 系统 /usr/bin/python 无 pytest,必须用节点 venv(.venv/bin/python → python3.11);
-    // 退出码另存变量后再写盘(B-126:$? 直接内联在 kick 串里可能落盘失败)。
-    // R173 复现(B-126 第 6 轮):手工 kick 用 `echo EXIT=$?` 时 186 行日志零 EXIT 行;
-    // 已在 /tmp/r173_probe.log 验证「先存 rc 再落盘」可写入 → 保留 rc 写法为唯一正确姿势。
-    const inner = "cd " + DIR + " && .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py > " + LOG + " 2>&1; rc=$?; echo EXIT=$rc >> " + LOG;
-    const cmd = "rm -f " + LOG + "; setsid nohup bash -c '" + inner + "' >/dev/null 2>&1 & echo KICKED";
-    const r = await sh(cmd, 40000);
-    console.log('KICK=' + JSON.stringify(r).slice(0, 400));
-    const h = await sh('cd ' + DIR + ' && git rev-parse --short HEAD; date', 30000);
-    console.log('NODE_HEAD=' + ((h.out || h.err || '').trim()));
-  } else if (mode === 'read') {
-    const r = await sh('tail -c 4000 ' + LOG, 45000);
-    console.log(r.err ? 'READ_ERR=' + r.err : r.out);
-  } else if (mode === 'run') {
-    const r = await sh(process.argv[3], 120000);
-    console.log(r.err ? 'ERR=' + r.err : r.out);
-  }
-})();

+ 0 - 62
_r190_189_admin.cjs

@@ -1,62 +0,0 @@
-// R162: 189 admin-live UI E2E kick/read(String.raw 保反斜杠路径,修复 Location not found)
-const BASE = process.env.BASE_189 || 'http://192.168.16.189:4090';
-const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
-const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
-const CWD = String.raw`C:\code\cfc`;
-const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(CWD);
-const LOG = String.raw`C:\code\cfc\_r190_admin-live_test.log`;
-const SLEEP = ms => new Promise(r => setTimeout(r, ms));
-
-function buildKickCmd() {
-  return [
-    'cd ' + CWD,
-    'if (Test-Path ' + LOG + ') { Remove-Item ' + LOG + ' -Force }',
-    `Start-Process -FilePath cmd.exe -ArgumentList '/c','cd /d ${CWD}\\tests && set PLAYWRIGHT_HTML_REPORT=false && npx playwright test -c playwright.config.live.js --project=admin-desktop --reporter=line > ${LOG} 2>&1' -WindowStyle Hidden -PassThru | Select-Object Id`,
-    'start-sleep -Seconds 3',
-    'echo KICKED'
-  ].join('; ');
-}
-function buildReadCmd() {
-  return [
-    'echo READ_BEGIN',
-    'if (Test-Path ' + LOG + ') { Get-Content ' + LOG + ' -Tail 200 }',
-    'if (Test-Path ' + LOG + '.err) { echo ERR_BEGIN; Get-Content ' + LOG + '.err -Tail 30 }',
-    'echo READ_END'
-  ].join('; ');
-}
-async function j(url, opt) {
-  try {
-    const r = await fetch(url, Object.assign({ headers: H }, opt));
-    const t = await r.text();
-    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
-  } catch (e) { return { status: 0, err: e.message }; }
-}
-async function openShell(cmd, capMs = 30000) {
-  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: CWD }) });
-  const cj = (cr.json) || {};
-  const id = (cj.data && cj.data.id) || cj.id;
-  if (!id) return { err: 'create failed ' + cr.status + ' ' + JSON.stringify(cj).slice(0, 200), id: null };
-  const t0 = Date.now();
-  while (Date.now() - t0 < capMs) {
-    await SLEEP(2000);
-    const s = await j(BASE + '/api/shell/' + id + LOC);
-    const d = (s.json && s.json.data) || null;
-    if (d && d.status && d.status !== 'running') return { id, status: d.status };
-    if (!d) continue;
-  }
-  return { id, status: 'timeout' };
-}
-(async () => {
-  const mode = process.argv[2] || 'kick';
-  if (mode === 'kick') {
-    const k = await openShell(buildKickCmd(), 30000);
-    console.log('KICK', k.err || ('id=' + k.id + ' status=' + k.status));
-    return;
-  }
-  const r = await openShell(buildReadCmd(), 30000);
-  if (r.err) { console.log('READ_ERR', r.err); process.exit(1); }
-  const o = await j(BASE + '/api/shell/' + r.id + '/output' + LOC + '&limit=200000');
-  console.log('OUT_BEGIN');
-  console.log((o.json && o.json.data && o.json.data.output) || '(empty)');
-  console.log('OUT_END');
-})().catch(e => { console.error('ERR', e.message); process.exit(1); });

+ 0 - 27
_r190_204_run.cjs

@@ -1,27 +0,0 @@
-const BASE = 'http://192.168.16.204:4091';
-const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
-const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
-const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent('D:\\cfc');
-async function j(url, opt) { try { const r = await fetch(url, Object.assign({ headers: H }, opt)); const t = await r.text(); try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; } } catch (e) { return { status: 0, err: e.message }; } }
-async function sh(cmd, capMs) {
-  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: 'D:\\cfc' }) });
-  const id = cr.json && cr.json.data && cr.json.data.id;
-  if (!id) return { err: 'create ' + cr.status + ' ' + JSON.stringify(cr).slice(0,200) };
-  const t0 = Date.now();
-  while (Date.now() - t0 < (capMs || 120000)) {
-    await new Promise(r=>setTimeout(r,3000));
-    const s = await j(BASE + '/api/shell/' + id + LOC);
-    const d = (s.json && s.json.data) || null;
-    if (!d) continue;
-    if (d.status && d.status !== 'running') {
-      const o = await j(BASE + '/api/shell/' + id + '/output' + LOC + '&limit=200000');
-      return { code: d.status, out: (o.json && o.json.data && o.json.data.output) || '' };
-    }
-  }
-  return { err: 'timeout' };
-}
-(async () => {
-  // 前台同步跑(不重定向,直接输出),用 POSIX 风格路径避免 PowerShell 反斜杠转义
-  const r = await sh('Set-Location D:/cfc/tests; $env:PLAYWRIGHT_HTML_REPORT="false"; npx playwright test -c playwright.config.live.js --project=frontend-mobile --reporter=line', 180000);
-  console.log(r.err ? 'ERR=' + r.err : 'CODE=' + r.code + '\n' + r.out.slice(-1800));
-})().catch(e=>{console.error('ERR',e.message);process.exit(1);});

+ 0 - 55
_r190_251_lg.cjs

@@ -1,55 +0,0 @@
-// R190: 251 langgraph 派发器(基于 R150/R173 修复版)
-const BASE = process.env.BASE || 'http://192.168.16.251:4096';
-const DIR = process.env.DIR || '/sc-data/cfc/cfc-langgraph';
-const LOG = process.env.LOG || '/tmp/r190_pytest.log';
-const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
-const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
-const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(DIR);
-async function j(url, opt) {
-  try {
-    const r = await fetch(url, Object.assign({ headers: H }, opt || {}));
-    const t = await r.text();
-    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
-  } catch (e) { return { status: 0, err: e.message }; }
-}
-async function sh(cmd, capMs) {
-  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: DIR }) });
-  const id = cr.json && cr.json.data && cr.json.data.id;
-  if (!id) return { err: 'create ' + cr.status + ' ' + JSON.stringify(cr).slice(0, 200) };
-  const t0 = Date.now();
-  while (Date.now() - t0 < (capMs || 60000)) {
-    await new Promise(r => setTimeout(r, 2500));
-    const s = await j(BASE + '/api/shell/' + id + LOC);
-    const d = (s.json && s.json.data) || null;
-    if (!d) continue;
-    if (d.status && d.status !== 'running') {
-      const o = await j(BASE + '/api/shell/' + id + '/output' + LOC + '&limit=200000');
-      return { code: d.status, out: (o.json && o.json.data && o.json.data.output) || '' };
-    }
-  }
-  return { err: 'timeout' };
-}
-(async () => {
-  const mode = process.argv[2] || 'kick';
-  if (LOG.includes(':') || LOG.includes('\\')) {
-    console.error('BAD_LOG_PATH=' + LOG + ' 请使用远端 POSIX 路径(如 /tmp/rX_pytest.log),不要经由本地 env 注入');
-    process.exit(2);
-  }
-  if (mode === 'kick') {
-    // 先清理残留 pytest 进程(B-177-1 经验),再启动
-    const clean = await sh("ps -eo pid,etime,cmd | grep -E 'pytest|local_report' | grep -v grep | awk '{print $1}' | xargs -r kill -9 2>/dev/null; echo CLEANED", 30000);
-    const h = await sh('cd ' + DIR + ' && git rev-parse --short HEAD; date', 30000);
-    const inner = "cd " + DIR + " && .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py > " + LOG + " 2>&1; rc=$?; echo EXIT=$rc >> " + LOG;
-    const cmd = "rm -f " + LOG + "; setsid nohup bash -c '" + inner + "' >/dev/null 2>&1 & echo KICKED";
-    const r = await sh(cmd, 40000);
-    console.log('CLEAN=' + JSON.stringify(clean).slice(0, 200));
-    console.log('KICK=' + JSON.stringify(r).slice(0, 400));
-    console.log('NODE_HEAD=' + ((h.out || h.err || '').trim()));
-  } else if (mode === 'read') {
-    const r = await sh('tail -c 4000 ' + LOG, 45000);
-    console.log(r.err ? 'READ_ERR=' + r.err : r.out);
-  } else if (mode === 'run') {
-    const r = await sh(process.argv[3], 120000);
-    console.log(r.err ? 'ERR=' + r.err : r.out);
-  }
-})();

+ 0 - 1174
_r95_agg.json

@@ -1,1174 +0,0 @@
-{
- "backend": {
-  "classes": 328,
-  "tests": 2753,
-  "failures": 104,
-  "errors": 11,
-  "skipped": 4,
-  "time": 3084.024000000004,
-  "passed": 2634,
-  "pass_rate": 95.68,
-  "pass_rate_ex_env": 95.68,
-  "red_classes": 31,
-  "red_cases": 115,
-  "env_red_cases": 0,
-  "nonenv_red_cases": 115,
-  "time_sum_s": 3084.0,
-  "reds": [
-   {
-    "class": "GuheEvidenceIsolateContractTest",
-    "F": 11,
-    "E": 0,
-    "env": false,
-    "tests": 12
-   },
-   {
-    "class": "GuheNoPathMapContractTest",
-    "F": 10,
-    "E": 0,
-    "env": false,
-    "tests": 10
-   },
-   {
-    "class": "GuheKbVersionSenseContractTest",
-    "F": 9,
-    "E": 0,
-    "env": false,
-    "tests": 11
-   },
-   {
-    "class": "CfCommissionServiceSettleTest",
-    "F": 8,
-    "E": 0,
-    "env": false,
-    "tests": 12
-   },
-   {
-    "class": "EnergySystemFlowTest",
-    "F": 6,
-    "E": 0,
-    "env": false,
-    "tests": 7
-   },
-   {
-    "class": "GuheV2RouteContractTest",
-    "F": 6,
-    "E": 0,
-    "env": false,
-    "tests": 8
-   },
-   {
-    "class": "PlannerBindInviteFlowTest",
-    "F": 4,
-    "E": 1,
-    "env": false,
-    "tests": 9
-   },
-   {
-    "class": "GuheGateStrainBlockContractTest",
-    "F": 5,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "GuheLowSideAggregateContractTest",
-    "F": 5,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "GuheShellGuardContractTest",
-    "F": 5,
-    "E": 0,
-    "env": false,
-    "tests": 7
-   },
-   {
-    "class": "DimensionScoreServiceImplTest",
-    "F": 0,
-    "E": 4,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "ArticleAutoTagServiceTest",
-    "F": 4,
-    "E": 0,
-    "env": false,
-    "tests": 8
-   },
-   {
-    "class": "GuheLowSideNoSupplementContractTest",
-    "F": 4,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "GuhePageTailCleanContractTest",
-    "F": 4,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "GuheVersionSplitContractTest",
-    "F": 4,
-    "E": 0,
-    "env": false,
-    "tests": 5
-   },
-   {
-    "class": "DimensionRegistryMapContractTest",
-    "F": 3,
-    "E": 0,
-    "env": false,
-    "tests": 7
-   },
-   {
-    "class": "GrowthRecordSyncFlowTest",
-    "F": 1,
-    "E": 2,
-    "env": false,
-    "tests": 10
-   },
-   {
-    "class": "ArticleWorkflowTest",
-    "F": 3,
-    "E": 0,
-    "env": false,
-    "tests": 14
-   },
-   {
-    "class": "GuheKbFieldExposeContractTest",
-    "F": 3,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "ServiceRoleApproveTest",
-    "F": 0,
-    "E": 2,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "MindFortuneControllerTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 1
-   },
-   {
-    "class": "DailyCheckinStreakFlowTest",
-    "F": 0,
-    "E": 1,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "GuideModuleIntegrationTest",
-    "F": 0,
-    "E": 1,
-    "env": false,
-    "tests": 4
-   },
-   {
-    "class": "OrchestrationEngineTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 8
-   },
-   {
-    "class": "OrchestrationIntegrationTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 7
-   },
-   {
-    "class": "MembershipPaySwitchTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "PaymentServiceORDRoutingTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 3
-   },
-   {
-    "class": "UserServiceWechatLoginContractTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 6
-   },
-   {
-    "class": "UserServiceWechatLoginTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 5
-   },
-   {
-    "class": "TaskPlanServiceTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 4
-   },
-   {
-    "class": "TeamProfitCronContractTest",
-    "F": 1,
-    "E": 0,
-    "env": false,
-    "tests": 22
-   }
-  ]
- },
- "attr": [
-  {
-   "class": "MindFortuneControllerTest",
-   "case": "testGetTodayFortuneWithoutAuth",
-   "kind": "F",
-   "type": "AssertionError",
-   "msg": "JSON path \"$.code\" expected:<401> but was:<400>",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "case": "map_unknownLegacy_returnsNullData",
-   "kind": "F",
-   "type": "AssertionError",
-   "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"unknown_legacy_xyz\"",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "case": "map_emptyLegacy_returnsNullData",
-   "kind": "F",
-   "type": "AssertionError",
-   "msg": "JSON path \"$.data\"\nExpected: null\n     but: was \"\"",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "case": "map_missingLegacy_returnsBadRequest",
-   "kind": "F",
-   "type": "AssertionError",
-   "msg": "Status expected:<400> but was:<200>",
-   "prod_frames": 0
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "case": "childDeletesCheckin_Success",
-   "kind": "E",
-   "type": "MockitoException",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(mock).someVoidMethod();\nAbove means:\nsomeVoidMethod() does noth",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "parentQueriesEnergyLogs_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <500>",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "childExchangesWishWithEnergy_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <500>",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "childExchangesWithInsufficientEnergy_Fails",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "userWithoutFamily_Fails",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <500> but was: <5001>",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "parentGetsEnergyOverview_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <500>",
-   "prod_frames": 0
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "case": "taskCompletionGrantsEnergy_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <500>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "case": "parentUploadsHealthReport_Success",
-   "kind": "E",
-   "type": "NullPointerException",
-   "msg": "java.lang.NullPointerException",
-   "prod_frames": 0
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "case": "parentCreatesRecordWithoutChild_Fails",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "case": "parentCreatesRecordWithOrder_Success",
-   "kind": "E",
-   "type": "NullPointerException",
-   "msg": "java.lang.NullPointerException",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "case": "testGuidePackageCreationFlow",
-   "kind": "E",
-   "type": "DataIntegrityViolationException",
-   "msg": "### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platform_fee' at row 1\n### The error may exist in com/etotem/cfc/",
-   "prod_frames": 0
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "case": "parentConfirmsBind_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <403>",
-   "prod_frames": 0
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "case": "guideViewsBoundFamilies_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "case": "parentBindsSameGuideTwice_Fails",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <400> but was: <403>",
-   "prod_frames": 0
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "case": "parentUnbindsGuide_Success",
-   "kind": "E",
-   "type": "MockitoException",
-   "msg": "Only void methods can doNothing()!\nExample of correct use of doNothing():\n    doNothing().\n    doThrow(new RuntimeException())\n    .when(mock).someVoidMethod();\nAbove means:\nsomeVoidMethod() does noth",
-   "prod_frames": 0
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "case": "completeInviteBindFlow_Success",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <200> but was: <403>",
-   "prod_frames": 0
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: \"manual_fail\"\n but was: null",
-   "prod_frames": 0
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
-   "kind": "F",
-   "type": "AssertionError",
-   "msg": "Expecting actual:\n  \"failed\"\nto be in:\n  [\"in_progress\", \"pending\"]",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_pending",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_draft",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "case": "reDraft_notRejected_published",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_F03a发放_自动创建感恩记录",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\noctopusEffectRecordMapper.insert(<any>);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动创建感恩记录(CfCommissionServiceSettleTest.java:419)\nActually, the",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1020L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_同家庭引荐人跳过_顺延到下一级拿F03a(CfCommissionServ",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_商品订单实付与分润基数分离",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_商品订单实付与分润基数分离(CfCommis",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_两级销售奖_F03a按团队档位_F03b按自",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_档位比例超规则上限_按上限封顶",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_档位比例超规则上限_按上限封顶(CfComm",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_落P点消费日志_基数与订单对应",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\nppointConsumptionLogMapper.insert(\n    <Capturing argument>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_落P点消费日志_基数与订单对应(CfCommissionServiceSettleTest.j",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_最多两级_第三级引荐人不发放",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    1010L,\n    \"F03a\",\n    1L,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_最多两级_第三级引荐人不发放(CfCommissionServiceSet",
-   "prod_frames": 0
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
-   "kind": "F",
-   "type": "WantedButNotInvoked",
-   "msg": "Wanted but not invoked:\ncfBalanceService.earnByRule(\n    <any long>,\n    <any string>,\n    <any long>,\n    <any>\n);\n-> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_推荐人分润只走earnByRule_",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "case": "getHealthDimension_trendUp_whenScoreIncreasedBy5OrMore",
-   "kind": "E",
-   "type": "NoSuchElementException",
-   "msg": "No value present",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "case": "getHealthDimension_trendStable_whenNoHistory",
-   "kind": "E",
-   "type": "NoSuchElementException",
-   "msg": "No value present",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "case": "getHealthDimension_trendDown_whenScoreDecreasedBy5OrMore",
-   "kind": "E",
-   "type": "NoSuchElementException",
-   "msg": "No value present",
-   "prod_frames": 0
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "case": "getHealthDimension_trendStable_whenScoreChangeLessThan5",
-   "kind": "E",
-   "type": "NoSuchElementException",
-   "msg": "No value present",
-   "prod_frames": 0
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD17941626330060059610, payType=wechat, wechatPayParams={}, groupNo=null, totalPeriods=1, status=pending, periodNo=1}>",
-   "prod_frames": 0
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "case": "unknownPrefix_routesToHandlePaymentCallback",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <SUCCESS> but was: <FAIL>",
-   "prod_frames": 0
-  },
-  {
-   "class": "UserServiceWechatLoginContractTest",
-   "case": "wechatLogin_NewOpenid_CreatesParentUserWithFamily",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <jwt-token-1> but was: <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "UserServiceWechatLoginTest",
-   "case": "首次微信登录_自动建档默认家长并创建家庭与成员",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleAutoTagServiceTest",
-   "case": "toggleStatus_标签非空_不调度自动打标",
-   "kind": "F",
-   "type": "NeverWantedButInvoked",
-   "msg": "threadPoolTaskExecutor.execute(\n    <any java.lang.Runnable>\n);\nNever wanted here:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.toggleStatus_标签非空_不调度自动打标(ArticleAutoTagServiceTest.java:74)\nBut ",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleAutoTagServiceTest",
-   "case": "toggleStatus_发布且标签为空_调度自动打标",
-   "kind": "F",
-   "type": "TooManyActualInvocations",
-   "msg": "threadPoolTaskExecutor.execute(\n    <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.toggleStatus_发布且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:65)\nBut wa",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleAutoTagServiceTest",
-   "case": "auditArticle_审核通过且标签为空_调度自动打标",
-   "kind": "F",
-   "type": "TooManyActualInvocations",
-   "msg": "threadPoolTaskExecutor.execute(\n    <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.auditArticle_审核通过且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:103)\nBut",
-   "prod_frames": 0
-  },
-  {
-   "class": "ArticleAutoTagServiceTest",
-   "case": "publishByUser_家庭可见直接发布且标签为空_调度自动打标",
-   "kind": "F",
-   "type": "TooManyActualInvocations",
-   "msg": "threadPoolTaskExecutor.execute(\n    <any java.lang.Runnable>\n);\nWanted 1 time:\n-> at com.etotem.cfc.unit.ArticleAutoTagServiceTest.publishByUser_家庭可见直接发布且标签为空_调度自动打标(ArticleAutoTagServiceTest.java:138",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "lowSideRules_exposesRecommendationBasisEvidenceCodes",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 EVIDENCE_PUB 常量:T11(G-3)要求证据码隔离常量(可进推荐依据的 PUB/KB、存在性记录 COM、「未核实」标注),当前未落地。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "tagEvidence_pubKb_unchanged",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#tagEvidence 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "canEnterRecommendationBasis_unverified_false",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "tagEvidence_unknownOrBlank_markedUnverified",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#tagEvidence 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "isExistenceRecordOnly_com_true_pubFalse",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#isExistenceRecordOnly 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "canEnterRecommendationBasis_com_false",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "lowSideRules_exposesComAndUnverifiedMarkers",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 EVIDENCE_COM 常量:T11(G-3)要求证据码隔离常量(可进推荐依据的 PUB/KB、存在性记录 COM、「未核实」标注),当前未落地。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "canEnterRecommendationBasis_pubKb_true",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#canEnterRecommendationBasis 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "lowSideRules_exposesEvidenceIsolateRuleCode",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] AttributionLowSideRules 缺少 RULE_EVIDENCE_ISOLATE 规则码:T11(G-3)要求独立「证据码隔离」合规规则——低侧机制证据标 PUB/KB;COM 只作存在性记录;未核实编号标「未核实」。当前仅落地 G-1 三规则(association_only / no_causal_bridge / no_",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "gate_exposesTagEvidence",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] AttributionComplianceGate 缺少 tagEvidence(1 参) 方法:T11(G-3)证据码隔离契约要求门禁暴露该确定性方法,当前未落地(仅 G-1 的 enforceLowSide / scan / merge 已实现)。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheEvidenceIsolateContractTest",
-   "case": "isolateForRecommendation_filtersComAndUnverified",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.evidenceIsolate] 契约方法 AttributionComplianceGate#isolateForRecommendation 未实现(G-3 证据码隔离未落地,T11)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheGateStrainBlockContractTest",
-   "case": "strainBlockRules_exposesStrainBlockRuleCode",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.strainBlock] 规则层(AttributionLowSideRules / AttributionComplianceGate)缺少 \"no_strain_recommendation\" 规则码常量:T6(G-2)要求独立「16S 粒度拦截 / 菌株级推荐阻断」规则码,区别于 T5 的 association_only/no_causal_bridge/no_pre",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheGateStrainBlockContractTest",
-   "case": "attributionModel_exposesGranularityDimension",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.strainBlock] 归因模型(IndicatorReading/MemberAttribution)未暴露粒度(granularity)维度:T6(G-2)按「granularity != strain」拦菌株号推荐,需在读数/归因结论上区分「菌株级(strain)」与「菌属级/16S(非 strain,默认)」粒度。当前模型无 granularity 字段、无 str",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheGateStrainBlockContractTest",
-   "case": "scan_strainNumberProductRecommendation_flagsStrainBlockViolation",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.strainBlock] L5 scan 未将「含菌株号的商品推荐」回扫为 no_strain_recommendation 违规:T6(G-2)要求 granularity != strain 时禁菌株号推荐,scan 应识别「长双歧杆菌 BB536」等菌株号。当前 scan 仅回扫 G-1 的「缺X桥接 + 处方化」,未落地菌株号识别(实际命中=0 条)。 ==> exp",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheGateStrainBlockContractTest",
-   "case": "complianceGate_exposesEnforceStrainBlockEntry",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.strainBlock] AttributionComplianceGate 缺少 enforceStrainBlock(...) 门禁入口:T6(G-2)要求在 L4 出结论前按粒度拦「含菌株号的商品推荐」,与已落地的 enforceLowSide(G-1)同构。当前门禁仅 enforceLowSide + scan,未落地 T6 菌株级拦截入口。 ==> expected",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheGateStrainBlockContractTest",
-   "case": "enforceStrainBlock_16SGranularityWithStrainNumberProduct_flagsViolation",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.gate.strainBlock] 16S 粒度下含菌株号的商品推荐未被拦(AttributionComplianceGate 缺少 enforceStrainBlock 入口):T6(G-2)要求 granularity != strain 时禁生成含菌株号的商品推荐,「推荐含长双歧杆菌 BB536 的产品」应在门禁被识别为 G-2 菌株级拦截违规。当前未落地。",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbFieldExposeContractTest",
-   "case": "speciesInfo_escherichia_lowSideImpact_exposed",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.fieldExpose] 菌种综合信息「埃希氏菌属」偏低侧影响 应为非空(契约 §2.2,T10 L2-3 入 L2 查询返回);当前=null ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbFieldExposeContractTest",
-   "case": "aidefansiEcoli_colonizationNote_exposed",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.fieldExpose] 平台知识库缺少「艾德范思」来源知识(契约 §2.2 艾德范思大肠杆菌 健康定植说明);艾德范思品牌未落地。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbFieldExposeContractTest",
-   "case": "bacteriaGenus_highLowImpact_exposed",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.fieldExpose] 菌属功能库[埃希氏菌属] 偏高影响 应为非空(契约 §2.2 既有键补齐,T10 L2-3 入 L2 查询返回);当前= ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "extensionModule_hasElevenSubkeys",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证 11 子键(T9)。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "extensionModule_containsLowSidePatchSubkey",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证低侧补丁块(§2.2)。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "upgradeScript_repeatRun_idempotentNoAccumulation",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] 升级脚本(importFromClasspath)运行后 getSection(谷禾2026新版扩展知识) 应非空。T9 ③:重复运行只覆盖不累积。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "unifiedKbService_getVersion_containsGuhe2026_2",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.getVersion() 应含 +guhe2026.2(当前=2.0)。T9:KB 服务读取并暴露版本感知标记。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "lowSidePatch_containsJudgmentConcepts",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] getSection(谷禾2026新版扩展知识) 为空,无法验证低侧补丁块内容(§2.2)。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "unifiedKbService_moduleKeys_registerExtensionModule",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.MODULE_KEYS 应注册「谷禾2026新版扩展知识」(当前 12 个模块均不含)。T9:注册后 KB 服务加载时才会读取并暴露。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "seedJson_metaVersion_containsGuhe2026_2",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] 统一知识库.json 版本应含 +guhe2026.2(当前=2.0)。契约:3.0+guhe2026.2(主)/ 3.1+guhe2026.2(专家),T9 L2-1 ①。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "seedJson_containsExtensionModule",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] 统一知识库.json 顶层应含「谷禾2026新版扩展知识」(当前只有 12 个模块)。T9:KB 读取并暴露扩展知识(§2.2)。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheKbVersionSenseContractTest",
-   "case": "unifiedKbService_getSection_extensionModule_notNull",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.kb.versionSense] UnifiedKnowledgeBaseService.getSection(谷禾2026新版扩展知识) 应非空。T9:KB 服务读取并暴露扩展块(L2-1 ②)。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideAggregateContractTest",
-   "case": "schemaSql_hasCrossCaseAggregateTable",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.p3.lowSideAggregate] schema.sql 缺少跨案例聚合承载表(表名应含 attribution_case,如 attribution_case_strategies),用于沉淀跨案例「同条件致病菌低侧」应对方案。T15:低侧口径并入既有 P3 聚合口径。当前聚合承载表未落地。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideAggregateContractTest",
-   "case": "aggregateService_hasAggregateEntryMethod",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.p3.lowSideAggregate] 跨案例聚合服务类不存在,无法验证聚合入口方法(T15)。当前实现未落地。",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideAggregateContractTest",
-   "case": "aggregateResult_supportsSameReadingSameStrategy",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.p3.lowSideAggregate] 跨案例聚合服务类不存在,无法验证同策略聚类语义(T15)。当前实现未落地。",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideAggregateContractTest",
-   "case": "aggregateService_classExists",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.p3.lowSideAggregate] service/attribution 等候选包无跨案例聚合服务类(类名应含 CaseAggregate/CrossCase/CaseStrategy/LowSideAggregate 任一)。T15:低侧口径并入既有 P3 聚合口径,可检索「同条件致病菌低侧」应对方案。当前跨案例聚合实现未落地。 ==> expected: <true> bu",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideAggregateContractTest",
-   "case": "constantPackage_exposesLowSideReadingKey",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.p3.lowSideAggregate] constant 等候选包应暴露「条件致病菌低侧判读补充(人工)」判读口径常量(§2.2 KB 新增子键),作为跨案例聚合口径的事实锚点。T15:低侧口径并入既有 P3 聚合口径。当前判读口径常量未落地。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideNoSupplementContractTest",
-   "case": "lowSideNode_exposesNoSupplementFlag",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.lowSide.noSupplement] AttributionComplianceGate.LowSideNode 缺少 isNoSupplement() 节点级禁补菌标记:T4 要求「偏低」归因节点在源头即标注不推荐补菌,而非仅门禁事后回扫。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideNoSupplementContractTest",
-   "case": "interpret_lowSideEColi_meaningCarriesNoSupplementRedline",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.lowSide.noSupplement] 偏低大肠杆菌节点干预含义应携带「偏低不推荐补菌」口径(T4 L4-3,无成熟证据支持缺X→补X),实际为:「大肠杆菌 偏离 → 与肠道环境/营养缺口相关,先医后补」。当前仅产通用「先医后补」,未落地 T4 源头禁补菌。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideNoSupplementContractTest",
-   "case": "lowSideRules_exposesNoSupplementRuleCode",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.lowSide.noSupplement] AttributionLowSideRules 缺少 RULE_NO_SUPPLEMENT 规则码:T4(L4-3)要求独立「低位补菌红线」——无成熟证据支持「缺大肠杆菌→补大肠杆菌」。当前仅落地 T5 的 no_causal_bridge,未区分「引擎不产出补菌建议」与「文本回扫」。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheLowSideNoSupplementContractTest",
-   "case": "lowSideRules_exposesNoSupplementHintWording",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.lowSide.noSupplement] AttributionLowSideRules 缺少 NO_SUPPLEMENT_HINT 口径常量:T4 要求「偏低不推荐补菌」显式口径(无成熟证据支持缺X→补X),供 L4 引擎与报告侧引用,而非仅通用「先医后补」。 ==> expected: not <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "mediationChain_gutFloraWisdom_ladderLockedWording",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#mediationChain 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "attribute_gutFloraReading_wealthNoPenalty_red",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "菌群观测对「富」维 no_path:异常菌群读数不应使富维扣分(保持基数 78.0),实际 66.8 ==> expected: <78.0> but was: <66.8>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "isNoPath_gutFloraMind_false",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "isNoPath_gutFloraWealth_true",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "isNoPath_gutFloraAction_true",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "isNoPath_gutFloraBody_false",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#isNoPath 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "mediationChain_gutFloraMind_ladderLockedWording",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#mediationChain 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "noPathMap_gutFlora_wealthAndActionMarked",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "RED[guhe.l4.noPathMap] 契约方法 com.etotem.cfc.service.attribution.FiveDimAttributionEngine#noPathMap 未实现(T14 五维 no_path 映射未落地)",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "attribute_gutFloraReading_actionNoPenalty_red",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "菌群观测对「行」维 no_path:异常菌群读数不应使行维扣分(保持基数 70.0),实际 58.8 ==> expected: <70.0> but was: <58.8>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheNoPathMapContractTest",
-   "case": "attribute_lowSideGutFlora_weakExcludesWealthAndAction_red",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "非身维遮挡:菌群低侧读数不应使「行」成弱维(no_path),weak=[身, 行] ==> expected: <false> but was: <true>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuhePageTailCleanContractTest",
-   "case": "l1Layer_declaresTailAssertRegex",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应声明残段断言正则常量(静态 String 常量,值含 /16\\d 即 \\d{1,3}/16\\d 模式,用于校验层断言物种库条目不含 \\d{1,3}/16\\d,T12/L1-2)。当前无残段断言正则,无法对清洗结果做「残段 0 命中」的程序化校验。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuhePageTailCleanContractTest",
-   "case": "l1Layer_providesTailCleanEntry",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.pageTailClean] L1 接入归一化层(PdfParseService / ReportParserDispatchService / ReportFingerprintService / ParsedReportResult)应提供分页残段清洗执行入口(方法名含 TableTailClean / PageTail / StripTail,如 stripTableTai",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuhePageTailCleanContractTest",
-   "case": "l1Layer_providesTailCleanAssertEntry",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应提供残段清洗校验断言入口(方法名含 AssertTailClean / ValidateTail / AssertClean),断言清洗后产物「残段 0 命中」(§2.1 清洗后 76 条、残段 0 命中;T12/L1-2 校验层断言)。当前无残段断言步骤,无法验证清洗效果。 ==> expected: <true> but wa",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuhePageTailCleanContractTest",
-   "case": "l1Layer_declaresPageTailMarker",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.pageTailClean] L1 接入归一化层应声明 _PAGE_TAIL 残段标记常量(静态 String 常量,字段名/值含 PAGE_TAIL / 分页 / 残段,值含残段样例 34/167),作为分页表拼接残段的识别依据(§2.1 / T12)。当前无残段标记常量,残段无法被识别与清洗。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheShellGuardContractTest",
-   "case": "l1Layer_recognizesEmptyShell26",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.shellGuard] L1 层应识别空壳签名 26 键(静态 int 常量 26,曾误用艾德范思提取器仅产 26 键),判为空壳后换正确提取器(T13)。当前无空壳签名检测,26 键空壳将不被识别。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheShellGuardContractTest",
-   "case": "l1Layer_declaresGuheV2KeyBoundary32",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.shellGuard] L1 层应声明 guhe_v2 总键数 32(静态 int 常量 32,§2.1 旧 21 键 + 11 增量键),以区分完整 guhe_v2 报告(32 键)与空壳(不足 32 键)。当前无 32 键边界(T13/L1-4)。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheShellGuardContractTest",
-   "case": "l1Layer_declaresIncrementalKeys11",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.shellGuard] L1 层应声明增量 11 键基准(静态 String 键集合常量 size=11 且字段名含 KEY/KEYS/INCREMENTAL/增量,或静态 int 常量 11),作为 guhe_v2 解析后校验『增量 11 键齐全』的基准(§2.1 旧 21 键 + 11 增量键 = 32 键)。当前无增量键基准,无法判定空壳(T13/L1-4)。 ==> ex",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheShellGuardContractTest",
-   "case": "dispatchService_providesShellGuardEntry",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.shellGuard] ReportParserDispatchService 应提供空壳守卫入口(方法名含 Shell / KeyComplete / ValidateKeys / AssertKeys,如 guardShell),在 guhe_v2 解析后校验增量 11 键齐全(T13/L1-4)。当前 parseReport 仅做 指纹→专用解析器/LLM 兜底,无空壳检测",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheShellGuardContractTest",
-   "case": "l1Layer_addressesCorrectExtractor",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.shellGuard] L1 层(ReportParserDispatchService / ReportFingerprintService / PdfParseService)应寻址正确提取器(静态 String 常量值含 \"extract_guhe_v2\"),在空壳(26 键)检测到时切换用正确提取器(T13『空壳→换正确提取器』)。当前无 extract_guhe_v2 ",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_registersTriggerWord_firmicutesBacteroidetesRatio",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「厚壁菌比拟杆菌比值」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_providesGuheV2KeyCountSelfCheck",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 路由层应提供 guhe_v2 <b>32 键自检</b>入口(方法名含 keyCount/selfCheck,或静态 int 常量名含 GUHE_V2 且值为 32)。契约:旧 21 键打底 + 11 增量键 = 32 键,路由/解析后须自检键数齐全(T7 键数自检 32 键,§2.1)。当前无自检入口,32 键报告键数完整性无法保证。 ==> e",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_declaresRouteChainOrder",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应声明判定链顺序常量(值含 aidefansi→beijing→guhe_v2→standard 完整链),保证 guhe_v2 在 beijing 之后、standard 之前被判定(T7/L1-1,§2.1)。当前未声明,32 键新版报告可能被误判为标准格式而丢失增量 11 键。 ==> expected: <true> but wa",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_registersTriggerWord_diseaseSimilarAssessment",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「疾病相似评估」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_registersTriggerWord_subhealthAndDietUnreasonable",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 指纹路由层应可寻址 guhe_v2 触发词锚点「亚健康及营养饮食不合理」(静态 String 常量值含之,T7 指纹识别特征,§2.1)。当前 src/main 无此触发词,32 键 guhe_v2 新版报告无法被指纹识别路由。 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheV2RouteContractTest",
-   "case": "routeLayer_registersGuheV2Stage",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.guheV2Route] L1 指纹路由层(PdfParseService / ReportFingerprintService / ReportParserDispatchService)应注册判定阶段「guhe_v2」(静态 String 常量值含之),使判定链 aidefansi→beijing→guhe_v2→standard 的阶段可寻址(T7/L1-1)。当前 src",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheVersionSplitContractTest",
-   "case": "l1Layer_addressesGuheV2DedicatedParser",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.versionSplit] L1 层(ReportParserDispatchService / ReportFingerprintService)应寻址 guhe_v2 专用解析器(字符串常量值含 \"extract_guhe_v2\"),使 32 键 guhe_v2 报告进入专用解析分支,**不落入** unknown→LLM 兜底(T8 禁把 32 键误判成路由错误)。当前 g",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheVersionSplitContractTest",
-   "case": "l1Layer_declaresLegacy21KeyBoundary",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.versionSplit] L1 层应声明 21/32 键数边界(静态 int 常量 21 与 32 并存),以区分旧 21 键与原 v5 流程、32 键走 guhe_v2(§2.1 旧 21 键 + 11 增量 = 32 键)。当前无键数边界标记,旧 21 键无法与 guhe_v2 隔离,存在被强套 guhe_v2 风险(T8 禁把旧 21 键强套 guhe_v2)。 ==> ",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheVersionSplitContractTest",
-   "case": "parsedReportResult_exposesGuheV2FormatMarker",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.versionSplit] ParsedReportResult 应暴露 guhe_v2 格式版本标记(静态字符串常量值为 \"guhe_v2\"),使新版 32 键格式与旧 beijing/guhe 可区分(§2.1 判定链 aidefansi→beijing→guhe_v2→standard)。当前实现仅 beijing/guhe,格式版本分流未落地。 ==> expected:",
-   "prod_frames": 0
-  },
-  {
-   "class": "GuheVersionSplitContractTest",
-   "case": "dispatchService_providesFormatVersionSplitEntry",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "[guhe.l1.versionSplit] ReportParserDispatchService 应提供按报告格式版本分流入口(方法名含 FormatVersion / VersionSplit,如 routeByFormatVersion),按『报告格式版本』分流:32 键→guhe_v2 提取器、旧 21 键→原 v5 流程(T8/L1-3)。当前 parseReport 仅做 指纹→专用",
-   "prod_frames": 0
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "case": "planner_已有同手机号admin则更新不重复插入",
-   "kind": "E",
-   "type": "NullPointerException",
-   "msg": "java.lang.NullPointerException",
-   "prod_frames": 0
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "case": "planner_通过后写teacher_status并创建admins记录",
-   "kind": "E",
-   "type": "NullPointerException",
-   "msg": "java.lang.NullPointerException",
-   "prod_frames": 0
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "case": "applyAndActivate_无active实例时新建并置active",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "expected: <100> but was: <null>",
-   "prod_frames": 0
-  },
-  {
-   "class": "TeamProfitCronContractTest",
-   "case": "refundWithinCooling_cancelAllRecordsFundsNotPaid",
-   "kind": "F",
-   "type": "AssertionFailedError",
-   "msg": "冷静期内订单退款:对应 team_share_record / team_award_record 全部 cancelled、资金不发放(§8.2),cancelled=0 ==> expected: <true> but was: <false>",
-   "prod_frames": 0
-  }
- ],
- "identity": {
-  "at_test": 2741,
-  "parameterized_methods": 1,
-  "disabled_classes": [
-   "DataMigrationServiceTest",
-   "TaskServiceMinigameTest",
-   "TeacherLoginTest"
-  ],
-  "disabled_inner": 20,
-  "placeholders": 3,
-  "base_executed": 2724,
-  "actual_executed": 2753,
-  "param_expansion_net": 29
- },
- "silent_missing": []
-}

+ 0 - 4
_replace_log.txt

@@ -1,4 +0,0 @@
-12:26:26 [INFO] 共 809 个 markdown 文件
-12:26:28 [INFO] ============================================================
-12:26:28 [INFO] 完成: 共替换 8472 处图片引用
-12:26:28 [INFO] 示例: images: ["https://cfc.s3.cn-north-1.jdcloud-oss.com/kb-images/../images/1001_2.jpg","https://cfc.s3.cn-north-1.jdcloud-oss.com/kb-images/../images/1001_4.jpg","https://cfc.s3.cn-north-1.jdcloud-oss.co

+ 0 - 2378
_run29_agg.json

@@ -1,2378 +0,0 @@
-{
- "total": {
-  "tests": 1482,
-  "failures": 66,
-  "errors": 81,
-  "skipped": 4
- },
- "passed": 1331,
- "classes": {
-  "AdminRolesTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionStage1FoundationTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DatabaseInitializerSeedTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyAccessInterceptorTest": {
-   "tests": 11,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "JwtInterceptorLoginRequiredTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AIChatControllerTest": {
-   "tests": 17,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityControllerTest": {
-   "tests": 16,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleCategoryControllerTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleControllerTest": {
-   "tests": 11,
-   "f": 4,
-   "e": 5,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionControllerTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionSurveyRoutingTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AuthControllerTest": {
-   "tests": 39,
-   "f": 4,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DailyTaskControllerTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DanAssessmentControllerGetActiveMaterialTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DimensionAdminControllerTest": {
-   "tests": 13,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "EnergyControllerGrantEnergyTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyControllerTest": {
-   "tests": 8,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideFamilyTaskControllerTest": {
-   "tests": 20,
-   "f": 3,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideOrderControllerTest": {
-   "tests": 8,
-   "f": 6,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideRolePermissionTest": {
-   "tests": 21,
-   "f": 4,
-   "e": 1,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideTeamControllerTest": {
-   "tests": 9,
-   "f": 2,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthCheckinCfEarnCallSiteTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthDimensionControllerTest": {
-   "tests": 15,
-   "f": 2,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthPlanDeleteControllerTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportControllerCreateReportTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportControllerListPaginationTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportControllerProxyParseBindingTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorControllerTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorFavoriteControllerTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PaymentControllerTest": {
-   "tests": 12,
-   "f": 4,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductControllerTest": {
-   "tests": 16,
-   "f": 0,
-   "e": 3,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductOrderControllerTest": {
-   "tests": 20,
-   "f": 0,
-   "e": 6,
-   "s": 0,
-   "src": "xml"
-  },
-  "StatsControllerTest": {
-   "tests": 6,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "WishControllerTest": {
-   "tests": 29,
-   "f": 2,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AdminAuthWechatScanTest": {
-   "tests": 11,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AdminProductControllerBatchShelveTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReportParserAdminControllerTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "SupplyTeamControllerInviteTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AIChatControllerGateTest": {
-   "tests": 18,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ButlerControllerGateTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMembersControllerAddMemberTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMembersControllerListTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMembersControllerRenameFamilyTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TeacherMessageControllerMyTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TrainingPlanControllerGetPlanDetailTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TrainingPlanControllerGetPlanListTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MindFortuneControllerTest": {
-   "tests": 1,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityDTOTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DailyCheckinStreakFlowTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 1,
-   "s": 0,
-   "src": "xml"
-  },
-  "EnergySystemFlowTest": {
-   "tests": 7,
-   "f": 6,
-   "e": 0,
-   "s": 1,
-   "src": "xml"
-  },
-  "GrowthRecordSyncFlowTest": {
-   "tests": 10,
-   "f": 1,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideModuleIntegrationTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 1,
-   "s": 0,
-   "src": "xml"
-  },
-  "PlannerBindInviteFlowTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 9,
-   "s": 0,
-   "src": "xml"
-  },
-  "AdminFamilyOverviewControllerTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 3,
-   "s": 0,
-   "src": "xml"
-  },
-  "AdminSpecialPriceControllerTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "SpecialPriceControllerTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "OrchestrationEngineTest": {
-   "tests": 8,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "OrchestrationIntegrationTest": {
-   "tests": 7,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityAdminServiceTest": {
-   "tests": 10,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityOrderServiceTest": {
-   "tests": 15,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityRegistrationQuotaConcurrencyTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityServicePublishTest": {
-   "tests": 6,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AiGatewayTimeoutTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleAudioServiceChunkFilterTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleWorkflowTest": {
-   "tests": 14,
-   "f": 3,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfBalanceServiceTest": {
-   "tests": 25,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfCommissionServiceSettleTest": {
-   "tests": 12,
-   "f": 8,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfCommissionServiceTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfEarnDispatchServiceTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfGrowthPathwayEarnServiceTest": {
-   "tests": 16,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfLegacyLedgerMigrationServiceTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfLegacyLedgerWiringTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfPathwayEarnServiceTest": {
-   "tests": 32,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfReferralServiceSalesTierTest": {
-   "tests": 11,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfSpendDispatchServiceTest": {
-   "tests": 11,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfTransferServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ChallengeScoreServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CommissionDistService410Test": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CommissionServiceReferralF24Test": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ConsigneeServiceBackfillTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DailyOverviewServiceTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 1,
-   "s": 0,
-   "src": "xml"
-  },
-  "DanReportParseServiceTest": {
-   "tests": 38,
-   "f": 4,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "DataMigrationServiceTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 1,
-   "src": "xml"
-  },
-  "DimensionEnergySyncServiceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 5,
-   "s": 0,
-   "src": "xml"
-  },
-  "DimensionScoreServiceImplTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 6,
-   "s": 0,
-   "src": "xml"
-  },
-  "DimensionScoreServiceTest": {
-   "tests": 21,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "EnergyServiceFamilyTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "EnergyServiceGrantEnergyTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "EnergyServiceWealthIncomeTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyAdminOverviewServiceTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 3,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyFoodOverviewServiceTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyJoinRequestServiceReferrerBindTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 4,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMemberServiceIsChildTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyPlatformPointsServiceCouponTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FiveDimensionSelfCheckServiceTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FoodRecommendServiceTest": {
-   "tests": 21,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FoodServiceTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FortuneServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideApplicationServiceTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideFamilyServiceTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideHierarchyServiceTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuidePackageServiceTest": {
-   "tests": 13,
-   "f": 0,
-   "e": 12,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuidePackageTemplateServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportServiceAuditConfirmTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportServiceBackfillResilienceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportServiceIndicatorsTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthReportServiceTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorChangeServiceSemanticTest": {
-   "tests": 20,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorChangeServiceTest": {
-   "tests": 23,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorCorrelationServiceTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorFavoriteServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorMappingServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorTimelineServiceTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorTrendServiceTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "IndicatorValueMapperTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MembershipPaySwitchTest": {
-   "tests": 6,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MembershipServiceAiGateTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MembershipServiceTest": {
-   "tests": 17,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MiniGameServiceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "NormalizeIndicatorPipelineTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "NumSoulCalculatorTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "NutritionDeficiencyServiceTest": {
-   "tests": 14,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PaymentServiceORDRoutingTest": {
-   "tests": 3,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PdfParseServiceTest": {
-   "tests": 11,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PlatformPointsServiceTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PointsExchangeServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductOrderServiceFulfillmentMultiModeTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 6,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductOrderServiceSpecialDealTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductOrderServiceUpdateExpressFieldTest": {
-   "tests": 3,
-   "f": 3,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "RealNameBackfillServiceTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "RelationshipQuestionnaireServiceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReportAnalyzeQuotaServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReportBlockAssemblerTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReportDateExtractorTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReportSummaryServiceCompletenessTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ServiceContentServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ServiceTypeServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "SpecialPriceServiceTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "SupplySystemServiceTest": {
-   "tests": 18,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TaskServiceCfEarnTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TaskServiceMinigameTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 1,
-   "src": "xml"
-  },
-  "TeacherLoginTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 1,
-   "src": "xml"
-  },
-  "TencentTtsServiceAuthorizationTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "UserAddressServiceBackfillTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "UserServiceEffectiveFamilyIdsTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "UserServiceFamilyNameLinkTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "WishServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "WithdrawalServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfGrowthEarnCallSiteTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "PurchaseServiceImplRenewalTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "OrderTimeoutCancelTaskSpecialDealTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TaskCheckinWebhookReminderTaskTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "VirtualPayTimeoutTaskTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityAuditTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityRegistrationListTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityRegistrationQuotaUnitTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityRegistrationRejectTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityTagServiceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ActivityTeamServiceUnitTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleAutoTagServiceTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleBackfillTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ArticleRelatedServiceTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionAdjustServiceTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionPipelineMockTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionPlanServiceTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "AttributionRedlinesTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CartReplaceComboTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfBalanceControllerTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ComboOfferCalculatorTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ComboOrderStockTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ComboServiceTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ConditionEvaluatorServiceTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMemberDimensionBaseScoreServiceTest": {
-   "tests": 7,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyMemberServiceRenameTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FamilyNamingSupportTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "FiveDimensionScoreServiceTest": {
-   "tests": 12,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideFamilyAccessGuardTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideFamilyQueryServiceTest": {
-   "tests": 4,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuideFamilyServiceBindTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "GuidePlanReviewControllerAuthTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthPlanDeleteCascadeTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthPlanLazyBackfillTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "HealthPlanReviewGuardTest": {
-   "tests": 10,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "KnowledgeBaseBackfillTest": {
-   "tests": 9,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "MemberPriceResolverTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductDTOMappingTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductListNutritionTagFilterTest": {
-   "tests": 2,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ProductUpdateClearTest": {
-   "tests": 5,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "RecommendationNutritionTagTest": {
-   "tests": 1,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "RepeatTaskGeneratorPassThroughTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ReviewCenterSummaryTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "ServiceRoleApproveTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 2,
-   "s": 0,
-   "src": "xml"
-  },
-  "ServiceRoleFilterTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TaskPlanServiceTest": {
-   "tests": 4,
-   "f": 1,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "TaskProgressUpdateTest": {
-   "tests": 3,
-   "f": 0,
-   "e": 3,
-   "s": 0,
-   "src": "xml"
-  },
-  "CfFormulaEvaluatorTest": {
-   "tests": 8,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "SpearmanUtilTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  },
-  "UserUtilTest": {
-   "tests": 6,
-   "f": 0,
-   "e": 0,
-   "s": 0,
-   "src": "xml"
-  }
- },
- "issues": {
-  "ArticleControllerTest": [
-   {
-    "case": "list_ByCategory",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "recordRead_NoDuration",
-    "kind": "error",
-    "cat": "OTHER_EXC",
-    "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod(); Above means: someVoidMethod() does not"
-   },
-   {
-    "case": "featured_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <2> but was: <0>"
-   },
-   {
-    "case": "list_LoggedInUser",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: not <null>"
-   },
-   {
-    "case": "list_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: not <null>"
-   },
-   {
-    "case": "recordRead_WithMemberId",
-    "kind": "error",
-    "cat": "OTHER_EXC",
-    "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod(); Above means: someVoidMethod() does not"
-   },
-   {
-    "case": "featured_DefaultSize",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <1> but was: <0>"
-   },
-   {
-    "case": "list_ByKeyword",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "recordRead_Success",
-    "kind": "error",
-    "cat": "OTHER_EXC",
-    "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod(); Above means: someVoidMethod() does not"
-   }
-  ],
-  "AuthControllerTest": [
-   {
-    "case": "autoLogin_UserNotFound",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <410>"
-   },
-   {
-    "case": "switchRole_NotLoggedIn",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <401>"
-   },
-   {
-    "case": "autoLogin_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <410>"
-   },
-   {
-    "case": "autoLogin_NoOpenid",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <410>"
-   }
-  ],
-  "FamilyControllerTest": [
-   {
-    "case": "guideBindFamily_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   }
-  ],
-  "GuideFamilyTaskControllerTest": [
-   {
-    "case": "getFamilyTaskOverview_WithChildren",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <1> but was: <null>"
-   },
-   {
-    "case": "getPendingReviewTasks_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <1> but was: <0>"
-   },
-   {
-    "case": "reviewTask_Success",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "batchReviewTasks_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <3> but was: <0>"
-   },
-   {
-    "case": "getChildTasks_WithPagination",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "GuideOrderControllerTest": [
-   {
-    "case": "getOrders_NullParams",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: not <null>"
-   },
-   {
-    "case": "getOrderStats_WithData",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "getOrderDetail_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <403>"
-   },
-   {
-    "case": "getOrderDetail_MissingId",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-   },
-   {
-    "case": "getOrderDetail_WrongGuide",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-   },
-   {
-    "case": "getOrders_WithStatusFilter",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "getOrderDetail_NotFound",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <订单不存在> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-   },
-   {
-    "case": "getOrders_WithPagination",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <403>"
-   }
-  ],
-  "GuideRolePermissionTest": [
-   {
-    "case": "orderDetail_OwnerCanView",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <403>"
-   },
-   {
-    "case": "orderDetail_MissingId",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-   },
-   {
-    "case": "reviewTask_TeacherAllowed",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "batchReview_TeacherAllowed",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <2> but was: <0>"
-   },
-   {
-    "case": "orderDetail_NotOwnerDenied",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
-   }
-  ],
-  "GuideTeamControllerTest": [
-   {
-    "case": "testGetTeamStats_NoInviteCode",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <0> but was: <null>"
-   },
-   {
-    "case": "testGetTeamStats_WithMembers",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <3> but was: <null>"
-   }
-  ],
-  "HealthDimensionControllerTest": [
-   {
-    "case": "history_missingMemberId",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <200>"
-   },
-   {
-    "case": "overview_missingMemberId",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <200>"
-   }
-  ],
-  "PaymentControllerTest": [
-   {
-    "case": "handleWechatCallback_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <true> but was: <false>"
-   },
-   {
-    "case": "handleAlipayCallback_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <true> but was: <false>"
-   },
-   {
-    "case": "createWechatPayOrder_ReturnMapNotNull",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: not <null>"
-   },
-   {
-    "case": "createWechatPayOrder_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <ORD20260622001> but was: <null>"
-   }
-  ],
-  "ProductControllerTest": [
-   {
-    "case": "shelve_PublishSuccess",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_PublishSuccess(ProductControllerTest.java:289)  This exception may occu"
-   },
-   {
-    "case": "shelve_NotOwner",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_NotOwner(ProductControllerTest.java:319)  This exception may occur if m"
-   },
-   {
-    "case": "shelve_UnshelveSuccess",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_UnshelveSuccess(ProductControllerTest.java:304)  This exception may occ"
-   }
-  ],
-  "ProductOrderControllerTest": [
-   {
-    "case": "confirm_Success",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "myOrders_FilterByStatus",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "myOrders_AllStatus",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "confirm_NotFound",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "myOrders_Empty",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "confirm_NotYetShipped",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "StatsControllerTest": [
-   {
-    "case": "familyCompletion_NoFamily",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <5001>"
-   }
-  ],
-  "WishControllerTest": [
-   {
-    "case": "getWishes_MissingCondition",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <请指定查询条件(childId或familyId)> but was: <请指定查询条件(memberId或familyId)>"
-   },
-   {
-    "case": "getPendingWishes_NoFamilyId",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <5001>"
-   }
-  ],
-  "MindFortuneControllerTest": [
-   {
-    "case": "testGetTodayFortuneWithoutAuth",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "JSON path \"$.code\" expected:<401> but was:<400>"
-   }
-  ],
-  "DailyCheckinStreakFlowTest": [
-   {
-    "case": "childDeletesCheckin_Success",
-    "kind": "error",
-    "cat": "OTHER_EXC",
-    "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod(); Above means: someVoidMethod() does not"
-   }
-  ],
-  "EnergySystemFlowTest": [
-   {
-    "case": "parentQueriesEnergyLogs_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   },
-   {
-    "case": "childExchangesWishWithEnergy_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   },
-   {
-    "case": "childExchangesWithInsufficientEnergy_Fails",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <true> but was: <false>"
-   },
-   {
-    "case": "userWithoutFamily_Fails",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <500> but was: <5001>"
-   },
-   {
-    "case": "parentGetsEnergyOverview_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   },
-   {
-    "case": "taskCompletionGrantsEnergy_Success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   }
-  ],
-  "GrowthRecordSyncFlowTest": [
-   {
-    "case": "parentUploadsHealthReport_Success",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "parentCreatesRecordWithoutChild_Fails",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <true> but was: <false>"
-   },
-   {
-    "case": "parentCreatesRecordWithOrder_Success",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "GuideModuleIntegrationTest": [
-   {
-    "case": "testGuidePackageCreationFlow",
-    "kind": "error",
-    "cat": "OTHER_EXC",
-    "msg": " ### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platform_fee' at row 1 ### The error may exist in com/etotem/cfc"
-   }
-  ],
-  "PlannerBindInviteFlowTest": [
-   {
-    "case": "guideGeneratesInvite_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentConfirmsBind_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "guideViewsBoundFamilies_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentValidatesInvite_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentBindsSameGuideTwice_Fails",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentValidatesInvalidInvite_Fails",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentUnbindsGuide_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "parentViewsBoundGuides_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "completeInviteBindFlow_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "AdminFamilyOverviewControllerTest": [
-   {
-    "case": "tasks_分页",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "overview_成功",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "overview_非admin拒绝",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "OrchestrationEngineTest": [
-   {
-    "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": " expected: \"manual_fail\"  but was: null"
-   }
-  ],
-  "OrchestrationIntegrationTest": [
-   {
-    "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": " Expecting actual:   \"failed\" to be in:   [\"in_progress\", \"pending\"] "
-   }
-  ],
-  "ActivityAdminServiceTest": [
-   {
-    "case": "review_publish_success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   }
-  ],
-  "ActivityServicePublishTest": [
-   {
-    "case": "publish_draft_success",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <200> but was: <500>"
-   }
-  ],
-  "ArticleWorkflowTest": [
-   {
-    "case": "reDraft_notRejected_pending",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-   },
-   {
-    "case": "reDraft_notRejected_draft",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-   },
-   {
-    "case": "reDraft_notRejected_published",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
-   }
-  ],
-  "CfCommissionServiceSettleTest": [
-   {
-    "case": "settle_F03a发放_自动创建感恩记录",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: octopusEffectRecordMapper.insert(<any>); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动创建感恩记录(CfCommissionServiceSettleTest.java:419) Actually, th"
-   },
-   {
-    "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1020L,     \"F03a\",     1L,     <any> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_同家庭引荐人跳过_顺延到下一级拿F03a(CfCommissionSer"
-   },
-   {
-    "case": "settle_商品订单实付与分润基数分离",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_商品订单实付与分润基数分离(CfCommi"
-   },
-   {
-    "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_两级销售奖_F03a按团队档位_F03b按"
-   },
-   {
-    "case": "settle_档位比例超规则上限_按上限封顶",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_档位比例超规则上限_按上限封顶(CfCom"
-   },
-   {
-    "case": "settle_落P点消费日志_基数与订单对应",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: ppointConsumptionLogMapper.insert(     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_落P点消费日志_基数与订单对应(CfCommissionServiceSettleTest."
-   },
-   {
-    "case": "settle_最多两级_第三级引荐人不发放",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <any> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_最多两级_第三级引荐人不发放(CfCommissionServiceSe"
-   },
-   {
-    "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     <any long>,     <any string>,     <any long>,     <any> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_推荐人分润只走earnByRule"
-   }
-  ],
-  "DailyOverviewServiceTest": [
-   {
-    "case": "aggregate_四类汇总_全部正确",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "DanReportParseServiceTest": [
-   {
-    "case": "testParseA2_standardCoreLiteracyFormat",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <俊辰> but was: <null>"
-   },
-   {
-    "case": "testParseB4_regression",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "B4 解析应正常 ==> expected: <false> but was: <true>"
-   },
-   {
-    "case": "testParseA1_shouldFallbackToGenericPattern",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "应通过fallback提取感知觉百分位 ==> expected: not <null>"
-   },
-   {
-    "case": "testParseA1_shouldExtractCognitiveDimensionFromDetailPage",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "应有processingSpeed_score ==> expected: not <null>"
-   }
-  ],
-  "DimensionEnergySyncServiceTest": [
-   {
-    "case": "syncBodyEnergy_awardsWhenScoresExist",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "syncBodyEnergy_skipsWhenEmptyScores",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "syncBodyEnergy_skipsWhenAverageIsZero",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "syncBodyEnergy_skipsWhenNoScores",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "syncBodyEnergy_doesNotBlockOnException",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "DimensionScoreServiceImplTest": [
-   {
-    "case": "getHealthDimension_trendUp_whenScoreIncreasedBy5OrMore",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getHealthDimension_trendStable_whenNoHistory",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getHealthDimension_aggregatesAll7Dimensions",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getHealthDimension_trendDown_whenScoreDecreasedBy5OrMore",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getHealthDimension_trendStable_whenScoreChangeLessThan5",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getHealthDimension_levelMapsCorrectly",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "FamilyAdminOverviewServiceTest": [
-   {
-    "case": "overview_计数与明细",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "overview_家庭不存在",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "pageTasks_分页",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "FamilyJoinRequestServiceReferrerBindTest": [
-   {
-    "case": "approve_inviterWithoutReferrer_doesNotBind",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "approve_tokenPath_userWithReferrer_doesNotRebind",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "approve_tokenPath_newUserWithoutReferrer_bindsInviterReferrer",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "approve_shortCodePath_noInviter_doesNotBind",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "FortuneServiceTest": [
-   {
-    "case": "testCalculateLuckyDirection",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "testGenerateIsDeterministic",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "GuidePackageServiceTest": [
-   {
-    "case": "deleteGuidePackage_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "addGuidePackage_InvalidPackage_ReturnsFalse",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getActivePackages_ReturnsAllActive",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "addGuidePackage_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getGuidePackages_WithData",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "addGuidePackage_Duplicate_ReturnsFalse",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "deleteGuidePackage_NotFound_ReturnsFalse",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "updateGuidePackagePrice_Success",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getGuidePackage_NotFound",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getGuidePackages_NoData",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getPackagesByLevel_ReturnsFiltered",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "getGuidePackage_Found",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "MembershipPaySwitchTest": [
-   {
-    "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD17937656040160055048, payType=wechat, wechatPayParams={}, groupNo=null, totalPeriods=1, status=pending, periodNo=1}>"
-   }
-  ],
-  "PaymentServiceORDRoutingTest": [
-   {
-    "case": "unknownPrefix_routesToHandlePaymentCallback",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <SUCCESS> but was: <FAIL>"
-   }
-  ],
-  "ProductOrderServiceFulfillmentMultiModeTest": [
-   {
-    "case": "resolveShipType_deliveryMethod3_requiresExplicitShipType",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "ship_local_syncsWechatWithLogisticsType2",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)"
-   },
-   {
-    "case": "ship_express_requiresTrackingAndCompany",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "ship_selfPickup_syncsWechatWithLogisticsType4",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)"
-   },
-   {
-    "case": "ship_virtual_rejectsManualShipAndIdempotent",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "autoShipVirtualOrder_onPaySuccess",
-    "kind": "error",
-    "cat": "MOCK_MISUSE",
-    "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)"
-   }
-  ],
-  "ProductOrderServiceUpdateExpressFieldTest": [
-   {
-    "case": "updateExpress_fullUpdate_writesLogisticsColumnsAndSyncsWechat",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     \"YT9876543210\",     \"圆通速递\",     <any> ); -> at com.etotem.cfc.service.ProductOrderServiceUp"
-   },
-   {
-    "case": "ship_writesLogisticsColumns",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     \"JD0000000001\",     \"京东物流\",     <any> ); -> at com.etotem.cfc.service.ProductOrderServiceUp"
-   },
-   {
-    "case": "updateExpress_onlyCompany_trackingFallsBackToPersistedLogisticsNo",
-    "kind": "failure",
-    "cat": "OTHER",
-    "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     <Capturing argument>,     \"中通快递\",     <any> ); -> at com.etotem.cfc.service.ProductOrderSer"
-   }
-  ],
-  "UserServiceFamilyNameLinkTest": [
-   {
-    "case": "realName变化_联动家庭名",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   },
-   {
-    "case": "realName未变_不改家庭名",
-    "kind": "error",
-    "cat": "ENV_DB",
-    "msg": "Failed to load ApplicationContext"
-   }
-  ],
-  "ServiceRoleApproveTest": [
-   {
-    "case": "planner_已有同手机号admin则更新不重复插入",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   },
-   {
-    "case": "planner_通过后写teacher_status并创建admins记录",
-    "kind": "error",
-    "cat": "NPE",
-    "msg": ""
-   }
-  ],
-  "TaskPlanServiceTest": [
-   {
-    "case": "applyAndActivate_无active实例时新建并置active",
-    "kind": "failure",
-    "cat": "ASSERT",
-    "msg": "expected: <100> but was: <null>"
-   }
-  ],
-  "TaskProgressUpdateTest": [
-   {
-    "case": "updateProgress_withoutFamilyMemberId_fallsBackToUserIdLookup",
-    "kind": "error",
-    "cat": "TEST_SETUP",
-    "msg": "platformPointsService"
-   },
-   {
-    "case": "updateProgress_noDeadlineTask_awardsBasePointsInsteadOfPenalty",
-    "kind": "error",
-    "cat": "TEST_SETUP",
-    "msg": "platformPointsService"
-   },
-   {
-    "case": "updateProgress_withExplicitFamilyMemberId_doesNotFallbackToUserIdLookup",
-    "kind": "error",
-    "cat": "TEST_SETUP",
-    "msg": "platformPointsService"
-   }
-  ]
- },
- "missing": [
-  "TestRoles"
- ],
- "txt_only": [],
- "categories": {
-  "NPE": 26,
-  "OTHER_EXC": 5,
-  "ASSERT": 55,
-  "MOCK_MISUSE": 6,
-  "ENV_DB": 41,
-  "OTHER": 11,
-  "TEST_SETUP": 3
- }
-}

+ 0 - 321
_run30_agg.json

@@ -1,321 +0,0 @@
-{
- "source_test_classes": 198,
- "reported_classes": 198,
- "tests": 1482,
- "passed": 1330,
- "failures": 70,
- "errors": 78,
- "skipped": 4,
- "pass_rate": 89.74,
- "red_classes": 43,
- "red_cases": 148,
- "env_red_cases": 42,
- "nonenv_red_cases": 106,
- "pass_rate_ex_env": 92.58,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "GuideApplicationServiceTest",
-   "F": 0,
-   "E": 8,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "GuidePackageServiceTest",
-   "F": 0,
-   "E": 8,
-   "env": true,
-   "tests": 13
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 2,
-   "env": true,
-   "tests": 9
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "DimensionEnergySyncServiceTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 5
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ActivityAdminServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ActivityServicePublishTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyOverviewServiceTest",
-   "F": 0,
-   "E": 1,
-   "env": true,
-   "tests": 1
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 198,
- "txt_only_classes": 0
-}

+ 0 - 307
_run31_agg.json

@@ -1,307 +0,0 @@
-{
- "source_test_classes": 202,
- "reported_classes": 202,
- "tests": 1512,
- "passed": 1354,
- "failures": 57,
- "errors": 98,
- "skipped": 3,
- "pass_rate": 89.55,
- "red_classes": 41,
- "red_cases": 155,
- "env_red_cases": 62,
- "nonenv_red_cases": 93,
- "pass_rate_ex_env": 93.65,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 0,
-   "E": 9,
-   "env": true,
-   "tests": 9
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "GuideApplicationServiceTest",
-   "F": 0,
-   "E": 8,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 0,
-   "E": 7,
-   "env": true,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 10
-  },
-  {
-   "class": "GuideFamilyServiceTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "DimensionEnergySyncServiceTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 5
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 4,
-   "env": true,
-   "tests": 4
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "DailyOverviewServiceTest",
-   "F": 0,
-   "E": 1,
-   "env": true,
-   "tests": 1
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 202,
- "txt_only_classes": 0
-}

+ 0 - 363
_run32_agg.json

@@ -1,363 +0,0 @@
-{
- "source_test_classes": 202,
- "reported_classes": 202,
- "tests": 1512,
- "passed": 1262,
- "failures": 50,
- "errors": 197,
- "skipped": 3,
- "pass_rate": 83.47,
- "red_classes": 49,
- "red_cases": 247,
- "env_red_cases": 167,
- "nonenv_red_cases": 80,
- "pass_rate_ex_env": 94.51,
- "reds": [
-  {
-   "class": "WishControllerTest",
-   "F": 0,
-   "E": 16,
-   "env": true,
-   "tests": 29
-  },
-  {
-   "class": "GuidePackageServiceTest",
-   "F": 0,
-   "E": 13,
-   "env": true,
-   "tests": 13
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 0,
-   "E": 11,
-   "env": true,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 11,
-   "env": true,
-   "tests": 20
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 0,
-   "E": 10,
-   "env": true,
-   "tests": 10
-  },
-  {
-   "class": "GuideHierarchyServiceTest",
-   "F": 0,
-   "E": 10,
-   "env": true,
-   "tests": 10
-  },
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 0,
-   "E": 9,
-   "env": true,
-   "tests": 9
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "GuideApplicationServiceTest",
-   "F": 0,
-   "E": 8,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 0,
-   "E": 7,
-   "env": true,
-   "tests": 7
-  },
-  {
-   "class": "GuideFamilyServiceTest",
-   "F": 0,
-   "E": 7,
-   "env": true,
-   "tests": 7
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "GuidePackageTemplateServiceTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "ServiceContentServiceTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "AdminSpecialPriceControllerTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "DimensionEnergySyncServiceTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 5
-  },
-  {
-   "class": "MiniGameServiceTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 5
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 4,
-   "env": true,
-   "tests": 4
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ServiceTypeServiceTest",
-   "F": 0,
-   "E": 4,
-   "env": true,
-   "tests": 4
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "SpecialPriceControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "DailyOverviewServiceTest",
-   "F": 0,
-   "E": 1,
-   "env": true,
-   "tests": 1
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 202,
- "txt_only_classes": 0
-}

+ 0 - 272
_run33_agg.json

@@ -1,272 +0,0 @@
-{
- "source_test_classes": 202,
- "reported_classes": 202,
- "tests": 1512,
- "passed": 1302,
- "failures": 50,
- "errors": 156,
- "skipped": 4,
- "pass_rate": 86.11,
- "red_classes": 36,
- "red_cases": 206,
- "env_red_cases": 137,
- "nonenv_red_cases": 69,
- "pass_rate_ex_env": 95.17,
- "reds": [
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 0,
-   "E": 21,
-   "env": true,
-   "tests": 21
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 20,
-   "env": true,
-   "tests": 20
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 16,
-   "env": true,
-   "tests": 16
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 0,
-   "E": 15,
-   "env": true,
-   "tests": 15
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 0,
-   "E": 12,
-   "env": true,
-   "tests": 12
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 2,
-   "E": 9,
-   "env": true,
-   "tests": 20
-  },
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 0,
-   "E": 9,
-   "env": true,
-   "tests": 9
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 4,
-   "E": 4,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 1,
-   "E": 5,
-   "env": true,
-   "tests": 29
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 3,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 0,
-   "E": 1,
-   "env": true,
-   "tests": 1
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 202,
- "txt_only_classes": 0
-}

+ 0 - 389
_run33_nonenv.json

@@ -1,389 +0,0 @@
-{
- "ArticleControllerTest": [
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.mockito.exceptions.base.MockitoException",
-   "msg": "&#10;Only void methods can doNothing()!&#10;Example of correct use of doNothing():&#10;    doNothing().&#10;    doThrow(new RuntimeException())&#10;    .when(mock).someVoidMethod();&#10;Above means:&#10;someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;2&gt; but was: &lt;0&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: not &lt;null&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: not &lt;null&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.mockito.exceptions.base.MockitoException",
-   "msg": "&#10;Only void methods can doNothing()!&#10;Example of correct use of doNothing():&#10;    doNothing().&#10;    doThrow(new RuntimeException())&#10;    .when(mock).someVoidMethod();&#10;Above means:&#10;someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;1&gt; but was: &lt;0&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.controller.ArticleControllerTest",
-   "type": "org.mockito.exceptions.base.MockitoException",
-   "msg": "&#10;Only void methods can doNothing()!&#10;Example of correct use of doNothing():&#10;    doNothing().&#10;    doThrow(new RuntimeException())&#10;    .when(mock).someVoidMethod();&#10;Above means:&#10;someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
-  }
- ],
- "AuthControllerTest": [
-  {
-   "case": "com.etotem.cfc.controller.AuthControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;500&gt; but was: &lt;410&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.AuthControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;500&gt; but was: &lt;401&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.AuthControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;410&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.controller.AuthControllerTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;500&gt; but was: &lt;410&gt;"
-  }
- ],
- "DailyCheckinStreakFlowTest": [
-  {
-   "case": "com.etotem.cfc.integration.DailyCheckinStreakFlowTest",
-   "type": "org.mockito.exceptions.base.MockitoException",
-   "msg": "&#10;Only void methods can doNothing()!&#10;Example of correct use of doNothing():&#10;    doNothing().&#10;    doThrow(new RuntimeException())&#10;    .when(mock).someVoidMethod();&#10;Above means:&#10;someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
-  }
- ],
- "EnergySystemFlowTest": [
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;500&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;500&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;true&gt; but was: &lt;false&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;500&gt; but was: &lt;5001&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;500&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.EnergySystemFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;500&gt;"
-  }
- ],
- "GrowthRecordSyncFlowTest": [
-  {
-   "case": "com.etotem.cfc.integration.GrowthRecordSyncFlowTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.integration.GrowthRecordSyncFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;true&gt; but was: &lt;false&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.GrowthRecordSyncFlowTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  }
- ],
- "GuideModuleIntegrationTest": [
-  {
-   "case": "com.etotem.cfc.integration.GuideModuleIntegrationTest",
-   "type": "org.springframework.dao.DataIntegrityViolationException",
-   "msg": "&#10;### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column &apos;platform_fee&apos; at row 1&#10;### The error may exist in com/etotem/cfc/mapper/TaskTemplatePackageMapper.java (best guess)&#10;### The error may involve com.etotem.cfc.mapper.TaskTemplatePackageMapper.insert-Inline&#10;### The error occurred while setti"
-  }
- ],
- "PlannerBindInviteFlowTest": [
-  {
-   "case": "com.etotem.cfc.integration.PlannerBindInviteFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;403&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.PlannerBindInviteFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: not &lt;null&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.PlannerBindInviteFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;400&gt; but was: &lt;403&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.integration.PlannerBindInviteFlowTest",
-   "type": "org.mockito.exceptions.base.MockitoException",
-   "msg": "&#10;Only void methods can doNothing()!&#10;Example of correct use of doNothing():&#10;    doNothing().&#10;    doThrow(new RuntimeException())&#10;    .when(mock).someVoidMethod();&#10;Above means:&#10;someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called"
-  },
-  {
-   "case": "com.etotem.cfc.integration.PlannerBindInviteFlowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;200&gt; but was: &lt;403&gt;"
-  }
- ],
- "OrchestrationEngineTest": [
-  {
-   "case": "com.etotem.cfc.orchestration.OrchestrationEngineTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "&#10;expected: &quot;manual_fail&quot;&#10; but was: null"
-  }
- ],
- "OrchestrationIntegrationTest": [
-  {
-   "case": "com.etotem.cfc.orchestration.OrchestrationIntegrationTest",
-   "type": "java.lang.AssertionError",
-   "msg": "&#10;Expecting actual:&#10;  &quot;failed&quot;&#10;to be in:&#10;  [&quot;in_progress&quot;, &quot;pending&quot;]&#10;"
-  }
- ],
- "ArticleWorkflowTest": [
-  {
-   "case": "com.etotem.cfc.service.ArticleWorkflowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;仅已驳回的文章可重新编辑&gt; but was: &lt;仅已驳回或已撤回的文章可重新编辑&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.service.ArticleWorkflowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;仅已驳回的文章可重新编辑&gt; but was: &lt;仅已驳回或已撤回的文章可重新编辑&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.service.ArticleWorkflowTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;仅已驳回的文章可重新编辑&gt; but was: &lt;仅已驳回或已撤回的文章可重新编辑&gt;"
-  }
- ],
- "CfCommissionServiceSettleTest": [
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;octopusEffectRecordMapper.insert(&lt;any&gt;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动创建感恩记录(CfCommissionServiceSettleTest.java:419)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    1020L,&#10;    &quot;F03a&quot;,&#10;    1L,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_同家庭引荐人跳过_顺延到下一级拿F03a(CfCommissionServiceSettleTest.java:329)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    1010L,&#10;    &quot;F03a&quot;,&#10;    1L,&#10;    &lt;Capturing argument&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_商品订单实付与分润基数分离(CfCommissionServiceSettleTest.java:305)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    1010L,&#10;    &quot;F03a&quot;,&#10;    1L,&#10;    &lt;Capturing argument&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_两级销售奖_F03a按团队档位_F03b按自身档位(CfCommissionServiceSettleTest.java:258)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    1010L,&#10;    &quot;F03a&quot;,&#10;    1L,&#10;    &lt;Capturing argument&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_档位比例超规则上限_按上限封顶(CfCommissionServiceSettleTest.java:366)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;ppointConsumptionLogMapper.insert(&#10;    &lt;Capturing argument&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_落P点消费日志_基数与订单对应(CfCommissionServiceSettleTest.java:396)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    1010L,&#10;    &quot;F03a&quot;,&#10;    1L,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_最多两级_第三级引荐人不发放(CfCommissionServiceSettleTest.java:348)&#10;Actually, there were zero interactions with this mock.&#10;"
-  },
-  {
-   "case": "com.etotem.cfc.service.CfCommissionServiceSettleTest",
-   "type": "org.mockito.exceptions.verification.WantedButNotInvoked",
-   "msg": "&#10;Wanted but not invoked:&#10;cfBalanceService.earnByRule(&#10;    &lt;any long&gt;,&#10;    &lt;any string&gt;,&#10;    &lt;any long&gt;,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_推荐人分润只走earnByRule_不再写旧分佣流水(CfCommissionServiceSettleTest.java:287)&#10;Actually, there were zero interactions with this mock.&#10;"
-  }
- ],
- "DanReportParseServiceTest": [
-  {
-   "case": "com.etotem.cfc.service.DanReportParseServiceTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;俊辰&gt; but was: &lt;null&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.service.DanReportParseServiceTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "B4 解析应正常 ==&gt; expected: &lt;false&gt; but was: &lt;true&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.service.DanReportParseServiceTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "应通过fallback提取感知觉百分位 ==&gt; expected: not &lt;null&gt;"
-  },
-  {
-   "case": "com.etotem.cfc.service.DanReportParseServiceTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "应有processingSpeed_score ==&gt; expected: not &lt;null&gt;"
-  }
- ],
- "FamilyJoinRequestServiceReferrerBindTest": [
-  {
-   "case": "com.etotem.cfc.service.FamilyJoinRequestServiceReferrerBindTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.FamilyJoinRequestServiceReferrerBindTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.FamilyJoinRequestServiceReferrerBindTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.FamilyJoinRequestServiceReferrerBindTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  }
- ],
- "FortuneServiceTest": [
-  {
-   "case": "com.etotem.cfc.service.FortuneServiceTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.FortuneServiceTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  }
- ],
- "MembershipPaySwitchTest": [
-  {
-   "case": "com.etotem.cfc.service.MembershipPaySwitchTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;null&gt; but was: &lt;{levelCode=FAMILY, amount=131400, orderNo=ORD1793794208098005887C, payType=wechat, wechatPayParams={}, groupNo=null, totalPeriods=1, status=pending, periodNo=1}&gt;"
-  }
- ],
- "PaymentServiceORDRoutingTest": [
-  {
-   "case": "com.etotem.cfc.service.PaymentServiceORDRoutingTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;SUCCESS&gt; but was: &lt;FAIL&gt;"
-  }
- ],
- "ProductOrderServiceFulfillmentMultiModeTest": [
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "org.mockito.exceptions.misusing.InvalidUseOfMatchersException",
-   "msg": "&#10;Misplaced or misused argument matcher detected here:&#10;&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.ser"
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "org.mockito.exceptions.misusing.InvalidUseOfMatchersException",
-   "msg": "&#10;Misplaced or misused argument matcher detected here:&#10;&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.ser"
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest",
-   "type": "org.mockito.exceptions.misusing.InvalidUseOfMatchersException",
-   "msg": "&#10;Misplaced or misused argument matcher detected here:&#10;&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrderServiceFulfillmentMultiModeTest.java:71)&#10;-&gt; at com.etotem.cfc.ser"
-  }
- ],
- "ProductOrderServiceUpdateExpressFieldTest": [
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest",
-   "type": "org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent",
-   "msg": "&#10;Argument(s) are different! Wanted:&#10;wechatService.uploadShippingInfo(&#10;    &quot;O20261018001&quot;,&#10;    &quot;oABC123&quot;,&#10;    &quot;YT9876543210&quot;,&#10;    &quot;圆通速递&quot;,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest.updateExpress_fullUpdate_writesLogisticsColumnsAndSyncsWechat(ProductOrderServiceUpdateExpress"
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest",
-   "type": "org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent",
-   "msg": "&#10;Argument(s) are different! Wanted:&#10;wechatService.uploadShippingInfo(&#10;    &quot;O20261018001&quot;,&#10;    &quot;oABC123&quot;,&#10;    &quot;JD0000000001&quot;,&#10;    &quot;京东物流&quot;,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest.ship_writesLogisticsColumns(ProductOrderServiceUpdateExpressFieldTest.java:154)&#10;Actual inv"
-  },
-  {
-   "case": "com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest",
-   "type": "org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent",
-   "msg": "&#10;Argument(s) are different! Wanted:&#10;wechatService.uploadShippingInfo(&#10;    &quot;O20261018001&quot;,&#10;    &quot;oABC123&quot;,&#10;    &lt;Capturing argument&gt;,&#10;    &quot;中通快递&quot;,&#10;    &lt;any&gt;&#10;);&#10;-&gt; at com.etotem.cfc.service.ProductOrderServiceUpdateExpressFieldTest.updateExpress_onlyCompany_trackingFallsBackToPersistedLogisticsNo(ProductOrderServiceUpdateE"
-  }
- ],
- "ServiceRoleApproveTest": [
-  {
-   "case": "com.etotem.cfc.unit.ServiceRoleApproveTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  },
-  {
-   "case": "com.etotem.cfc.unit.ServiceRoleApproveTest",
-   "type": "java.lang.NullPointerException",
-   "msg": ""
-  }
- ],
- "TaskPlanServiceTest": [
-  {
-   "case": "com.etotem.cfc.unit.TaskPlanServiceTest",
-   "type": "org.opentest4j.AssertionFailedError",
-   "msg": "expected: &lt;100&gt; but was: &lt;null&gt;"
-  }
- ],
- "TaskProgressUpdateTest": [
-  {
-   "case": "com.etotem.cfc.unit.TaskProgressUpdateTest",
-   "type": "java.lang.NoSuchFieldException",
-   "msg": "platformPointsService"
-  },
-  {
-   "case": "com.etotem.cfc.unit.TaskProgressUpdateTest",
-   "type": "java.lang.NoSuchFieldException",
-   "msg": "platformPointsService"
-  },
-  {
-   "case": "com.etotem.cfc.unit.TaskProgressUpdateTest",
-   "type": "java.lang.NoSuchFieldException",
-   "msg": "platformPointsService"
-  }
- ]
-}

+ 0 - 307
_run34_agg.json

@@ -1,307 +0,0 @@
-{
- "source_test_classes": 202,
- "reported_classes": 202,
- "tests": 1512,
- "passed": 1369,
- "failures": 68,
- "errors": 71,
- "skipped": 4,
- "pass_rate": 90.54,
- "red_classes": 41,
- "red_cases": 139,
- "env_red_cases": 30,
- "nonenv_red_cases": 109,
- "pass_rate_ex_env": 92.53,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "GuideApplicationServiceTest",
-   "F": 0,
-   "E": 8,
-   "env": true,
-   "tests": 8
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GuidePackageServiceTest",
-   "F": 0,
-   "E": 6,
-   "env": true,
-   "tests": 13
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "DimensionEnergySyncServiceTest",
-   "F": 0,
-   "E": 5,
-   "env": true,
-   "tests": 5
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "DimensionScoreServiceImplTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 6
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "DailyOverviewServiceTest",
-   "F": 0,
-   "E": 1,
-   "env": true,
-   "tests": 1
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 202,
- "txt_only_classes": 0
-}

+ 0 - 279
_run35_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 204,
- "reported_classes": 204,
- "tests": 1528,
- "passed": 1404,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 91.88,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.41,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 204,
- "txt_only_classes": 0
-}

+ 0 - 279
_run36_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 204,
- "reported_classes": 204,
- "tests": 1528,
- "passed": 1404,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 91.88,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.41,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 204,
- "txt_only_classes": 0
-}

+ 0 - 279
_run37_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 204,
- "reported_classes": 204,
- "tests": 1528,
- "passed": 1404,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 91.88,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.41,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 204,
- "txt_only_classes": 0
-}

+ 0 - 284
_run38_agg.json

@@ -1,284 +0,0 @@
-{
- "source_test_classes": 208,
- "reported_classes": 204,
- "tests": 1528,
- "passed": 1404,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 91.88,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.41,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [
-  "FamilyUserSwitchRoleTest",
-  "JwtInterceptorWechatLoginTest",
-  "ScG06JwtGuardTest",
-  "UserServiceWechatLoginTest"
- ],
- "xml_only_classes": 204,
- "txt_only_classes": 0
-}

+ 0 - 279
_run39_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 214,
- "reported_classes": 214,
- "tests": 1634,
- "passed": 1510,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 92.41,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.9,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 214,
- "txt_only_classes": 0
-}

+ 0 - 279
_run40_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 215,
- "reported_classes": 215,
- "tests": 1648,
- "passed": 1524,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 92.48,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.96,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 215,
- "txt_only_classes": 0
-}

+ 0 - 0
_run40_npm_audit_frontend.err


+ 0 - 3802
_run40_npm_audit_frontend.json

@@ -1,3802 +0,0 @@
-{
-  "auditReportVersion": 2,
-  "vulnerabilities": {
-    "@dcloudio/uni-template-compiler": {
-      "name": "@dcloudio/uni-template-compiler",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "vue-template-compiler"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/@dcloudio/uni-template-compiler"
-      ],
-      "fixAvailable": false
-    },
-    "@dcloudio/vue-cli-plugin-uni": {
-      "name": "@dcloudio/vue-cli-plugin-uni",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "postcss-import",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/@dcloudio/vue-cli-plugin-uni"
-      ],
-      "fixAvailable": false
-    },
-    "@intervolga/optimize-cssnano-plugin": {
-      "name": "@intervolga/optimize-cssnano-plugin",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "cssnano",
-        "cssnano-preset-default",
-        "postcss"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/@intervolga/optimize-cssnano-plugin"
-      ],
-      "fixAvailable": true
-    },
-    "@jest/core": {
-      "name": "@jest/core",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@jest/reporters",
-        "@jest/transform",
-        "jest-config",
-        "jest-haste-map",
-        "jest-resolve-dependencies",
-        "jest-runner",
-        "jest-runtime",
-        "jest-snapshot"
-      ],
-      "effects": [
-        "jest"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@jest/core"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "@jest/reporters": {
-      "name": "@jest/reporters",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@jest/transform",
-        "jest-haste-map",
-        "node-notifier"
-      ],
-      "effects": [
-        "@jest/core"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@jest/reporters"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "@jest/test-sequencer": {
-      "name": "@jest/test-sequencer",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-haste-map",
-        "jest-runner",
-        "jest-runtime"
-      ],
-      "effects": [
-        "jest-config"
-      ],
-      "range": "<=26.6.3",
-      "nodes": [
-        "node_modules/@jest/test-sequencer"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "@jest/transform": {
-      "name": "@jest/transform",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-haste-map"
-      ],
-      "effects": [
-        "babel-jest",
-        "jest-runtime"
-      ],
-      "range": "<=26.6.2",
-      "nodes": [
-        "node_modules/@jest/transform"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "@tootallnate/once": {
-      "name": "@tootallnate/once",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1119438,
-          "name": "@tootallnate/once",
-          "dependency": "@tootallnate/once",
-          "title": "@tootallnate/once vulnerable to Incorrect Control Flow Scoping",
-          "url": "https://github.com/advisories/GHSA-vpq2-c234-7xj6",
-          "severity": "low",
-          "cwe": [
-            "CWE-705"
-          ],
-          "cvss": {
-            "score": 3.3,
-            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<2.0.1"
-        }
-      ],
-      "effects": [
-        "http-proxy-agent"
-      ],
-      "range": "<2.0.1",
-      "nodes": [
-        "node_modules/@tootallnate/once"
-      ],
-      "fixAvailable": true
-    },
-    "@types/webpack-dev-server": {
-      "name": "@types/webpack-dev-server",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "http-proxy-middleware"
-      ],
-      "effects": [],
-      "range": "3.11.2 - 4.0.3",
-      "nodes": [
-        "node_modules/@types/webpack-dev-server"
-      ],
-      "fixAvailable": true
-    },
-    "@vue/babel-plugin-jsx": {
-      "name": "@vue/babel-plugin-jsx",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/babel-plugin-resolve-type"
-      ],
-      "effects": [],
-      "range": "1.2.0-alpha.0 - 1.2.0 || 1.5.0",
-      "nodes": [
-        "node_modules/@vue/babel-plugin-jsx"
-      ],
-      "fixAvailable": true
-    },
-    "@vue/babel-plugin-resolve-type": {
-      "name": "@vue/babel-plugin-resolve-type",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/compiler-sfc"
-      ],
-      "effects": [
-        "@vue/babel-plugin-jsx"
-      ],
-      "range": "<=1.2.0-beta.0",
-      "nodes": [
-        "node_modules/@vue/babel-plugin-resolve-type"
-      ],
-      "fixAvailable": true
-    },
-    "@vue/cli-plugin-babel": {
-      "name": "@vue/cli-plugin-babel",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "@vue/cli-shared-utils",
-        "webpack"
-      ],
-      "effects": [],
-      "range": "3.4.0 - 4.5.19",
-      "nodes": [
-        "node_modules/@vue/cli-plugin-babel"
-      ],
-      "fixAvailable": {
-        "name": "@vue/cli-plugin-babel",
-        "version": "5.0.9",
-        "isSemVerMajor": true
-      }
-    },
-    "@vue/cli-plugin-router": {
-      "name": "@vue/cli-plugin-router",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/cli-shared-utils"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "<=4.5.19",
-      "nodes": [
-        "node_modules/@vue/cli-plugin-router"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/cli-service": {
-      "name": "@vue/cli-service",
-      "severity": "critical",
-      "isDirect": true,
-      "via": [
-        "@intervolga/optimize-cssnano-plugin",
-        "@vue/cli-plugin-router",
-        "@vue/cli-shared-utils",
-        "@vue/component-compiler-utils",
-        "autoprefixer",
-        "copy-webpack-plugin",
-        "css-loader",
-        "cssnano",
-        "globby",
-        "html-webpack-plugin",
-        "postcss-loader",
-        "terser-webpack-plugin",
-        "vue-loader",
-        "webpack",
-        "webpack-dev-server"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/cli-service"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/cli-shared-utils": {
-      "name": "@vue/cli-shared-utils",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "request"
-      ],
-      "effects": [
-        "@vue/cli-plugin-babel",
-        "@vue/cli-plugin-router"
-      ],
-      "range": "<=4.5.19",
-      "nodes": [
-        "node_modules/@vue/cli-shared-utils"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/compiler-sfc": {
-      "name": "@vue/compiler-sfc",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "postcss"
-      ],
-      "effects": [
-        "@vue/babel-plugin-resolve-type",
-        "vue"
-      ],
-      "range": "3.0.0-alpha.0 - 3.0.5",
-      "nodes": [
-        "node_modules/@vue/compiler-sfc"
-      ],
-      "fixAvailable": {
-        "name": "vue",
-        "version": "3.5.44",
-        "isSemVerMajor": true
-      }
-    },
-    "@vue/component-compiler-utils": {
-      "name": "@vue/component-compiler-utils",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [
-        "@vue/cli-service",
-        "vue-loader"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/component-compiler-utils"
-      ],
-      "fixAvailable": false
-    },
-    "anymatch": {
-      "name": "anymatch",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "micromatch"
-      ],
-      "effects": [
-        "chokidar",
-        "sane"
-      ],
-      "range": "1.2.0 - 2.0.0",
-      "nodes": [
-        "node_modules/sane/node_modules/anymatch",
-        "node_modules/watchpack-chokidar2/node_modules/anymatch",
-        "node_modules/webpack-dev-server/node_modules/anymatch"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "autoprefixer": {
-      "name": "autoprefixer",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "1.0.20131222 - 9.8.8",
-      "nodes": [
-        "node_modules/autoprefixer"
-      ],
-      "fixAvailable": true
-    },
-    "babel-jest": {
-      "name": "babel-jest",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "@jest/transform"
-      ],
-      "effects": [
-        "jest-config"
-      ],
-      "range": "24.2.0-alpha.0 - 26.6.3",
-      "nodes": [
-        "node_modules/babel-jest"
-      ],
-      "fixAvailable": {
-        "name": "babel-jest",
-        "version": "30.5.2",
-        "isSemVerMajor": true
-      }
-    },
-    "body-parser": {
-      "name": "body-parser",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1243073,
-          "name": "body-parser",
-          "dependency": "body-parser",
-          "title": "body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body",
-          "url": "https://github.com/advisories/GHSA-27r3-jxmh-p828",
-          "severity": "high",
-          "cwe": [
-            "CWE-248"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.20.9"
-        }
-      ],
-      "effects": [],
-      "range": "<1.20.9",
-      "nodes": [
-        "node_modules/body-parser"
-      ],
-      "fixAvailable": true
-    },
-    "brace-expansion": {
-      "name": "brace-expansion",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1240100,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: Quadratic-time expansion of the `{a},b}` rewrite causes CPU denial of service",
-          "url": "https://github.com/advisories/GHSA-q2hr-2g5m-vwhr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<1.1.21"
-        },
-        {
-          "source": 1240101,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: Quadratic-time expansion of the `{a},b}` rewrite causes CPU denial of service",
-          "url": "https://github.com/advisories/GHSA-q2hr-2g5m-vwhr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.0.0 <2.1.7"
-        },
-        {
-          "source": 1240104,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-qhr7-859c-m2p7",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.20"
-        },
-        {
-          "source": 1240105,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-qhr7-859c-m2p7",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.6"
-        },
-        {
-          "source": 1240108,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-6j4f-fj2g-mc7p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.19"
-        },
-        {
-          "source": 1240109,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-6j4f-fj2g-mc7p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.5"
-        }
-      ],
-      "effects": [],
-      "range": "<=1.1.20 || 2.0.0 - 2.1.6",
-      "nodes": [
-        "node_modules/brace-expansion",
-        "node_modules/filelist/node_modules/brace-expansion"
-      ],
-      "fixAvailable": true
-    },
-    "braces": {
-      "name": "braces",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1098094,
-          "name": "braces",
-          "dependency": "braces",
-          "title": "Uncontrolled resource consumption in braces",
-          "url": "https://github.com/advisories/GHSA-grv7-fg5c-xmjg",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-1050"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<3.0.3"
-        }
-      ],
-      "effects": [
-        "chokidar",
-        "micromatch"
-      ],
-      "range": "<3.0.3",
-      "nodes": [
-        "node_modules/globby/node_modules/braces",
-        "node_modules/sane/node_modules/braces",
-        "node_modules/watchpack-chokidar2/node_modules/braces",
-        "node_modules/webpack-dev-server/node_modules/braces",
-        "node_modules/webpack/node_modules/braces"
-      ],
-      "fixAvailable": false
-    },
-    "browserify-sign": {
-      "name": "browserify-sign",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "elliptic"
-      ],
-      "effects": [
-        "crypto-browserify"
-      ],
-      "range": ">=2.4.0",
-      "nodes": [
-        "node_modules/browserify-sign"
-      ],
-      "fixAvailable": false
-    },
-    "chokidar": {
-      "name": "chokidar",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "anymatch",
-        "braces",
-        "readdirp"
-      ],
-      "effects": [
-        "watchpack-chokidar2",
-        "webpack-dev-server"
-      ],
-      "range": "1.3.0 - 2.1.8",
-      "nodes": [
-        "node_modules/watchpack-chokidar2/node_modules/chokidar",
-        "node_modules/webpack-dev-server/node_modules/chokidar"
-      ],
-      "fixAvailable": false
-    },
-    "compression": {
-      "name": "compression",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241221,
-          "name": "compression",
-          "dependency": "compression",
-          "title": "compression vulnerable to Denial of Service via memory leak on premature response close",
-          "url": "https://github.com/advisories/GHSA-vc2v-76pw-4v95",
-          "severity": "high",
-          "cwe": [
-            "CWE-401",
-            "CWE-459"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.8.2"
-        }
-      ],
-      "effects": [],
-      "range": "<1.8.2",
-      "nodes": [
-        "node_modules/compression"
-      ],
-      "fixAvailable": true
-    },
-    "copy-webpack-plugin": {
-      "name": "copy-webpack-plugin",
-      "severity": "high",
-      "isDirect": true,
-      "via": [
-        "serialize-javascript",
-        "webpack-log"
-      ],
-      "effects": [],
-      "range": "4.3.0 - 13.0.1",
-      "nodes": [
-        "node_modules/copy-webpack-plugin"
-      ],
-      "fixAvailable": {
-        "name": "copy-webpack-plugin",
-        "version": "14.0.0",
-        "isSemVerMajor": true
-      }
-    },
-    "create-ecdh": {
-      "name": "create-ecdh",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "elliptic"
-      ],
-      "effects": [
-        "crypto-browserify"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/create-ecdh"
-      ],
-      "fixAvailable": false
-    },
-    "crypto-browserify": {
-      "name": "crypto-browserify",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "browserify-sign",
-        "create-ecdh"
-      ],
-      "effects": [
-        "node-libs-browser"
-      ],
-      "range": ">=3.4.0",
-      "nodes": [
-        "node_modules/crypto-browserify"
-      ],
-      "fixAvailable": false
-    },
-    "css-declaration-sorter": {
-      "name": "css-declaration-sorter",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=5.1.2",
-      "nodes": [
-        "node_modules/css-declaration-sorter"
-      ],
-      "fixAvailable": true
-    },
-    "css-loader": {
-      "name": "css-loader",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "icss-utils",
-        "postcss",
-        "postcss-modules-extract-imports",
-        "postcss-modules-local-by-default",
-        "postcss-modules-scope",
-        "postcss-modules-values"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "0.15.0 - 4.3.0",
-      "nodes": [
-        "node_modules/css-loader"
-      ],
-      "fixAvailable": false
-    },
-    "css-select": {
-      "name": "css-select",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "nth-check"
-      ],
-      "effects": [
-        "svgo"
-      ],
-      "range": "<=3.1.0",
-      "nodes": [
-        "node_modules/svgo/node_modules/css-select"
-      ],
-      "fixAvailable": true
-    },
-    "cssnano": {
-      "name": "cssnano",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "cssnano-preset-default",
-        "postcss"
-      ],
-      "effects": [
-        "@intervolga/optimize-cssnano-plugin",
-        "@vue/cli-service"
-      ],
-      "range": "<=4.1.11",
-      "nodes": [
-        "node_modules/cssnano"
-      ],
-      "fixAvailable": false
-    },
-    "cssnano-preset-default": {
-      "name": "cssnano-preset-default",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "css-declaration-sorter",
-        "cssnano-util-raw-cache",
-        "postcss",
-        "postcss-calc",
-        "postcss-colormin",
-        "postcss-convert-values",
-        "postcss-discard-comments",
-        "postcss-discard-duplicates",
-        "postcss-discard-empty",
-        "postcss-discard-overridden",
-        "postcss-merge-longhand",
-        "postcss-merge-rules",
-        "postcss-minify-font-values",
-        "postcss-minify-gradients",
-        "postcss-minify-params",
-        "postcss-minify-selectors",
-        "postcss-normalize-charset",
-        "postcss-normalize-display-values",
-        "postcss-normalize-positions",
-        "postcss-normalize-repeat-style",
-        "postcss-normalize-string",
-        "postcss-normalize-timing-functions",
-        "postcss-normalize-unicode",
-        "postcss-normalize-url",
-        "postcss-normalize-whitespace",
-        "postcss-ordered-values",
-        "postcss-reduce-initial",
-        "postcss-reduce-transforms",
-        "postcss-svgo",
-        "postcss-unique-selectors"
-      ],
-      "effects": [
-        "cssnano"
-      ],
-      "range": "<=4.0.8",
-      "nodes": [
-        "node_modules/cssnano-preset-default"
-      ],
-      "fixAvailable": false
-    },
-    "cssnano-util-raw-cache": {
-      "name": "cssnano-util-raw-cache",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/cssnano-util-raw-cache"
-      ],
-      "fixAvailable": true
-    },
-    "decode-uri-component": {
-      "name": "decode-uri-component",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1147955,
-          "name": "decode-uri-component",
-          "dependency": "decode-uri-component",
-          "title": "decode-uri-component: Denial of service via exponential decoding of malformed percent-encoded input",
-          "url": "https://github.com/advisories/GHSA-vcc3-ghjq-m6fr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-405",
-            "CWE-407",
-            "CWE-1176"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=0.4.2"
-        },
-        {
-          "source": 1243857,
-          "name": "decode-uri-component",
-          "dependency": "decode-uri-component",
-          "title": "decode-uri-component vulnerable to denial of service via quadratic replacement of percent-encoded runs",
-          "url": "https://github.com/advisories/GHSA-qr28-fpjm-wq7f",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=0.5.0"
-        }
-      ],
-      "effects": [
-        "source-map-resolve"
-      ],
-      "range": "<=0.5.0",
-      "nodes": [
-        "node_modules/decode-uri-component"
-      ],
-      "fixAvailable": true
-    },
-    "deepmerge": {
-      "name": "deepmerge",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1243505,
-          "name": "deepmerge",
-          "dependency": "deepmerge",
-          "title": "deepmerge mergeObject() allows prototype poisoning of returned objects",
-          "url": "https://github.com/advisories/GHSA-gcqx-w48m-w2h4",
-          "severity": "low",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=4.2.0 <=4.3.1"
-        }
-      ],
-      "effects": [
-        "jest-config"
-      ],
-      "range": ">=4.2.0",
-      "nodes": [
-        "node_modules/deepmerge"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "editorconfig": {
-      "name": "editorconfig",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "minimatch"
-      ],
-      "effects": [
-        "js-beautify"
-      ],
-      "range": ">=1.0.3",
-      "nodes": [
-        "node_modules/editorconfig"
-      ],
-      "fixAvailable": true
-    },
-    "elliptic": {
-      "name": "elliptic",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1112030,
-          "name": "elliptic",
-          "dependency": "elliptic",
-          "title": "Elliptic Uses a Cryptographic Primitive with a Risky Implementation",
-          "url": "https://github.com/advisories/GHSA-848j-6mx2-7j84",
-          "severity": "low",
-          "cwe": [
-            "CWE-1240"
-          ],
-          "cvss": {
-            "score": 5.6,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L"
-          },
-          "range": "<=6.6.1"
-        }
-      ],
-      "effects": [
-        "browserify-sign",
-        "create-ecdh"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/elliptic"
-      ],
-      "fixAvailable": false
-    },
-    "fast-glob": {
-      "name": "fast-glob",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "micromatch"
-      ],
-      "effects": [
-        "globby"
-      ],
-      "range": "<=2.2.7",
-      "nodes": [
-        "node_modules/globby/node_modules/fast-glob"
-      ],
-      "fixAvailable": true
-    },
-    "follow-redirects": {
-      "name": "follow-redirects",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1242604,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects array-form headers bypass cross-origin credential stripping",
-          "url": "https://github.com/advisories/GHSA-q3jh-wrc6-jgq8",
-          "severity": "high",
-          "cwe": [
-            "CWE-200",
-            "CWE-212"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.16.0 <1.16.1"
-        },
-        {
-          "source": 1242605,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects sensitiveHeaders regex escaping can expose credential headers",
-          "url": "https://github.com/advisories/GHSA-8r9p-f939-6h3c",
-          "severity": "high",
-          "cwe": [
-            "CWE-185",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.16.0 <1.16.1"
-        },
-        {
-          "source": 1244003,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects: Cross-realm sensitiveHeaders arrays are discarded and custom credentials can follow redirects",
-          "url": "https://github.com/advisories/GHSA-mrwp-f3q8-3g9p",
-          "severity": "high",
-          "cwe": [
-            "CWE-201"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": ">=1.16.0 <=1.16.1"
-        }
-      ],
-      "effects": [],
-      "range": "1.16.0 - 1.16.1",
-      "nodes": [
-        "node_modules/follow-redirects"
-      ],
-      "fixAvailable": true
-    },
-    "form-data": {
-      "name": "form-data",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1109540,
-          "name": "form-data",
-          "dependency": "form-data",
-          "title": "form-data uses unsafe random function in form-data for choosing boundary",
-          "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
-          "severity": "critical",
-          "cwe": [
-            "CWE-330"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<2.5.4"
-        },
-        {
-          "source": 1120745,
-          "name": "form-data",
-          "dependency": "form-data",
-          "title": "form-data: CRLF injection in form-data via unescaped multipart field names and filenames",
-          "url": "https://github.com/advisories/GHSA-hmw2-7cc7-3qxx",
-          "severity": "high",
-          "cwe": [
-            "CWE-93"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<2.5.6"
-        }
-      ],
-      "effects": [
-        "request"
-      ],
-      "range": "<=2.5.5",
-      "nodes": [
-        "node_modules/request/node_modules/form-data"
-      ],
-      "fixAvailable": false
-    },
-    "glob": {
-      "name": "glob",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1244013,
-          "name": "glob",
-          "dependency": "glob",
-          "title": "Glob: AbortSignal cancellation bypass allows post-timeout filesystem traversal",
-          "url": "https://github.com/advisories/GHSA-3g3m-2fjr-6pw4",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=9.0.0 <=14.0.1"
-        },
-        "minimatch"
-      ],
-      "effects": [
-        "js-beautify"
-      ],
-      "range": "9.0.0 - 14.0.1",
-      "nodes": [
-        "node_modules/js-beautify/node_modules/glob"
-      ],
-      "fixAvailable": true
-    },
-    "globby": {
-      "name": "globby",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "fast-glob"
-      ],
-      "effects": [],
-      "range": "8.0.0 - 9.2.0",
-      "nodes": [
-        "node_modules/globby"
-      ],
-      "fixAvailable": true
-    },
-    "html-minifier": {
-      "name": "html-minifier",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1105440,
-          "name": "html-minifier",
-          "dependency": "html-minifier",
-          "title": "kangax html-minifier REDoS vulnerability",
-          "url": "https://github.com/advisories/GHSA-pfq8-rq6v-vf5m",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=4.0.0"
-        }
-      ],
-      "effects": [
-        "html-webpack-plugin"
-      ],
-      "range": "<=4.0.0",
-      "nodes": [
-        "node_modules/html-minifier"
-      ],
-      "fixAvailable": false
-    },
-    "html-webpack-plugin": {
-      "name": "html-webpack-plugin",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        "html-minifier",
-        "loader-utils"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "1.4.0 - 4.0.0-beta.14",
-      "nodes": [
-        "node_modules/html-webpack-plugin"
-      ],
-      "fixAvailable": false
-    },
-    "http-proxy-agent": {
-      "name": "http-proxy-agent",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "@tootallnate/once"
-      ],
-      "effects": [
-        "jsdom"
-      ],
-      "range": "4.0.1",
-      "nodes": [
-        "node_modules/http-proxy-agent"
-      ],
-      "fixAvailable": true
-    },
-    "http-proxy-middleware": {
-      "name": "http-proxy-middleware",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1100223,
-          "name": "http-proxy-middleware",
-          "dependency": "http-proxy-middleware",
-          "title": "Denial of service in http-proxy-middleware",
-          "url": "https://github.com/advisories/GHSA-c7qv-q95q-8v27",
-          "severity": "high",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<2.0.7"
-        },
-        {
-          "source": 1104105,
-          "name": "http-proxy-middleware",
-          "dependency": "http-proxy-middleware",
-          "title": "http-proxy-middleware allows fixRequestBody to proceed even if bodyParser has failed",
-          "url": "https://github.com/advisories/GHSA-9gqv-wp59-fq42",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-754"
-          ],
-          "cvss": {
-            "score": 4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:N"
-          },
-          "range": ">=1.3.0 <2.0.9"
-        },
-        {
-          "source": 1104106,
-          "name": "http-proxy-middleware",
-          "dependency": "http-proxy-middleware",
-          "title": "http-proxy-middleware can call writeBody twice because \"else if\" is not used",
-          "url": "https://github.com/advisories/GHSA-4www-5p9h-95mh",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-670"
-          ],
-          "cvss": {
-            "score": 4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:N/A:L"
-          },
-          "range": ">=1.3.0 <2.0.8"
-        },
-        {
-          "source": 1121360,
-          "name": "http-proxy-middleware",
-          "dependency": "http-proxy-middleware",
-          "title": "http-proxy-middleware `router` host+path substring matching allows Host-header-driven backend routing bypass",
-          "url": "https://github.com/advisories/GHSA-64mm-vxmg-q3vj",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-20",
-            "CWE-187"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=0.16.0 <2.0.10"
-        },
-        "micromatch"
-      ],
-      "effects": [
-        "@types/webpack-dev-server",
-        "webpack-dev-server"
-      ],
-      "range": "<=2.0.10-beta.0",
-      "nodes": [
-        "node_modules/http-proxy-middleware",
-        "node_modules/webpack-dev-server/node_modules/http-proxy-middleware"
-      ],
-      "fixAvailable": false
-    },
-    "icss-utils": {
-      "name": "icss-utils",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [
-        "css-loader",
-        "postcss-modules-local-by-default",
-        "postcss-modules-values"
-      ],
-      "range": "<=4.1.1",
-      "nodes": [
-        "node_modules/icss-utils"
-      ],
-      "fixAvailable": false
-    },
-    "ip": {
-      "name": "ip",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1101851,
-          "name": "ip",
-          "dependency": "ip",
-          "title": "ip SSRF improper categorization in isPublic",
-          "url": "https://github.com/advisories/GHSA-2p57-rm9w-gvfp",
-          "severity": "high",
-          "cwe": [
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 8.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": "<=2.0.1"
-        }
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/ip"
-      ],
-      "fixAvailable": false
-    },
-    "jest": {
-      "name": "jest",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        "@jest/core",
-        "jest-cli"
-      ],
-      "effects": [],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/jest"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-cli": {
-      "name": "jest-cli",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "@jest/core",
-        "jest-config"
-      ],
-      "effects": [],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/jest-cli"
-      ],
-      "fixAvailable": true
-    },
-    "jest-config": {
-      "name": "jest-config",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@jest/test-sequencer",
-        "babel-jest",
-        "deepmerge",
-        "jest-jasmine2"
-      ],
-      "effects": [
-        "@jest/core",
-        "jest-cli",
-        "jest-runner",
-        "jest-runtime"
-      ],
-      "range": ">=24.2.0-alpha.0",
-      "nodes": [
-        "node_modules/jest-config"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-haste-map": {
-      "name": "jest-haste-map",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "sane"
-      ],
-      "effects": [
-        "@jest/core",
-        "@jest/reporters",
-        "@jest/test-sequencer",
-        "@jest/transform",
-        "jest-runner",
-        "jest-runtime",
-        "jest-snapshot"
-      ],
-      "range": "24.0.0-alpha.0 - 26.6.2",
-      "nodes": [
-        "node_modules/jest-haste-map"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-jasmine2": {
-      "name": "jest-jasmine2",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-runtime",
-        "jest-snapshot"
-      ],
-      "effects": [],
-      "range": "25.2.0-alpha.86 - 26.6.3",
-      "nodes": [
-        "node_modules/jest-jasmine2"
-      ],
-      "fixAvailable": true
-    },
-    "jest-resolve-dependencies": {
-      "name": "jest-resolve-dependencies",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-snapshot"
-      ],
-      "effects": [],
-      "range": "26.1.0 - 26.6.3",
-      "nodes": [
-        "node_modules/jest-resolve-dependencies"
-      ],
-      "fixAvailable": true
-    },
-    "jest-runner": {
-      "name": "jest-runner",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-config",
-        "jest-haste-map",
-        "jest-runtime"
-      ],
-      "effects": [
-        "@jest/core",
-        "@jest/test-sequencer"
-      ],
-      "range": "24.0.0-alpha.0 - 27.0.1",
-      "nodes": [
-        "node_modules/jest-runner"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-runtime": {
-      "name": "jest-runtime",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@jest/transform",
-        "jest-config",
-        "jest-haste-map",
-        "jest-snapshot"
-      ],
-      "effects": [
-        "jest-jasmine2",
-        "jest-runner"
-      ],
-      "range": "24.0.0-alpha.0 - 26.6.3",
-      "nodes": [
-        "node_modules/jest-runtime"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-snapshot": {
-      "name": "jest-snapshot",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "jest-haste-map"
-      ],
-      "effects": [
-        "@jest/core",
-        "jest-jasmine2",
-        "jest-resolve-dependencies",
-        "jest-runtime"
-      ],
-      "range": "24.2.0-alpha.0 - 24.5.0 || 26.1.0 - 26.6.2",
-      "nodes": [
-        "node_modules/jest-snapshot"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "js-beautify": {
-      "name": "js-beautify",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "editorconfig",
-        "glob"
-      ],
-      "effects": [],
-      "range": ">=1.14.9",
-      "nodes": [
-        "node_modules/js-beautify"
-      ],
-      "fixAvailable": true
-    },
-    "js-yaml": {
-      "name": "js-yaml",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1138114,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported",
-          "url": "https://github.com/advisories/GHSA-5p4m-2wfm-xmqj",
-          "severity": "high",
-          "cwe": [
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=3.0.0 <3.15.1"
-        },
-        {
-          "source": 1193726,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources",
-          "url": "https://github.com/advisories/GHSA-2883-xcg3-v3hh",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=3.0.0 <3.15.2"
-        }
-      ],
-      "effects": [],
-      "range": "3.0.0 - 3.15.1",
-      "nodes": [
-        "node_modules/js-yaml"
-      ],
-      "fixAvailable": true
-    },
-    "jsdom": {
-      "name": "jsdom",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "http-proxy-agent"
-      ],
-      "effects": [],
-      "range": "16.6.0 - 17.0.0",
-      "nodes": [
-        "node_modules/jsdom"
-      ],
-      "fixAvailable": true
-    },
-    "json5": {
-      "name": "json5",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1096543,
-          "name": "json5",
-          "dependency": "json5",
-          "title": "Prototype Pollution in JSON5 via Parse Method",
-          "url": "https://github.com/advisories/GHSA-9c47-m6qq-7p4h",
-          "severity": "high",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 7.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:L/A:H"
-          },
-          "range": "<1.0.2"
-        }
-      ],
-      "effects": [
-        "loader-utils"
-      ],
-      "range": "<1.0.2",
-      "nodes": [
-        "node_modules/html-webpack-plugin/node_modules/json5"
-      ],
-      "fixAvailable": false
-    },
-    "launch-editor": {
-      "name": "launch-editor",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1242627,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: escapeCmdArgs() omits % escaping on Windows",
-          "url": "https://github.com/advisories/GHSA-698v-4r3x-3vcv",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-78"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        },
-        {
-          "source": 1242656,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: Editor CLI flag misinterpretation causing arbitrary command execution for some editors",
-          "url": "https://github.com/advisories/GHSA-r825-w8mm-5pxw",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-88"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        },
-        {
-          "source": 1242663,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: `fs.existsSync()` existence check can be bypassed on Windows",
-          "url": "https://github.com/advisories/GHSA-587h-7wmj-h5pm",
-          "severity": "high",
-          "cwe": [
-            "CWE-77"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        }
-      ],
-      "effects": [],
-      "range": "<=2.14.1",
-      "nodes": [
-        "node_modules/launch-editor"
-      ],
-      "fixAvailable": true
-    },
-    "loader-utils": {
-      "name": "loader-utils",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1094088,
-          "name": "loader-utils",
-          "dependency": "loader-utils",
-          "title": "Prototype pollution in webpack loader-utils",
-          "url": "https://github.com/advisories/GHSA-76p3-8jx3-jpfq",
-          "severity": "critical",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 9.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": "<1.4.1"
-        },
-        "json5"
-      ],
-      "effects": [
-        "html-webpack-plugin"
-      ],
-      "range": "<=1.4.0",
-      "nodes": [
-        "node_modules/html-webpack-plugin/node_modules/loader-utils"
-      ],
-      "fixAvailable": false
-    },
-    "micromatch": {
-      "name": "micromatch",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1098681,
-          "name": "micromatch",
-          "dependency": "micromatch",
-          "title": "Regular Expression Denial of Service (ReDoS) in micromatch",
-          "url": "https://github.com/advisories/GHSA-952p-6rrq-rcjv",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<4.0.8"
-        },
-        "braces"
-      ],
-      "effects": [
-        "anymatch",
-        "fast-glob",
-        "http-proxy-middleware",
-        "readdirp",
-        "sane",
-        "webpack"
-      ],
-      "range": "<=4.0.7",
-      "nodes": [
-        "node_modules/globby/node_modules/micromatch",
-        "node_modules/sane/node_modules/micromatch",
-        "node_modules/watchpack-chokidar2/node_modules/micromatch",
-        "node_modules/webpack-dev-server/node_modules/micromatch",
-        "node_modules/webpack/node_modules/micromatch"
-      ],
-      "fixAvailable": false
-    },
-    "minimatch": {
-      "name": "minimatch",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1244623,
-          "name": "minimatch",
-          "dependency": "minimatch",
-          "title": "minimatch has potential denial of service via globparts amplification",
-          "url": "https://github.com/advisories/GHSA-g3hv-75wg-m249",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-405"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=7.0.0 <11.0.1"
-        }
-      ],
-      "effects": [
-        "editorconfig",
-        "glob"
-      ],
-      "range": "7.0.0 - 11.0.0",
-      "nodes": [
-        "node_modules/editorconfig/node_modules/minimatch",
-        "node_modules/js-beautify/node_modules/minimatch"
-      ],
-      "fixAvailable": true
-    },
-    "node-forge": {
-      "name": "node-forge",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1088227,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Prototype Pollution in node-forge debug API.",
-          "url": "https://github.com/advisories/GHSA-5rrq-pxf6-6jx5",
-          "severity": "low",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<1.0.0"
-        },
-        {
-          "source": 1088229,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "URL parsing in node-forge could lead to undesired behavior.",
-          "url": "https://github.com/advisories/GHSA-gf8q-jrpm-jvxq",
-          "severity": "low",
-          "cwe": [
-            "CWE-601"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<1.0.0"
-        },
-        {
-          "source": 1088746,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Improper Verification of Cryptographic Signature in `node-forge`",
-          "url": "https://github.com/advisories/GHSA-2r2c-g63r-vccr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<1.3.0"
-        },
-        {
-          "source": 1093719,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Open Redirect in node-forge",
-          "url": "https://github.com/advisories/GHSA-8fr3-hfg3-gpgp",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-601"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": "<1.0.0"
-        },
-        {
-          "source": 1102321,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Improper Verification of Cryptographic Signature in node-forge",
-          "url": "https://github.com/advisories/GHSA-x4jg-mjrx-434g",
-          "severity": "high",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<1.3.0"
-        },
-        {
-          "source": 1102322,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Improper Verification of Cryptographic Signature in node-forge",
-          "url": "https://github.com/advisories/GHSA-cfm4-qjh2-4765",
-          "severity": "high",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<1.3.0"
-        },
-        {
-          "source": 1110996,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "node-forge has ASN.1 Unbounded Recursion",
-          "url": "https://github.com/advisories/GHSA-554w-wpv2-vw27",
-          "severity": "high",
-          "cwe": [
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<1.3.2"
-        },
-        {
-          "source": 1110998,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "node-forge has an Interpretation Conflict vulnerability via its ASN.1 Validator Desynchronization",
-          "url": "https://github.com/advisories/GHSA-5gfm-wpxj-wjgq",
-          "severity": "high",
-          "cwe": [
-            "CWE-436"
-          ],
-          "cvss": {
-            "score": 8.6,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N"
-          },
-          "range": "<1.3.2"
-        },
-        {
-          "source": 1111068,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "node-forge is vulnerable to ASN.1 OID Integer Truncation",
-          "url": "https://github.com/advisories/GHSA-65ch-62r8-g69g",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-190"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<1.3.2"
-        },
-        {
-          "source": 1115545,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge has a basicConstraints bypass in its certificate chain verification (RFC 5280 violation)",
-          "url": "https://github.com/advisories/GHSA-2328-f5f3-gj25",
-          "severity": "high",
-          "cwe": [
-            "CWE-295"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": "<=1.3.3"
-        },
-        {
-          "source": 1115546,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge has signature forgery in Ed25519 due to missing S > L check",
-          "url": "https://github.com/advisories/GHSA-q67f-28xg-22rw",
-          "severity": "high",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<1.4.0"
-        },
-        {
-          "source": 1115548,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge has Denial of Service via Infinite Loop in BigInteger.modInverse() with Zero Input",
-          "url": "https://github.com/advisories/GHSA-5m6q-g25r-mvwx",
-          "severity": "high",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.4.0"
-        },
-        {
-          "source": 1115612,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge has signature forgery in RSA-PKCS due to ASN.1 extra field  ",
-          "url": "https://github.com/advisories/GHSA-ppp5-5v6c-4jwp",
-          "severity": "high",
-          "cwe": [
-            "CWE-20",
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<1.4.0"
-        },
-        {
-          "source": 1240912,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "node-forge RSA PKCS#1 v1.5 signature verification accepts extra nested DigestAlgorithm elements",
-          "url": "https://github.com/advisories/GHSA-86w9-cpqp-85rv",
-          "severity": "high",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244014,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: ASN.1 OID first arc truncation in asn1.oidToDer",
-          "url": "https://github.com/advisories/GHSA-4642-5mcj-2rqw",
-          "severity": "low",
-          "cwe": [
-            "CWE-190"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244015,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Prototype Pollution in forge.http cookie handling via a malicious Set-Cookie",
-          "url": "https://github.com/advisories/GHSA-6wvx-3r32-xmcg",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 4.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244016,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: TLS client crash when the server sends no certificate",
-          "url": "https://github.com/advisories/GHSA-525v-9gp9-w22h",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-476"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244017,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Regular expression denial of service in PEM decoding (pem.decode)",
-          "url": "https://github.com/advisories/GHSA-7wch-p9px-956x",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244018,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of Service via infinite loop in BigInteger.modInverse() with negative input (incomplete fix of CVE-2026-33891)",
-          "url": "https://github.com/advisories/GHSA-h6cr-wjv9-3cpp",
-          "severity": "low",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 2.9,
-            "vectorString": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244019,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: verifyCertificateChain() removes trusted CA certificates with the same subject from the CA store",
-          "url": "https://github.com/advisories/GHSA-4487-j8r4-4g2f",
-          "severity": "low",
-          "cwe": [
-            "CWE-295",
-            "CWE-471"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244020,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: AES-GCM authentication bypass via unvalidated tagLength option",
-          "url": "https://github.com/advisories/GHSA-5cwg-6vw7-rj6p",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-354",
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244021,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: PKCS#12 MAC forgery and constant-key PBE via zero iteration count",
-          "url": "https://github.com/advisories/GHSA-jc66-7q78-782g",
-          "severity": "high",
-          "cwe": [
-            "CWE-354",
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244022,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of service in TLS record processing via a record interleaved with a fragmented handshake message",
-          "url": "https://github.com/advisories/GHSA-8hrf-8g6f-7xwp",
-          "severity": "high",
-          "cwe": [
-            "CWE-248",
-            "CWE-476"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244023,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of service in TLS record processing via call stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-hqq3-7jhf-c5jx",
-          "severity": "high",
-          "cwe": [
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244024,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: X.509 basicConstraints bypass in verifyCertificateChain() via deprecated extension OIDs 2.5.29.10 and 2.5.29.13",
-          "url": "https://github.com/advisories/GHSA-5x38-2vff-x55p",
-          "severity": "high",
-          "cwe": [
-            "CWE-295",
-            "CWE-436"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        }
-      ],
-      "effects": [
-        "selfsigned"
-      ],
-      "range": "<=1.4.0",
-      "nodes": [
-        "node_modules/node-forge"
-      ],
-      "fixAvailable": false
-    },
-    "node-libs-browser": {
-      "name": "node-libs-browser",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "crypto-browserify"
-      ],
-      "effects": [
-        "webpack"
-      ],
-      "range": "0.4.2 || >=1.0.0",
-      "nodes": [
-        "node_modules/node-libs-browser"
-      ],
-      "fixAvailable": false
-    },
-    "node-notifier": {
-      "name": "node-notifier",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "uuid"
-      ],
-      "effects": [
-        "@jest/reporters"
-      ],
-      "range": "7.0.0 - 10.0.1",
-      "nodes": [
-        "node_modules/node-notifier"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "nth-check": {
-      "name": "nth-check",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1095141,
-          "name": "nth-check",
-          "dependency": "nth-check",
-          "title": "Inefficient Regular Expression Complexity in nth-check",
-          "url": "https://github.com/advisories/GHSA-rp65-9cf3-cjxr",
-          "severity": "high",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<2.0.1"
-        }
-      ],
-      "effects": [
-        "css-select"
-      ],
-      "range": "<2.0.1",
-      "nodes": [
-        "node_modules/svgo/node_modules/nth-check"
-      ],
-      "fixAvailable": true
-    },
-    "pbkdf2": {
-      "name": "pbkdf2",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241333,
-          "name": "pbkdf2",
-          "dependency": "pbkdf2",
-          "title": "pbkdf2 rehashes long passwords on every iteration, enabling denial of service",
-          "url": "https://github.com/advisories/GHSA-477h-4r7f-fvrx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=3.1.6"
-        }
-      ],
-      "effects": [],
-      "range": "<=3.1.6",
-      "nodes": [
-        "node_modules/pbkdf2"
-      ],
-      "fixAvailable": true
-    },
-    "postcss": {
-      "name": "postcss",
-      "severity": "high",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1109574,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS line return parsing error",
-          "url": "https://github.com/advisories/GHSA-7fh5-64p2-3v2j",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-74",
-            "CWE-144"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<8.4.31"
-        },
-        {
-          "source": 1117015,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS has XSS via Unescaped </style> in its CSS Stringify Output",
-          "url": "https://github.com/advisories/GHSA-qx2v-qp2m-jg93",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": "<8.5.10"
-        },
-        {
-          "source": 1124252,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: Arbitrary file read and information disclosure via attacker-controlled sourceMappingURL in CSS comments",
-          "url": "https://github.com/advisories/GHSA-6g55-p6wh-862q",
-          "severity": "high",
-          "cwe": [
-            "CWE-22",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=8.5.11"
-        },
-        {
-          "source": 1130709,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappingURL reads arbitrary .map files when `from` is unset",
-          "url": "https://github.com/advisories/GHSA-fxqj-rqcc-2cmp",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-22",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=8.5.22"
-        },
-        {
-          "source": 1139510,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure",
-          "url": "https://github.com/advisories/GHSA-r28c-9q8g-f849",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=8.5.17"
-        }
-      ],
-      "effects": [
-        "@intervolga/optimize-cssnano-plugin",
-        "@vue/compiler-sfc",
-        "@vue/component-compiler-utils",
-        "autoprefixer",
-        "css-declaration-sorter",
-        "css-loader",
-        "cssnano",
-        "cssnano-preset-default",
-        "cssnano-util-raw-cache",
-        "icss-utils",
-        "postcss-calc",
-        "postcss-colormin",
-        "postcss-convert-values",
-        "postcss-discard-comments",
-        "postcss-discard-duplicates",
-        "postcss-discard-empty",
-        "postcss-discard-overridden",
-        "postcss-import",
-        "postcss-loader",
-        "postcss-merge-longhand",
-        "postcss-merge-rules",
-        "postcss-minify-font-values",
-        "postcss-minify-gradients",
-        "postcss-minify-params",
-        "postcss-minify-selectors",
-        "postcss-modules-extract-imports",
-        "postcss-modules-local-by-default",
-        "postcss-modules-scope",
-        "postcss-modules-values",
-        "postcss-normalize-charset",
-        "postcss-normalize-display-values",
-        "postcss-normalize-positions",
-        "postcss-normalize-repeat-style",
-        "postcss-normalize-string",
-        "postcss-normalize-timing-functions",
-        "postcss-normalize-unicode",
-        "postcss-normalize-url",
-        "postcss-normalize-whitespace",
-        "postcss-ordered-values",
-        "postcss-reduce-initial",
-        "postcss-reduce-transforms",
-        "postcss-svgo",
-        "postcss-unique-selectors",
-        "stylehacks"
-      ],
-      "range": "<=8.5.22",
-      "nodes": [
-        "node_modules/postcss"
-      ],
-      "fixAvailable": false
-    },
-    "postcss-calc": {
-      "name": "postcss-calc",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "4.1.0 - 7.0.5",
-      "nodes": [
-        "node_modules/postcss-calc"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-colormin": {
-      "name": "postcss-colormin",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.3",
-      "nodes": [
-        "node_modules/postcss-colormin"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-convert-values": {
-      "name": "postcss-convert-values",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-convert-values"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-discard-comments": {
-      "name": "postcss-discard-comments",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-discard-comments"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-discard-duplicates": {
-      "name": "postcss-discard-duplicates",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "1.1.0 - 4.0.2",
-      "nodes": [
-        "node_modules/postcss-discard-duplicates"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-discard-empty": {
-      "name": "postcss-discard-empty",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "1.1.0 - 4.0.1",
-      "nodes": [
-        "node_modules/postcss-discard-empty"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-discard-overridden": {
-      "name": "postcss-discard-overridden",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-discard-overridden"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-import": {
-      "name": "postcss-import",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [
-        "@dcloudio/vue-cli-plugin-uni"
-      ],
-      "range": "<=12.0.1",
-      "nodes": [
-        "node_modules/postcss-import"
-      ],
-      "fixAvailable": false
-    },
-    "postcss-loader": {
-      "name": "postcss-loader",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-loader"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-merge-longhand": {
-      "name": "postcss-merge-longhand",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "stylehacks"
-      ],
-      "effects": [],
-      "range": "<=4.0.11",
-      "nodes": [
-        "node_modules/postcss-merge-longhand"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-merge-rules": {
-      "name": "postcss-merge-rules",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "<=4.0.3",
-      "nodes": [
-        "node_modules/postcss-merge-rules"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-minify-font-values": {
-      "name": "postcss-minify-font-values",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-minify-font-values"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-minify-gradients": {
-      "name": "postcss-minify-gradients",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-minify-gradients"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-minify-params": {
-      "name": "postcss-minify-params",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-minify-params"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-minify-selectors": {
-      "name": "postcss-minify-selectors",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "<=5.0.0",
-      "nodes": [
-        "node_modules/postcss-minify-selectors"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-modules-extract-imports": {
-      "name": "postcss-modules-extract-imports",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=2.0.0",
-      "nodes": [
-        "node_modules/postcss-modules-extract-imports"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-modules-local-by-default": {
-      "name": "postcss-modules-local-by-default",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "icss-utils",
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "<=4.0.0-rc.4",
-      "nodes": [
-        "node_modules/postcss-modules-local-by-default"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-modules-scope": {
-      "name": "postcss-modules-scope",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [],
-      "range": "<=2.2.0",
-      "nodes": [
-        "node_modules/postcss-modules-scope"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-modules-values": {
-      "name": "postcss-modules-values",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "icss-utils",
-        "postcss"
-      ],
-      "effects": [
-        "css-loader"
-      ],
-      "range": "<=4.0.0-rc.5",
-      "nodes": [
-        "node_modules/postcss-modules-values"
-      ],
-      "fixAvailable": false
-    },
-    "postcss-normalize-charset": {
-      "name": "postcss-normalize-charset",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-normalize-charset"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-display-values": {
-      "name": "postcss-normalize-display-values",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-display-values"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-positions": {
-      "name": "postcss-normalize-positions",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-positions"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-repeat-style": {
-      "name": "postcss-normalize-repeat-style",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-repeat-style"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-string": {
-      "name": "postcss-normalize-string",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-string"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-timing-functions": {
-      "name": "postcss-normalize-timing-functions",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-timing-functions"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-unicode": {
-      "name": "postcss-normalize-unicode",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-normalize-unicode"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-url": {
-      "name": "postcss-normalize-url",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "1.1.0 - 4.0.1",
-      "nodes": [
-        "node_modules/postcss-normalize-url"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-normalize-whitespace": {
-      "name": "postcss-normalize-whitespace",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-normalize-whitespace"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-ordered-values": {
-      "name": "postcss-ordered-values",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.1.2",
-      "nodes": [
-        "node_modules/postcss-ordered-values"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-reduce-initial": {
-      "name": "postcss-reduce-initial",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.3",
-      "nodes": [
-        "node_modules/postcss-reduce-initial"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-reduce-transforms": {
-      "name": "postcss-reduce-transforms",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.2",
-      "nodes": [
-        "node_modules/postcss-reduce-transforms"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-selector-parser": {
-      "name": "postcss-selector-parser",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1243379,
-          "name": "postcss-selector-parser",
-          "dependency": "postcss-selector-parser",
-          "title": "PostCSS: Quadratic complexity in flat selector parsing allows CPU exhaustion",
-          "url": "https://github.com/advisories/GHSA-rj75-hqrm-r3gf",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<6.1.5"
-        }
-      ],
-      "effects": [
-        "@dcloudio/vue-cli-plugin-uni",
-        "@vue/component-compiler-utils",
-        "postcss-calc",
-        "postcss-merge-rules",
-        "postcss-minify-selectors",
-        "postcss-modules-local-by-default",
-        "postcss-modules-scope"
-      ],
-      "range": "<6.1.5",
-      "nodes": [
-        "node_modules/postcss-selector-parser"
-      ],
-      "fixAvailable": false
-    },
-    "postcss-svgo": {
-      "name": "postcss-svgo",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "svgo"
-      ],
-      "effects": [],
-      "range": "<=5.0.0-rc.2",
-      "nodes": [
-        "node_modules/postcss-svgo"
-      ],
-      "fixAvailable": true
-    },
-    "postcss-unique-selectors": {
-      "name": "postcss-unique-selectors",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [],
-      "range": "<=4.0.1",
-      "nodes": [
-        "node_modules/postcss-unique-selectors"
-      ],
-      "fixAvailable": true
-    },
-    "proxy-addr": {
-      "name": "proxy-addr",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241210,
-          "name": "proxy-addr",
-          "dependency": "proxy-addr",
-          "title": "proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet",
-          "url": "https://github.com/advisories/GHSA-jqcg-44mw-7w3h",
-          "severity": "critical",
-          "cwe": [
-            "CWE-290",
-            "CWE-348",
-            "CWE-697"
-          ],
-          "cvss": {
-            "score": 9.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": ">=1.1.0 <2.0.8"
-        }
-      ],
-      "effects": [],
-      "range": "1.1.0 - 2.0.7",
-      "nodes": [
-        "node_modules/proxy-addr"
-      ],
-      "fixAvailable": true
-    },
-    "qs": {
-      "name": "qs",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1113719,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion",
-          "url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-20"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<6.14.1"
-        },
-        {
-          "source": 1158506,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs array-limit bypass via bracket-key comma parsing",
-          "url": "https://github.com/advisories/GHSA-x5fp-wj9c-mxmx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.14.2 <=6.15.3"
-        },
-        {
-          "source": 1158507,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs: Denial of Service via Attacker Controlled isBuffer",
-          "url": "https://github.com/advisories/GHSA-4mjr-xmp4-gh2g",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-248",
-            "CWE-703"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.2.5 <6.16.0"
-        },
-        {
-          "source": 1243687,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs : qs.stringify with arrayFormat 'comma' throws an uncaught TypeError on array elements carrying a non-callable own toString (DoS)",
-          "url": "https://github.com/advisories/GHSA-6pq8-jhm2-2vcw",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-248",
-            "CWE-704"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.7.0 <=6.16.0"
-        }
-      ],
-      "effects": [
-        "request"
-      ],
-      "range": "<=6.16.0",
-      "nodes": [
-        "node_modules/body-parser/node_modules/qs",
-        "node_modules/express/node_modules/qs",
-        "node_modules/qs",
-        "node_modules/url/node_modules/qs"
-      ],
-      "fixAvailable": false
-    },
-    "readdirp": {
-      "name": "readdirp",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "micromatch"
-      ],
-      "effects": [
-        "chokidar"
-      ],
-      "range": "2.2.0 - 2.2.1",
-      "nodes": [
-        "node_modules/watchpack-chokidar2/node_modules/readdirp",
-        "node_modules/webpack-dev-server/node_modules/readdirp"
-      ],
-      "fixAvailable": false
-    },
-    "request": {
-      "name": "request",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1096727,
-          "name": "request",
-          "dependency": "request",
-          "title": "Server-Side Request Forgery in Request",
-          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": "<=2.88.2"
-        },
-        "form-data",
-        "qs",
-        "tough-cookie",
-        "uuid"
-      ],
-      "effects": [
-        "@vue/cli-shared-utils"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/request"
-      ],
-      "fixAvailable": false
-    },
-    "sane": {
-      "name": "sane",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "anymatch",
-        "micromatch"
-      ],
-      "effects": [
-        "jest-haste-map"
-      ],
-      "range": "1.5.0 - 4.1.0",
-      "nodes": [
-        "node_modules/sane"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "selfsigned": {
-      "name": "selfsigned",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "node-forge"
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": "1.1.1 - 1.10.14",
-      "nodes": [
-        "node_modules/selfsigned"
-      ],
-      "fixAvailable": false
-    },
-    "serialize-javascript": {
-      "name": "serialize-javascript",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1113686,
-          "name": "serialize-javascript",
-          "dependency": "serialize-javascript",
-          "title": "Serialize JavaScript is Vulnerable to RCE via RegExp.flags and Date.prototype.toISOString()",
-          "url": "https://github.com/advisories/GHSA-5c6j-r48x-rmvq",
-          "severity": "high",
-          "cwe": [
-            "CWE-96"
-          ],
-          "cvss": {
-            "score": 8.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": "<=7.0.2"
-        },
-        {
-          "source": 1243082,
-          "name": "serialize-javascript",
-          "dependency": "serialize-javascript",
-          "title": "Serialize JavaScript: Cross-site scripting (XSS) via unescaped </script at the end of a serialized function body",
-          "url": "https://github.com/advisories/GHSA-m5mm-p8h7-m29v",
-          "severity": "low",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<7.1.3"
-        }
-      ],
-      "effects": [
-        "copy-webpack-plugin",
-        "terser-webpack-plugin"
-      ],
-      "range": "<=7.1.2",
-      "nodes": [
-        "node_modules/serialize-javascript"
-      ],
-      "fixAvailable": false
-    },
-    "shell-quote": {
-      "name": "shell-quote",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241332,
-          "name": "shell-quote",
-          "dependency": "shell-quote",
-          "title": "shell-quote: `quote()` command injection via a line terminator in a token after a `{ comment }` token",
-          "url": "https://github.com/advisories/GHSA-pqg4-j6r4-53mv",
-          "severity": "critical",
-          "cwe": [
-            "CWE-78"
-          ],
-          "cvss": {
-            "score": 8.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=1.8.4 <1.11.0"
-        }
-      ],
-      "effects": [],
-      "range": "1.8.4 - 1.10.0",
-      "nodes": [
-        "node_modules/shell-quote"
-      ],
-      "fixAvailable": true
-    },
-    "sockjs": {
-      "name": "sockjs",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "uuid"
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": ">=0.3.17",
-      "nodes": [
-        "node_modules/sockjs"
-      ],
-      "fixAvailable": false
-    },
-    "source-map-js": {
-      "name": "source-map-js",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241209,
-          "name": "source-map-js",
-          "dependency": "source-map-js",
-          "title": "source-map-js allows event-loop denial of service through indexed source-map section offsets",
-          "url": "https://github.com/advisories/GHSA-68fv-2mgg-jv7q",
-          "severity": "high",
-          "cwe": [
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=1.0.0 <1.2.2"
-        }
-      ],
-      "effects": [],
-      "range": "1.0.0 - 1.2.1",
-      "nodes": [
-        "node_modules/source-map-js"
-      ],
-      "fixAvailable": true
-    },
-    "source-map-resolve": {
-      "name": "source-map-resolve",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "decode-uri-component"
-      ],
-      "effects": [],
-      "range": ">=0.5.1",
-      "nodes": [
-        "node_modules/source-map-resolve"
-      ],
-      "fixAvailable": true
-    },
-    "stylehacks": {
-      "name": "stylehacks",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss",
-        "postcss-selector-parser"
-      ],
-      "effects": [
-        "postcss-merge-longhand"
-      ],
-      "range": "<=4.0.3",
-      "nodes": [
-        "node_modules/stylehacks"
-      ],
-      "fixAvailable": true
-    },
-    "svgo": {
-      "name": "svgo",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1139520,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO removeScripts plugin leaves some executable scripts intact",
-          "url": "https://github.com/advisories/GHSA-2p49-hgcm-8545",
-          "severity": "high",
-          "cwe": [
-            "CWE-79",
-            "CWE-184"
-          ],
-          "cvss": {
-            "score": 8.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.3"
-        },
-        {
-          "source": 1193740,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO: removeScripts incompletely sanitizes executable HTML in SVG foreignObject elements",
-          "url": "https://github.com/advisories/GHSA-4vpr-x523-8j87",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.4"
-        },
-        {
-          "source": 1243426,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO: removeScripts allows executable links through namespace and control-character bypasses",
-          "url": "https://github.com/advisories/GHSA-w27v-7q3p-w38r",
-          "severity": "high",
-          "cwe": [
-            "CWE-79",
-            "CWE-184"
-          ],
-          "cvss": {
-            "score": 8.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.4"
-        },
-        "css-select"
-      ],
-      "effects": [
-        "postcss-svgo"
-      ],
-      "range": "1.0.0 - 2.8.3",
-      "nodes": [
-        "node_modules/svgo"
-      ],
-      "fixAvailable": true
-    },
-    "terser-webpack-plugin": {
-      "name": "terser-webpack-plugin",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "serialize-javascript"
-      ],
-      "effects": [
-        "@vue/cli-service",
-        "webpack"
-      ],
-      "range": "<=5.3.16",
-      "nodes": [
-        "node_modules/terser-webpack-plugin"
-      ],
-      "fixAvailable": false
-    },
-    "tough-cookie": {
-      "name": "tough-cookie",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1097682,
-          "name": "tough-cookie",
-          "dependency": "tough-cookie",
-          "title": "tough-cookie Prototype Pollution vulnerability",
-          "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 6.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
-          },
-          "range": "<4.1.3"
-        }
-      ],
-      "effects": [
-        "request"
-      ],
-      "range": "<4.1.3",
-      "nodes": [
-        "node_modules/request/node_modules/tough-cookie"
-      ],
-      "fixAvailable": false
-    },
-    "uuid": {
-      "name": "uuid",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1119441,
-          "name": "uuid",
-          "dependency": "uuid",
-          "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
-          "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-787",
-            "CWE-1285"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<11.1.1"
-        }
-      ],
-      "effects": [
-        "node-notifier",
-        "request",
-        "sockjs",
-        "webpack-log"
-      ],
-      "range": "<11.1.1",
-      "nodes": [
-        "node_modules/request/node_modules/uuid",
-        "node_modules/uuid",
-        "node_modules/webpack-log/node_modules/uuid"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "vue": {
-      "name": "vue",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "@vue/compiler-sfc",
-        {
-          "source": 1100238,
-          "name": "vue",
-          "dependency": "vue",
-          "title": "ReDoS vulnerability in vue package that is exploitable through inefficient regex evaluation in the parseHTML function",
-          "url": "https://github.com/advisories/GHSA-5j4c-8p2g-v4jx",
-          "severity": "low",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.0.0-alpha.1 <3.0.0-alpha.0"
-        }
-      ],
-      "effects": [],
-      "range": "2.0.0-alpha.1 - 2.7.16 || 3.5.36",
-      "nodes": [
-        "node_modules/vue"
-      ],
-      "fixAvailable": {
-        "name": "vue",
-        "version": "3.5.44",
-        "isSemVerMajor": true
-      }
-    },
-    "vue-loader": {
-      "name": "vue-loader",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/component-compiler-utils"
-      ],
-      "effects": [],
-      "range": "15.0.0-beta.1 - 15.11.1",
-      "nodes": [
-        "node_modules/vue-loader"
-      ],
-      "fixAvailable": true
-    },
-    "vue-template-compiler": {
-      "name": "vue-template-compiler",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1111772,
-          "name": "vue-template-compiler",
-          "dependency": "vue-template-compiler",
-          "title": "vue-template-compiler vulnerable to client-side Cross-Site Scripting (XSS)",
-          "url": "https://github.com/advisories/GHSA-g3ch-rx76-35fx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 4.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N"
-          },
-          "range": ">=2.0.0 <3.0.0"
-        }
-      ],
-      "effects": [
-        "@dcloudio/uni-template-compiler"
-      ],
-      "range": ">=2.0.0",
-      "nodes": [
-        "node_modules/vue-template-compiler"
-      ],
-      "fixAvailable": false
-    },
-    "watchpack": {
-      "name": "watchpack",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "watchpack-chokidar2"
-      ],
-      "effects": [
-        "webpack"
-      ],
-      "range": "1.7.2 - 1.7.5",
-      "nodes": [
-        "node_modules/watchpack"
-      ],
-      "fixAvailable": false
-    },
-    "watchpack-chokidar2": {
-      "name": "watchpack-chokidar2",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "chokidar"
-      ],
-      "effects": [
-        "watchpack"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/watchpack-chokidar2"
-      ],
-      "fixAvailable": false
-    },
-    "webpack": {
-      "name": "webpack",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "micromatch",
-        "node-libs-browser",
-        "terser-webpack-plugin",
-        "watchpack"
-      ],
-      "effects": [
-        "@vue/cli-plugin-babel",
-        "@vue/cli-service"
-      ],
-      "range": "2.0.0-beta - 5.1.0",
-      "nodes": [
-        "node_modules/webpack"
-      ],
-      "fixAvailable": false
-    },
-    "webpack-dev-middleware": {
-      "name": "webpack-dev-middleware",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1096729,
-          "name": "webpack-dev-middleware",
-          "dependency": "webpack-dev-middleware",
-          "title": "Path traversal in webpack-dev-middleware",
-          "url": "https://github.com/advisories/GHSA-wr3j-pwj9-hqq6",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N"
-          },
-          "range": "<=5.3.3"
-        },
-        {
-          "source": 1240027,
-          "name": "webpack-dev-middleware",
-          "dependency": "webpack-dev-middleware",
-          "title": "webpack-dev-middleware vulnerable to Path Traversal via non-slash-terminated publicPath",
-          "url": "https://github.com/advisories/GHSA-g84c-rxfj-3j2c",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N"
-          },
-          "range": "<7.4.5"
-        },
-        "webpack-log"
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": "<=7.4.4",
-      "nodes": [
-        "node_modules/webpack-dev-middleware"
-      ],
-      "fixAvailable": false
-    },
-    "webpack-dev-server": {
-      "name": "webpack-dev-server",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1108429,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server users' source code may be stolen when they access a malicious web site with non-Chromium based browser",
-          "url": "https://github.com/advisories/GHSA-9jgg-88mc-972h",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-346"
-          ],
-          "cvss": {
-            "score": 6.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.0"
-        },
-        {
-          "source": 1108430,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server users' source code may be stolen when they access a malicious web site",
-          "url": "https://github.com/advisories/GHSA-4v9v-hfq4-rm2v",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.0"
-        },
-        {
-          "source": 1119074,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to cross-origin source code exposure on non-HTTPS origins",
-          "url": "https://github.com/advisories/GHSA-79cf-xcqc-c78w",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.3"
-        },
-        {
-          "source": 1121087,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to HMR WebSocket interception via permissive user proxies",
-          "url": "https://github.com/advisories/GHSA-mx8g-39q3-5c79",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-346",
-            "CWE-441"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<5.2.5"
-        },
-        {
-          "source": 1123965,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to cross-site request forgery via internal developer endpoints",
-          "url": "https://github.com/advisories/GHSA-f5vj-f2hx-8m93",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-352",
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 4.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:N/A:L"
-          },
-          "range": "<=5.2.5"
-        },
-        {
-          "source": 1123966,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to denial of service via a malformed Host or Origin header",
-          "url": "https://github.com/advisories/GHSA-m28w-2pqf-7qgj",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-20",
-            "CWE-248"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=5.2.5"
-        },
-        "chokidar",
-        "http-proxy-middleware",
-        "ip",
-        "selfsigned",
-        "sockjs",
-        "webpack-dev-middleware",
-        "webpack-log"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "<=5.2.7",
-      "nodes": [
-        "node_modules/webpack-dev-server"
-      ],
-      "fixAvailable": false
-    },
-    "webpack-log": {
-      "name": "webpack-log",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "uuid"
-      ],
-      "effects": [
-        "copy-webpack-plugin",
-        "webpack-dev-middleware",
-        "webpack-dev-server"
-      ],
-      "range": "1.1.0 - 2.0.0",
-      "nodes": [
-        "node_modules/webpack-log"
-      ],
-      "fixAvailable": false
-    }
-  },
-  "metadata": {
-    "vulnerabilities": {
-      "info": 0,
-      "low": 11,
-      "moderate": 82,
-      "high": 32,
-      "critical": 7,
-      "total": 132
-    },
-    "dependencies": {
-      "prod": 64,
-      "dev": 1633,
-      "optional": 31,
-      "peer": 0,
-      "peerOptional": 0,
-      "total": 1696
-    }
-  }
-}

+ 0 - 160
_run40_npm_audit_root.json

@@ -1,160 +0,0 @@
-{
-  "auditReportVersion": 2,
-  "vulnerabilities": {
-    "chromium-bidi": {
-      "name": "chromium-bidi",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "zod"
-      ],
-      "effects": [
-        "puppeteer",
-        "puppeteer-core"
-      ],
-      "range": "0.5.13 - 157.0.8081-0",
-      "nodes": [
-        "node_modules/chromium-bidi"
-      ],
-      "fixAvailable": true
-    },
-    "nanoid": {
-      "name": "nanoid",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1139427,
-          "name": "nanoid",
-          "dependency": "nanoid",
-          "title": "nanoid: custom generators can loop indefinitely when size is zero",
-          "url": "https://github.com/advisories/GHSA-2v37-7h3g-55p8",
-          "severity": "high",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<3.3.18"
-        }
-      ],
-      "effects": [],
-      "range": "<3.3.18",
-      "nodes": [
-        "node_modules/nanoid"
-      ],
-      "fixAvailable": true
-    },
-    "puppeteer": {
-      "name": "puppeteer",
-      "severity": "high",
-      "isDirect": true,
-      "via": [
-        "chromium-bidi",
-        "puppeteer-core"
-      ],
-      "effects": [],
-      "range": "22.5.0 - 25.12.0",
-      "nodes": [
-        "node_modules/puppeteer"
-      ],
-      "fixAvailable": true
-    },
-    "puppeteer-core": {
-      "name": "puppeteer-core",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "chromium-bidi"
-      ],
-      "effects": [
-        "puppeteer"
-      ],
-      "range": "22.5.0 - 25.12.0",
-      "nodes": [
-        "node_modules/puppeteer-core"
-      ],
-      "fixAvailable": true
-    },
-    "source-map-js": {
-      "name": "source-map-js",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241209,
-          "name": "source-map-js",
-          "dependency": "source-map-js",
-          "title": "source-map-js allows event-loop denial of service through indexed source-map section offsets",
-          "url": "https://github.com/advisories/GHSA-68fv-2mgg-jv7q",
-          "severity": "high",
-          "cwe": [
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=1.0.0 <1.2.2"
-        }
-      ],
-      "effects": [],
-      "range": "1.0.0 - 1.2.1",
-      "nodes": [
-        "node_modules/source-map-js"
-      ],
-      "fixAvailable": true
-    },
-    "zod": {
-      "name": "zod",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1243066,
-          "name": "zod",
-          "dependency": "zod",
-          "title": "Zod can exhaust memory while validating oversized constrained collections",
-          "url": "https://github.com/advisories/GHSA-mrhx-c7xc-m3w5",
-          "severity": "high",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<4.6.6"
-        }
-      ],
-      "effects": [
-        "chromium-bidi"
-      ],
-      "range": "<4.6.6",
-      "nodes": [
-        "node_modules/zod"
-      ],
-      "fixAvailable": true
-    }
-  },
-  "metadata": {
-    "vulnerabilities": {
-      "info": 0,
-      "low": 0,
-      "moderate": 0,
-      "high": 6,
-      "critical": 0,
-      "total": 6
-    },
-    "dependencies": {
-      "prod": 37,
-      "dev": 2,
-      "optional": 26,
-      "peer": 0,
-      "peerOptional": 0,
-      "total": 64
-    }
-  }
-}

+ 0 - 3441
_run40_npm_audit_web.json

@@ -1,3441 +0,0 @@
-{
-  "auditReportVersion": 2,
-  "vulnerabilities": {
-    "@babel/core": {
-      "name": "@babel/core",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1123528,
-          "name": "@babel/core",
-          "dependency": "@babel/core",
-          "title": "@babel/core: Arbitrary File Read via sourceMappingURL Comment",
-          "url": "https://github.com/advisories/GHSA-4x5r-pxfx-6jf8",
-          "severity": "low",
-          "cwe": [
-            "CWE-22",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 3.2,
-            "vectorString": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:C/C:L/I:N/A:N"
-          },
-          "range": "<=7.29.0"
-        }
-      ],
-      "effects": [],
-      "range": "<=7.29.0",
-      "nodes": [
-        "node_modules/@babel/core"
-      ],
-      "fixAvailable": true
-    },
-    "@jest/core": {
-      "name": "@jest/core",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "jest-config"
-      ],
-      "effects": [],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/@jest/core"
-      ],
-      "fixAvailable": true
-    },
-    "@vue/cli-plugin-router": {
-      "name": "@vue/cli-plugin-router",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/cli-service"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/cli-plugin-router"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/cli-plugin-vuex": {
-      "name": "@vue/cli-plugin-vuex",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/cli-service"
-      ],
-      "effects": [],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/cli-plugin-vuex"
-      ],
-      "fixAvailable": true
-    },
-    "@vue/cli-service": {
-      "name": "@vue/cli-service",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "@vue/cli-plugin-router",
-        "@vue/cli-plugin-vuex",
-        "@vue/component-compiler-utils",
-        "copy-webpack-plugin",
-        "css-minimizer-webpack-plugin",
-        "vue-loader",
-        "vue-template-compiler",
-        "webpack-dev-server"
-      ],
-      "effects": [
-        "@vue/cli-plugin-router",
-        "@vue/cli-plugin-vuex"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/cli-service"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/component-compiler-utils": {
-      "name": "@vue/component-compiler-utils",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "postcss"
-      ],
-      "effects": [
-        "@vue/cli-service",
-        "vue-loader"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/@vue/component-compiler-utils"
-      ],
-      "fixAvailable": false
-    },
-    "@vue/test-utils": {
-      "name": "@vue/test-utils",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        "vue",
-        "vue-template-compiler"
-      ],
-      "effects": [],
-      "range": "<=1.3.6",
-      "nodes": [
-        "node_modules/@vue/test-utils"
-      ],
-      "fixAvailable": {
-        "name": "@vue/test-utils",
-        "version": "2.5.1",
-        "isSemVerMajor": true
-      }
-    },
-    "@wangeditor/editor-for-vue": {
-      "name": "@wangeditor/editor-for-vue",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        "vue"
-      ],
-      "effects": [],
-      "range": "<=1.0.2",
-      "nodes": [
-        "node_modules/@wangeditor/editor-for-vue"
-      ],
-      "fixAvailable": {
-        "name": "@wangeditor/editor-for-vue",
-        "version": "5.1.12",
-        "isSemVerMajor": true
-      }
-    },
-    "axios": {
-      "name": "axios",
-      "severity": "high",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1138749,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Prototype pollution auth subfields can inject Basic auth",
-          "url": "https://github.com/advisories/GHSA-xj6q-8x83-jv6g",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.2 <1.18.0"
-        },
-        {
-          "source": 1147949,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Prototype pollution gadgets can alter axios request construction",
-          "url": "https://github.com/advisories/GHSA-mmx7-hfxf-jppx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.18.0"
-        },
-        {
-          "source": 1147950,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Deep formToJSON Key Recursion Can Cause Denial of Service",
-          "url": "https://github.com/advisories/GHSA-pmv8-rq9r-6j72",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.18.0"
-        },
-        {
-          "source": 1153175,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: HTTP/2 streamed uploads bypass `maxBodyLength`",
-          "url": "https://github.com/advisories/GHSA-mwf2-3pr3-8698",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.13.0 <1.18.0"
-        },
-        {
-          "source": 1153178,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios Node HTTP adapter can use an inherited proxy after interceptor config cloning",
-          "url": "https://github.com/advisories/GHSA-gcfj-64vw-6mp9",
-          "severity": "high",
-          "cwe": [
-            "CWE-200",
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.2 <1.18.0"
-        },
-        {
-          "source": 1153180,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Nested axios option objects can consume polluted prototype values",
-          "url": "https://github.com/advisories/GHSA-7q8q-rj6j-mhjq",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.18.0"
-        },
-        {
-          "source": 1153182,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Fetch adapter `ReadableStream` uploads bypass `maxBodyLength`",
-          "url": "https://github.com/advisories/GHSA-jqh4-m9w3-8hp9",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.7.0 <1.18.0"
-        },
-        {
-          "source": 1153184,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: NO_PROXY bypass for 0.0.0.0 local addresses in axios",
-          "url": "https://github.com/advisories/GHSA-f4gw-2p7v-4548",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-183",
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.0 <1.18.0"
-        },
-        {
-          "source": 1153185,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Excessive recursion in formDataToJSON can cause denial of service",
-          "url": "https://github.com/advisories/GHSA-42h9-826w-cgv3",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.18.0"
-        },
-        {
-          "source": 1193664,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios form serializer maxDepth bypass via {} metatoken",
-          "url": "https://github.com/advisories/GHSA-hcpx-6fm6-wx23",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.1 <1.18.0"
-        },
-        {
-          "source": 1240600,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Prototype pollution gadget in fetch adapter can alter outbound requests",
-          "url": "https://github.com/advisories/GHSA-vh66-26gq-q6x8",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.7.0 <1.20.0"
-        },
-        {
-          "source": 1240601,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Prototype-Pollution Gadget in the Default Instance Allows Inherited Object.prototype.method to Override HTTP Method",
-          "url": "https://github.com/advisories/GHSA-9fr6-4gfg-395g",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.20.0"
-        },
-        {
-          "source": 1240604,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: ReDoS (O(N²)) in shouldBypassProxy host normalization, reachable via untrusted redirect Location",
-          "url": "https://github.com/advisories/GHSA-mghh-pgcx-3jjj",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.0 <1.20.0"
-        },
-        {
-          "source": 1240605,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Prototype Pollution Gadget in axios toFormData Options",
-          "url": "https://github.com/advisories/GHSA-x97p-jq2g-jp4f",
-          "severity": "high",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.1 <1.20.0"
-        },
-        {
-          "source": 1240607,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: HTTP/2 adapter bypasses configured DNS lookup and proxy controls",
-          "url": "https://github.com/advisories/GHSA-3pq3-5fj3-cg6v",
-          "severity": "high",
-          "cwe": [
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.13.0 <1.20.0"
-        },
-        {
-          "source": 1240608,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Denial of Service via Unhandled 'error' Event in HTTP/2 ClientHttp2Session Initialization",
-          "url": "https://github.com/advisories/GHSA-542g-h47m-68v8",
-          "severity": "high",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.13.0 <1.20.0"
-        },
-        {
-          "source": 1240626,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Header Injection via Inherited headers After Minimal Interceptor",
-          "url": "https://github.com/advisories/GHSA-j8rh-479h-cp32",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-74",
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.0.0 <1.20.0"
-        },
-        {
-          "source": 1240627,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Fetch Adapter Header Injection via Inherited FormData getHeaders",
-          "url": "https://github.com/advisories/GHSA-4hqw-qxg8-jxx2",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-74",
-            "CWE-693",
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.12.0 <1.20.0"
-        },
-        {
-          "source": 1240628,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: Node HTTP adapter prototype-pollution gadget allows request socket hijack via inherited createConnection",
-          "url": "https://github.com/advisories/GHSA-m8m8-qj5v-23w3",
-          "severity": "high",
-          "cwe": [
-            "CWE-441",
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.2 <1.20.0"
-        },
-        {
-          "source": 1240629,
-          "name": "axios",
-          "dependency": "axios",
-          "title": "Axios: CIDR-form NO_PROXY entries are ignored, causing proxy exclusion bypass for internal IP ranges",
-          "url": "https://github.com/advisories/GHSA-44g4-m2mj-wpvx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-693"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.15.0 <1.20.0"
-        }
-      ],
-      "effects": [],
-      "range": "1.0.0 - 1.19.0",
-      "nodes": [
-        "node_modules/axios"
-      ],
-      "fixAvailable": true
-    },
-    "babel-plugin-transform-es2015-modules-commonjs": {
-      "name": "babel-plugin-transform-es2015-modules-commonjs",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        "babel-template"
-      ],
-      "effects": [
-        "vue-jest"
-      ],
-      "range": "<=7.0.0-beta.0",
-      "nodes": [
-        "node_modules/babel-plugin-transform-es2015-modules-commonjs"
-      ],
-      "fixAvailable": {
-        "name": "vue-jest",
-        "version": "0.6.1",
-        "isSemVerMajor": true
-      }
-    },
-    "babel-template": {
-      "name": "babel-template",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        "babel-traverse"
-      ],
-      "effects": [
-        "babel-plugin-transform-es2015-modules-commonjs"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/babel-template"
-      ],
-      "fixAvailable": {
-        "name": "vue-jest",
-        "version": "0.6.1",
-        "isSemVerMajor": true
-      }
-    },
-    "babel-traverse": {
-      "name": "babel-traverse",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1117412,
-          "name": "babel-traverse",
-          "dependency": "babel-traverse",
-          "title": "Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code",
-          "url": "https://github.com/advisories/GHSA-67hx-6x53-jw92",
-          "severity": "critical",
-          "cwe": [
-            "CWE-184",
-            "CWE-697"
-          ],
-          "cvss": {
-            "score": 9.3,
-            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H"
-          },
-          "range": "<7.23.2"
-        }
-      ],
-      "effects": [
-        "babel-template"
-      ],
-      "range": "*",
-      "nodes": [
-        "node_modules/babel-traverse"
-      ],
-      "fixAvailable": {
-        "name": "vue-jest",
-        "version": "0.6.1",
-        "isSemVerMajor": true
-      }
-    },
-    "baseline-browser-mapping": {
-      "name": "baseline-browser-mapping",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1193686,
-          "name": "baseline-browser-mapping",
-          "dependency": "baseline-browser-mapping",
-          "title": "baseline-browser-mapping process termination on invalid input causes denial of service",
-          "url": "https://github.com/advisories/GHSA-w5vr-8v7q-w6rv",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-705"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=2.0.0 <2.11.0"
-        }
-      ],
-      "effects": [],
-      "range": ">=2.0.0 <2.11.0",
-      "nodes": [
-        "node_modules/baseline-browser-mapping"
-      ],
-      "fixAvailable": true
-    },
-    "body-parser": {
-      "name": "body-parser",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1123977,
-          "name": "body-parser",
-          "dependency": "body-parser",
-          "title": "body-parser vulnerable to denial of service when invalid limit value silently disables size enforcement",
-          "url": "https://github.com/advisories/GHSA-v422-hmwv-36x6",
-          "severity": "low",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<1.20.6"
-        },
-        {
-          "source": 1243073,
-          "name": "body-parser",
-          "dependency": "body-parser",
-          "title": "body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body",
-          "url": "https://github.com/advisories/GHSA-27r3-jxmh-p828",
-          "severity": "high",
-          "cwe": [
-            "CWE-248"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.20.9"
-        }
-      ],
-      "effects": [],
-      "range": "<=1.20.8",
-      "nodes": [
-        "node_modules/body-parser"
-      ],
-      "fixAvailable": true
-    },
-    "brace-expansion": {
-      "name": "brace-expansion",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1123896,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups",
-          "url": "https://github.com/advisories/GHSA-3jxr-9vmj-r5cp",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.0.0 <2.1.2"
-        },
-        {
-          "source": 1123897,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups",
-          "url": "https://github.com/advisories/GHSA-3jxr-9vmj-r5cp",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<1.1.16"
-        },
-        {
-          "source": 1130588,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash",
-          "url": "https://github.com/advisories/GHSA-mh99-v99m-4gvg",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.17"
-        },
-        {
-          "source": 1130589,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash",
-          "url": "https://github.com/advisories/GHSA-mh99-v99m-4gvg",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.3"
-        },
-        {
-          "source": 1130736,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation",
-          "url": "https://github.com/advisories/GHSA-rgw5-rvv9-x895",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.4"
-        },
-        {
-          "source": 1130737,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation",
-          "url": "https://github.com/advisories/GHSA-rgw5-rvv9-x895",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.18"
-        },
-        {
-          "source": 1240100,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: Quadratic-time expansion of the `{a},b}` rewrite causes CPU denial of service",
-          "url": "https://github.com/advisories/GHSA-q2hr-2g5m-vwhr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<1.1.21"
-        },
-        {
-          "source": 1240101,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: Quadratic-time expansion of the `{a},b}` rewrite causes CPU denial of service",
-          "url": "https://github.com/advisories/GHSA-q2hr-2g5m-vwhr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.0.0 <2.1.7"
-        },
-        {
-          "source": 1240104,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-qhr7-859c-m2p7",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.20"
-        },
-        {
-          "source": 1240105,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-qhr7-859c-m2p7",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.6"
-        },
-        {
-          "source": 1240108,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-6j4f-fj2g-mc7p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.1.19"
-        },
-        {
-          "source": 1240109,
-          "name": "brace-expansion",
-          "dependency": "brace-expansion",
-          "title": "brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-6j4f-fj2g-mc7p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=2.0.0 <2.1.5"
-        }
-      ],
-      "effects": [],
-      "range": "<=1.1.20 || 2.0.0 - 2.1.6",
-      "nodes": [
-        "node_modules/brace-expansion",
-        "node_modules/editorconfig/node_modules/brace-expansion",
-        "node_modules/js-beautify/node_modules/brace-expansion"
-      ],
-      "fixAvailable": true
-    },
-    "browserslist": {
-      "name": "browserslist",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1153171,
-          "name": "browserslist",
-          "dependency": "browserslist",
-          "title": "Browserslist: Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM",
-          "url": "https://github.com/advisories/GHSA-c83g-rgw3-j3cx",
-          "severity": "high",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=4.28.6"
-        },
-        {
-          "source": 1153172,
-          "name": "browserslist",
-          "dependency": "browserslist",
-          "title": "Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats)",
-          "url": "https://github.com/advisories/GHSA-73wf-gq98-2v4g",
-          "severity": "high",
-          "cwe": [
-            "CWE-248",
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=4.28.6"
-        }
-      ],
-      "effects": [],
-      "range": "<=4.28.6",
-      "nodes": [
-        "node_modules/browserslist"
-      ],
-      "fixAvailable": true
-    },
-    "colord": {
-      "name": "colord",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1193675,
-          "name": "colord",
-          "dependency": "colord",
-          "title": "Colord: Slow rejection of oversized malformed color strings",
-          "url": "https://github.com/advisories/GHSA-2wm5-q62r-hmrv",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<2.9.4"
-        }
-      ],
-      "effects": [],
-      "range": "<2.9.4",
-      "nodes": [
-        "node_modules/colord"
-      ],
-      "fixAvailable": true
-    },
-    "compression": {
-      "name": "compression",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241221,
-          "name": "compression",
-          "dependency": "compression",
-          "title": "compression vulnerable to Denial of Service via memory leak on premature response close",
-          "url": "https://github.com/advisories/GHSA-vc2v-76pw-4v95",
-          "severity": "high",
-          "cwe": [
-            "CWE-401",
-            "CWE-459"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<1.8.2"
-        }
-      ],
-      "effects": [],
-      "range": "<1.8.2",
-      "nodes": [
-        "node_modules/compression"
-      ],
-      "fixAvailable": true
-    },
-    "copy-webpack-plugin": {
-      "name": "copy-webpack-plugin",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "serialize-javascript"
-      ],
-      "effects": [],
-      "range": "6.1.1 - 13.0.1",
-      "nodes": [
-        "node_modules/copy-webpack-plugin"
-      ],
-      "fixAvailable": true
-    },
-    "create-jest": {
-      "name": "create-jest",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "jest-config"
-      ],
-      "effects": [
-        "jest-cli"
-      ],
-      "range": ">=29.7.0",
-      "nodes": [
-        "node_modules/create-jest"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "css": {
-      "name": "css",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "source-map-resolve"
-      ],
-      "effects": [],
-      "range": ">=2.2.2",
-      "nodes": [
-        "node_modules/css"
-      ],
-      "fixAvailable": true
-    },
-    "css-minimizer-webpack-plugin": {
-      "name": "css-minimizer-webpack-plugin",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "serialize-javascript"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "1.1.4 - 7.0.4",
-      "nodes": [
-        "node_modules/css-minimizer-webpack-plugin"
-      ],
-      "fixAvailable": false
-    },
-    "decode-uri-component": {
-      "name": "decode-uri-component",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1147955,
-          "name": "decode-uri-component",
-          "dependency": "decode-uri-component",
-          "title": "decode-uri-component: Denial of service via exponential decoding of malformed percent-encoded input",
-          "url": "https://github.com/advisories/GHSA-vcc3-ghjq-m6fr",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-405",
-            "CWE-407",
-            "CWE-1176"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=0.4.2"
-        },
-        {
-          "source": 1243857,
-          "name": "decode-uri-component",
-          "dependency": "decode-uri-component",
-          "title": "decode-uri-component vulnerable to denial of service via quadratic replacement of percent-encoded runs",
-          "url": "https://github.com/advisories/GHSA-qr28-fpjm-wq7f",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=0.5.0"
-        }
-      ],
-      "effects": [
-        "source-map-resolve"
-      ],
-      "range": "<=0.5.0",
-      "nodes": [
-        "node_modules/decode-uri-component"
-      ],
-      "fixAvailable": true
-    },
-    "deepmerge": {
-      "name": "deepmerge",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1243505,
-          "name": "deepmerge",
-          "dependency": "deepmerge",
-          "title": "deepmerge mergeObject() allows prototype poisoning of returned objects",
-          "url": "https://github.com/advisories/GHSA-gcqx-w48m-w2h4",
-          "severity": "low",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=4.2.0 <=4.3.1"
-        }
-      ],
-      "effects": [
-        "jest-config"
-      ],
-      "range": ">=4.2.0",
-      "nodes": [
-        "node_modules/jest-config/node_modules/deepmerge"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "editorconfig": {
-      "name": "editorconfig",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "minimatch"
-      ],
-      "effects": [
-        "js-beautify"
-      ],
-      "range": ">=1.0.3",
-      "nodes": [
-        "node_modules/editorconfig"
-      ],
-      "fixAvailable": true
-    },
-    "element-ui": {
-      "name": "element-ui",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        "vue"
-      ],
-      "effects": [],
-      "range": ">=1.0.0-rc.1",
-      "nodes": [
-        "node_modules/element-ui"
-      ],
-      "fixAvailable": {
-        "name": "element-ui",
-        "version": "0.2.6",
-        "isSemVerMajor": true
-      }
-    },
-    "fast-uri": {
-      "name": "fast-uri",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1124064,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to host confusion via literal backslash authority delimiter",
-          "url": "https://github.com/advisories/GHSA-v2hh-gcrm-f6hx",
-          "severity": "high",
-          "cwe": [
-            "CWE-436"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <=3.1.3"
-        },
-        {
-          "source": 1130720,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to host confusion via backslash authority introducer",
-          "url": "https://github.com/advisories/GHSA-7p8r-x3mc-p8w7",
-          "severity": "high",
-          "cwe": [
-            "CWE-436"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <3.1.5"
-        },
-        {
-          "source": 1158524,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to server-side request forgery via malformed IPv6 normalization",
-          "url": "https://github.com/advisories/GHSA-f65p-4m7j-42xc",
-          "severity": "high",
-          "cwe": [
-            "CWE-20",
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <3.1.6"
-        },
-        {
-          "source": 1158527,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to server-side request forgery via repeated hostname percent-decoding",
-          "url": "https://github.com/advisories/GHSA-fph4-wmhf-6fwf",
-          "severity": "high",
-          "cwe": [
-            "CWE-174",
-            "CWE-918"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.1.2 <3.1.6"
-        },
-        {
-          "source": 1158530,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to host confusion via percent-encoded scheme normalization",
-          "url": "https://github.com/advisories/GHSA-jqff-g426-hqxp",
-          "severity": "high",
-          "cwe": [
-            "CWE-177"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <3.1.6"
-        },
-        {
-          "source": 1204921,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to host confusion via failed IDN canonicalization",
-          "url": "https://github.com/advisories/GHSA-4c8g-83qw-93j6",
-          "severity": "high",
-          "cwe": [
-            "CWE-436",
-            "CWE-551"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <3.1.3"
-        },
-        {
-          "source": 1239943,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to authority injection via an unvalidated port in serialize",
-          "url": "https://github.com/advisories/GHSA-qw65-cvwx-89v3",
-          "severity": "high",
-          "cwe": [
-            "CWE-116"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=3.0.0 <3.1.7"
-        },
-        {
-          "source": 1240091,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to inconsistent host case normalization via percent-encoded octets",
-          "url": "https://github.com/advisories/GHSA-hrr3-gc8f-f4qj",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-178"
-          ],
-          "cvss": {
-            "score": 4.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N"
-          },
-          "range": ">=3.0.0 <3.1.8"
-        },
-        {
-          "source": 1243098,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to URI scheme spoofing via percent-encoded scheme decoding",
-          "url": "https://github.com/advisories/GHSA-w74x-v6f9-j3xg",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-172",
-            "CWE-180"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": ">=3.0.0 <3.1.9"
-        },
-        {
-          "source": 1243101,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to improper path equivalence in relative reference normalization",
-          "url": "https://github.com/advisories/GHSA-xhq7-xmqj-769h",
-          "severity": "low",
-          "cwe": [
-            "CWE-41"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=3.0.0 <3.1.9"
-        },
-        {
-          "source": 1243107,
-          "name": "fast-uri",
-          "dependency": "fast-uri",
-          "title": "fast-uri vulnerable to scheme injection via an unescaped first-segment colon in suffix references",
-          "url": "https://github.com/advisories/GHSA-333x-w4r6-6crp",
-          "severity": "low",
-          "cwe": [
-            "CWE-41",
-            "CWE-116"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=3.0.0 <3.1.9"
-        }
-      ],
-      "effects": [],
-      "range": "3.0.0 - 3.1.8",
-      "nodes": [
-        "node_modules/fast-uri"
-      ],
-      "fixAvailable": true
-    },
-    "follow-redirects": {
-      "name": "follow-redirects",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1242604,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects array-form headers bypass cross-origin credential stripping",
-          "url": "https://github.com/advisories/GHSA-q3jh-wrc6-jgq8",
-          "severity": "high",
-          "cwe": [
-            "CWE-200",
-            "CWE-212"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.16.0 <1.16.1"
-        },
-        {
-          "source": 1242605,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects sensitiveHeaders regex escaping can expose credential headers",
-          "url": "https://github.com/advisories/GHSA-8r9p-f939-6h3c",
-          "severity": "high",
-          "cwe": [
-            "CWE-185",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=1.16.0 <1.16.1"
-        },
-        {
-          "source": 1244003,
-          "name": "follow-redirects",
-          "dependency": "follow-redirects",
-          "title": "follow-redirects: Cross-realm sensitiveHeaders arrays are discarded and custom credentials can follow redirects",
-          "url": "https://github.com/advisories/GHSA-mrwp-f3q8-3g9p",
-          "severity": "high",
-          "cwe": [
-            "CWE-201"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": ">=1.16.0 <=1.16.1"
-        }
-      ],
-      "effects": [],
-      "range": "1.16.0 - 1.16.1",
-      "nodes": [
-        "node_modules/follow-redirects"
-      ],
-      "fixAvailable": true
-    },
-    "form-data": {
-      "name": "form-data",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1120743,
-          "name": "form-data",
-          "dependency": "form-data",
-          "title": "form-data: CRLF injection in form-data via unescaped multipart field names and filenames",
-          "url": "https://github.com/advisories/GHSA-hmw2-7cc7-3qxx",
-          "severity": "high",
-          "cwe": [
-            "CWE-93"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": ">=4.0.0 <4.0.6"
-        }
-      ],
-      "effects": [],
-      "range": "4.0.0 - 4.0.5",
-      "nodes": [
-        "node_modules/form-data"
-      ],
-      "fixAvailable": true
-    },
-    "glob": {
-      "name": "glob",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1109842,
-          "name": "glob",
-          "dependency": "glob",
-          "title": "glob CLI: Command injection via -c/--cmd executes matches with shell:true",
-          "url": "https://github.com/advisories/GHSA-5j98-mcp5-4vw2",
-          "severity": "high",
-          "cwe": [
-            "CWE-78"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=10.2.0 <10.5.0"
-        },
-        {
-          "source": 1244013,
-          "name": "glob",
-          "dependency": "glob",
-          "title": "Glob: AbortSignal cancellation bypass allows post-timeout filesystem traversal",
-          "url": "https://github.com/advisories/GHSA-3g3m-2fjr-6pw4",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=9.0.0 <=14.0.1"
-        },
-        "minimatch"
-      ],
-      "effects": [],
-      "range": "9.0.0 - 14.0.1",
-      "nodes": [
-        "node_modules/js-beautify/node_modules/glob"
-      ],
-      "fixAvailable": true
-    },
-    "http-proxy-middleware": {
-      "name": "http-proxy-middleware",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1121360,
-          "name": "http-proxy-middleware",
-          "dependency": "http-proxy-middleware",
-          "title": "http-proxy-middleware `router` host+path substring matching allows Host-header-driven backend routing bypass",
-          "url": "https://github.com/advisories/GHSA-64mm-vxmg-q3vj",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-20",
-            "CWE-187"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=0.16.0 <2.0.10"
-        }
-      ],
-      "effects": [],
-      "range": ">=0.16.0 <2.0.10",
-      "nodes": [
-        "node_modules/http-proxy-middleware"
-      ],
-      "fixAvailable": true
-    },
-    "jest": {
-      "name": "jest",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        "@jest/core",
-        "jest-cli"
-      ],
-      "effects": [],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/jest"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-cli": {
-      "name": "jest-cli",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "@jest/core",
-        "create-jest",
-        "jest-config"
-      ],
-      "effects": [
-        "jest"
-      ],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/jest-cli"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "jest-config": {
-      "name": "jest-config",
-      "severity": "low",
-      "isDirect": false,
-      "via": [
-        "deepmerge"
-      ],
-      "effects": [
-        "@jest/core",
-        "create-jest",
-        "jest-cli"
-      ],
-      "range": ">=25.2.0-alpha.86",
-      "nodes": [
-        "node_modules/jest-config"
-      ],
-      "fixAvailable": {
-        "name": "jest",
-        "version": "25.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "joi": {
-      "name": "joi",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1120656,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi has an uncaught RangeError on deeply nested input through recursive `link()` schemas",
-          "url": "https://github.com/advisories/GHSA-q7cg-457f-vx79",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-248",
-            "CWE-400"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<17.13.4"
-        },
-        {
-          "source": 1193674,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi: Prototype pollution via a `__proto__` language key in custom messages",
-          "url": "https://github.com/advisories/GHSA-6w3j-5fw6-r9vr",
-          "severity": "low",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=17.2.0 <17.13.6"
-        },
-        {
-          "source": 1193679,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi: object().rename() with a template target can set the validated object's prototype",
-          "url": "https://github.com/advisories/GHSA-gg4h-3hg2-grpc",
-          "severity": "low",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": ">=16.0.0 <17.13.5"
-        },
-        {
-          "source": 1241212,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi messages compilation allows prototype replacement through __proto__ error codes",
-          "url": "https://github.com/advisories/GHSA-wr44-6hxh-3jwq",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<17.13.8"
-        },
-        {
-          "source": 1241279,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi: Quadratic regular-expression backtracking in `Joi.string().isoDate()`",
-          "url": "https://github.com/advisories/GHSA-6h2x-m376-mqjq",
-          "severity": "high",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=17.2.0 <17.13.7"
-        },
-        {
-          "source": 1244009,
-          "name": "joi",
-          "dependency": "joi",
-          "title": "joi: quadratic-time split in `string().email({ multiple: true })` allows denial of service",
-          "url": "https://github.com/advisories/GHSA-4528-x5fx-h6hg",
-          "severity": "high",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=17.1.1 <17.13.9"
-        }
-      ],
-      "effects": [],
-      "range": "<=17.13.8",
-      "nodes": [
-        "node_modules/joi"
-      ],
-      "fixAvailable": true
-    },
-    "js-beautify": {
-      "name": "js-beautify",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "editorconfig"
-      ],
-      "effects": [],
-      "range": ">=1.14.9",
-      "nodes": [
-        "node_modules/js-beautify"
-      ],
-      "fixAvailable": true
-    },
-    "js-cookie": {
-      "name": "js-cookie",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1120607,
-          "name": "js-cookie",
-          "dependency": "js-cookie",
-          "title": "JavaScript Cookie: Per-instance prototype hijack in assign() enables cookie-attribute injection",
-          "url": "https://github.com/advisories/GHSA-qjx8-664m-686j",
-          "severity": "high",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=3.0.5"
-        }
-      ],
-      "effects": [],
-      "range": "<=3.0.5",
-      "nodes": [
-        "node_modules/js-cookie"
-      ],
-      "fixAvailable": true
-    },
-    "js-yaml": {
-      "name": "js-yaml",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1121859,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "JS-YAML: Quadratic-complexity DoS in merge key handling via repeated aliases",
-          "url": "https://github.com/advisories/GHSA-h67p-54hq-rp68",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<3.15.0"
-        },
-        {
-          "source": 1123912,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "js-yaml: YAML merge-key chains can force quadratic CPU consumption",
-          "url": "https://github.com/advisories/GHSA-52cp-r559-cp3m",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=3.0.0 <3.15.0"
-        },
-        {
-          "source": 1138114,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported",
-          "url": "https://github.com/advisories/GHSA-5p4m-2wfm-xmqj",
-          "severity": "high",
-          "cwe": [
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=3.0.0 <3.15.1"
-        },
-        {
-          "source": 1193726,
-          "name": "js-yaml",
-          "dependency": "js-yaml",
-          "title": "js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources",
-          "url": "https://github.com/advisories/GHSA-2883-xcg3-v3hh",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=3.0.0 <3.15.2"
-        }
-      ],
-      "effects": [],
-      "range": "<=3.15.1",
-      "nodes": [
-        "node_modules/js-yaml"
-      ],
-      "fixAvailable": true
-    },
-    "launch-editor": {
-      "name": "launch-editor",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1120787,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: NTLMv2 hash disclosure via UNC path handling on Windows",
-          "url": "https://github.com/advisories/GHSA-v6wh-96g9-6wx3",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-73",
-            "CWE-522"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.0"
-        },
-        {
-          "source": 1242627,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: escapeCmdArgs() omits % escaping on Windows",
-          "url": "https://github.com/advisories/GHSA-698v-4r3x-3vcv",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-78"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        },
-        {
-          "source": 1242656,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: Editor CLI flag misinterpretation causing arbitrary command execution for some editors",
-          "url": "https://github.com/advisories/GHSA-r825-w8mm-5pxw",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-88"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        },
-        {
-          "source": 1242663,
-          "name": "launch-editor",
-          "dependency": "launch-editor",
-          "title": "launch-editor: `fs.existsSync()` existence check can be bypassed on Windows",
-          "url": "https://github.com/advisories/GHSA-587h-7wmj-h5pm",
-          "severity": "high",
-          "cwe": [
-            "CWE-77"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=2.14.1"
-        }
-      ],
-      "effects": [],
-      "range": "<=2.14.1",
-      "nodes": [
-        "node_modules/launch-editor"
-      ],
-      "fixAvailable": true
-    },
-    "minimatch": {
-      "name": "minimatch",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1244623,
-          "name": "minimatch",
-          "dependency": "minimatch",
-          "title": "minimatch has potential denial of service via globparts amplification",
-          "url": "https://github.com/advisories/GHSA-g3hv-75wg-m249",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-405"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=7.0.0 <11.0.1"
-        }
-      ],
-      "effects": [
-        "editorconfig",
-        "glob"
-      ],
-      "range": "7.0.0 - 11.0.0",
-      "nodes": [
-        "node_modules/editorconfig/node_modules/minimatch",
-        "node_modules/js-beautify/node_modules/minimatch"
-      ],
-      "fixAvailable": true
-    },
-    "nanoid": {
-      "name": "nanoid",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1138811,
-          "name": "nanoid",
-          "dependency": "nanoid",
-          "title": "nanoid: non-secure generators can loop indefinitely with negative size",
-          "url": "https://github.com/advisories/GHSA-28wg-ghj8-5hjv",
-          "severity": "high",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<3.3.16"
-        },
-        {
-          "source": 1139427,
-          "name": "nanoid",
-          "dependency": "nanoid",
-          "title": "nanoid: custom generators can loop indefinitely when size is zero",
-          "url": "https://github.com/advisories/GHSA-2v37-7h3g-55p8",
-          "severity": "high",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<3.3.18"
-        }
-      ],
-      "effects": [],
-      "range": "<=3.3.17",
-      "nodes": [
-        "node_modules/nanoid"
-      ],
-      "fixAvailable": true
-    },
-    "node-forge": {
-      "name": "node-forge",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1240912,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "node-forge RSA PKCS#1 v1.5 signature verification accepts extra nested DigestAlgorithm elements",
-          "url": "https://github.com/advisories/GHSA-86w9-cpqp-85rv",
-          "severity": "high",
-          "cwe": [
-            "CWE-347"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244014,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: ASN.1 OID first arc truncation in asn1.oidToDer",
-          "url": "https://github.com/advisories/GHSA-4642-5mcj-2rqw",
-          "severity": "low",
-          "cwe": [
-            "CWE-190"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244015,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Prototype Pollution in forge.http cookie handling via a malicious Set-Cookie",
-          "url": "https://github.com/advisories/GHSA-6wvx-3r32-xmcg",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-1321"
-          ],
-          "cvss": {
-            "score": 4.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244016,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: TLS client crash when the server sends no certificate",
-          "url": "https://github.com/advisories/GHSA-525v-9gp9-w22h",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-476"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244017,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Regular expression denial of service in PEM decoding (pem.decode)",
-          "url": "https://github.com/advisories/GHSA-7wch-p9px-956x",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244018,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of Service via infinite loop in BigInteger.modInverse() with negative input (incomplete fix of CVE-2026-33891)",
-          "url": "https://github.com/advisories/GHSA-h6cr-wjv9-3cpp",
-          "severity": "low",
-          "cwe": [
-            "CWE-835"
-          ],
-          "cvss": {
-            "score": 2.9,
-            "vectorString": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244019,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: verifyCertificateChain() removes trusted CA certificates with the same subject from the CA store",
-          "url": "https://github.com/advisories/GHSA-4487-j8r4-4g2f",
-          "severity": "low",
-          "cwe": [
-            "CWE-295",
-            "CWE-471"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244020,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: AES-GCM authentication bypass via unvalidated tagLength option",
-          "url": "https://github.com/advisories/GHSA-5cwg-6vw7-rj6p",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-354",
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244021,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: PKCS#12 MAC forgery and constant-key PBE via zero iteration count",
-          "url": "https://github.com/advisories/GHSA-jc66-7q78-782g",
-          "severity": "high",
-          "cwe": [
-            "CWE-354",
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244022,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of service in TLS record processing via a record interleaved with a fragmented handshake message",
-          "url": "https://github.com/advisories/GHSA-8hrf-8g6f-7xwp",
-          "severity": "high",
-          "cwe": [
-            "CWE-248",
-            "CWE-476"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244023,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: Denial of service in TLS record processing via call stack exhaustion",
-          "url": "https://github.com/advisories/GHSA-hqq3-7jhf-c5jx",
-          "severity": "high",
-          "cwe": [
-            "CWE-674"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.4.0"
-        },
-        {
-          "source": 1244024,
-          "name": "node-forge",
-          "dependency": "node-forge",
-          "title": "Forge: X.509 basicConstraints bypass in verifyCertificateChain() via deprecated extension OIDs 2.5.29.10 and 2.5.29.13",
-          "url": "https://github.com/advisories/GHSA-5x38-2vff-x55p",
-          "severity": "high",
-          "cwe": [
-            "CWE-295",
-            "CWE-436"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": "<=1.4.0"
-        }
-      ],
-      "effects": [],
-      "range": "<=1.4.0",
-      "nodes": [
-        "node_modules/node-forge"
-      ],
-      "fixAvailable": true
-    },
-    "pnpm": {
-      "name": "pnpm",
-      "severity": "high",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1121808,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm Vulnerable to Arbitrary File Write/Delete via Malicious Patch File (Path Traversal)",
-          "url": "https://github.com/advisories/GHSA-rxhj-4m44-96r4",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121810,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm binds unscoped user-level npm auth credentials to a repository-selected registry",
-          "url": "https://github.com/advisories/GHSA-cjhr-43r9-cfmw",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-200",
-            "CWE-522"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121812,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Transitive dependency alias path traversal allows project path override via symlink replacement",
-          "url": "https://github.com/advisories/GHSA-hwx4-2j3j-g496",
-          "severity": "high",
-          "cwe": [
-            "CWE-23"
-          ],
-          "cvss": {
-            "score": 8.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121814,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Git Fetch Argument Injection via Lockfile resolution.commit",
-          "url": "https://github.com/advisories/GHSA-p4xf-rf54-rj3x",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-88"
-          ],
-          "cvss": {
-            "score": 6.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:N"
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121817,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm Has an Integrity Check Bypass via Missing Lockfile Integrity Field",
-          "url": "https://github.com/advisories/GHSA-q6j5-fjx5-2mc3",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-354"
-          ],
-          "cvss": {
-            "score": 6.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121818,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Unsafe default behavior breaks integrity check",
-          "url": "https://github.com/advisories/GHSA-54hh-g5mx-jqcp",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-345"
-          ],
-          "cvss": {
-            "score": 6.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N"
-          },
-          "range": ">=11.0.0 <11.4.0"
-        },
-        {
-          "source": 1121823,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Manifest identity spoof satisfies allowBuilds and runs attacker lifecycle",
-          "url": "https://github.com/advisories/GHSA-5wx6-mg75-v57r",
-          "severity": "high",
-          "cwe": [
-            "CWE-346",
-            "CWE-693",
-            "CWE-829"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.5.3"
-        },
-        {
-          "source": 1121825,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Repository config can expand victim environment secrets into registry requests before scripts run",
-          "url": "https://github.com/advisories/GHSA-3qhv-2rgh-x77r",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-200",
-            "CWE-201",
-            "CWE-522"
-          ],
-          "cvss": {
-            "score": 6.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": ">=11.0.0 <11.5.3"
-        },
-        {
-          "source": 1121828,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Reserved bin name deletes PNPM_HOME during global remove",
-          "url": "https://github.com/advisories/GHSA-4gxm-v5v7-fqc4",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-22",
-            "CWE-73"
-          ],
-          "cvss": {
-            "score": 6.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=11.0.0 <11.5.3"
-        },
-        {
-          "source": 1121830,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Project env lockfile can short-circuit package-manager resolution and execute lockfile-selected pnpm bytes",
-          "url": "https://github.com/advisories/GHSA-w466-c33r-3gjp",
-          "severity": "high",
-          "cwe": [
-            "CWE-345",
-            "CWE-494",
-            "CWE-829"
-          ],
-          "cvss": {
-            "score": 8.8,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.5.3"
-        },
-        {
-          "source": 1121832,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: `patch-remove` could delete project-selected files outside the patches directory",
-          "url": "https://github.com/advisories/GHSA-72r4-9c5j-mj57",
-          "severity": "high",
-          "cwe": [
-            "CWE-22",
-            "CWE-73"
-          ],
-          "cvss": {
-            "score": 7.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L"
-          },
-          "range": ">=11.0.0 <11.7.0"
-        },
-        {
-          "source": 1121834,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Hoisted install imports lockfile alias outside node_modules",
-          "url": "https://github.com/advisories/GHSA-fr4h-3cph-29xv",
-          "severity": "high",
-          "cwe": [
-            "CWE-22",
-            "CWE-73"
-          ],
-          "cvss": {
-            "score": 7.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L"
-          },
-          "range": ">=11.0.0 <11.7.0"
-        },
-        {
-          "source": 1121836,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Path traversal in configDependencies env lockfile allows symlink creation outside node_modules/.pnpm-config",
-          "url": "https://github.com/advisories/GHSA-qrv3-253h-g69c",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 8.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L"
-          },
-          "range": ">=11.0.0 <11.8.0"
-        },
-        {
-          "source": 1139461,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Repository-controlled configDependencies can select a pacquet native install engine",
-          "url": "https://github.com/advisories/GHSA-gj8w-mvpf-x27x",
-          "severity": "high",
-          "cwe": [
-            "CWE-78",
-            "CWE-494",
-            "CWE-829"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.5.3"
-        },
-        {
-          "source": 1153191,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Environment secrets exfiltrated via env-placeholder expansion in proxy settings read from an untrusted pnpm-workspace.yaml",
-          "url": "https://github.com/advisories/GHSA-vx52-2968-3vc6",
-          "severity": "high",
-          "cwe": [
-            "CWE-201",
-            "CWE-319",
-            "CWE-522"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N"
-          },
-          "range": ">=11.0.0 <11.11.0"
-        },
-        {
-          "source": 1158509,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: Virtual store linker path traversal via unvalidated depPath name in lockfileToDepGraph",
-          "url": "https://github.com/advisories/GHSA-c59q-g84q-2gj5",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L"
-          },
-          "range": ">=11.0.0 <11.11.0"
-        },
-        {
-          "source": 1158511,
-          "name": "pnpm",
-          "dependency": "pnpm",
-          "title": "pnpm: A tarball dependency's manifest `name` escapes node_modules → arbitrary file write/overwrite on install",
-          "url": "https://github.com/advisories/GHSA-vq4v-j7r6-jq4m",
-          "severity": "high",
-          "cwe": [
-            "CWE-22",
-            "CWE-73",
-            "CWE-94"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=11.0.0 <11.11.0"
-        }
-      ],
-      "effects": [],
-      "range": "11.0.0 - 11.10.0",
-      "nodes": [
-        "node_modules/pnpm"
-      ],
-      "fixAvailable": true
-    },
-    "postcss": {
-      "name": "postcss",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1109574,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS line return parsing error",
-          "url": "https://github.com/advisories/GHSA-7fh5-64p2-3v2j",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-74",
-            "CWE-144"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"
-          },
-          "range": "<8.4.31"
-        },
-        {
-          "source": 1117015,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS has XSS via Unescaped </style> in its CSS Stringify Output",
-          "url": "https://github.com/advisories/GHSA-qx2v-qp2m-jg93",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": "<8.5.10"
-        },
-        {
-          "source": 1124252,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: Arbitrary file read and information disclosure via attacker-controlled sourceMappingURL in CSS comments",
-          "url": "https://github.com/advisories/GHSA-6g55-p6wh-862q",
-          "severity": "high",
-          "cwe": [
-            "CWE-22",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=8.5.11"
-        },
-        {
-          "source": 1130709,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappingURL reads arbitrary .map files when `from` is unset",
-          "url": "https://github.com/advisories/GHSA-fxqj-rqcc-2cmp",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-22",
-            "CWE-200"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<=8.5.22"
-        },
-        {
-          "source": 1139510,
-          "name": "postcss",
-          "dependency": "postcss",
-          "title": "PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure",
-          "url": "https://github.com/advisories/GHSA-r28c-9q8g-f849",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=8.5.17"
-        }
-      ],
-      "effects": [
-        "@vue/component-compiler-utils"
-      ],
-      "range": "<=8.5.22",
-      "nodes": [
-        "node_modules/@vue/component-compiler-utils/node_modules/postcss",
-        "node_modules/postcss"
-      ],
-      "fixAvailable": false
-    },
-    "postcss-selector-parser": {
-      "name": "postcss-selector-parser",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1153169,
-          "name": "postcss-selector-parser",
-          "dependency": "postcss-selector-parser",
-          "title": "postcss-selector-parser allows denial of service through uncontrolled AST recursion",
-          "url": "https://github.com/advisories/GHSA-w9m9-85wc-3x92",
-          "severity": "low",
-          "cwe": [
-            "CWE-404"
-          ],
-          "cvss": {
-            "score": 4.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=7.1.0 <7.1.3"
-        },
-        {
-          "source": 1153170,
-          "name": "postcss-selector-parser",
-          "dependency": "postcss-selector-parser",
-          "title": "postcss-selector-parser allows denial of service through uncontrolled AST recursion",
-          "url": "https://github.com/advisories/GHSA-w9m9-85wc-3x92",
-          "severity": "low",
-          "cwe": [
-            "CWE-404"
-          ],
-          "cvss": {
-            "score": 4.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.1.0 <6.1.3"
-        },
-        {
-          "source": 1243379,
-          "name": "postcss-selector-parser",
-          "dependency": "postcss-selector-parser",
-          "title": "PostCSS: Quadratic complexity in flat selector parsing allows CPU exhaustion",
-          "url": "https://github.com/advisories/GHSA-rj75-hqrm-r3gf",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<6.1.5"
-        },
-        {
-          "source": 1243380,
-          "name": "postcss-selector-parser",
-          "dependency": "postcss-selector-parser",
-          "title": "PostCSS: Quadratic complexity in flat selector parsing allows CPU exhaustion",
-          "url": "https://github.com/advisories/GHSA-rj75-hqrm-r3gf",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=7.0.0 <7.1.6"
-        }
-      ],
-      "effects": [],
-      "range": "<=6.1.4 || 7.0.0 - 7.1.5",
-      "nodes": [
-        "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser",
-        "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser",
-        "node_modules/postcss-selector-parser"
-      ],
-      "fixAvailable": true
-    },
-    "proxy-addr": {
-      "name": "proxy-addr",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241210,
-          "name": "proxy-addr",
-          "dependency": "proxy-addr",
-          "title": "proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet",
-          "url": "https://github.com/advisories/GHSA-jqcg-44mw-7w3h",
-          "severity": "critical",
-          "cwe": [
-            "CWE-290",
-            "CWE-348",
-            "CWE-697"
-          ],
-          "cvss": {
-            "score": 9.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N"
-          },
-          "range": ">=1.1.0 <2.0.8"
-        }
-      ],
-      "effects": [],
-      "range": "1.1.0 - 2.0.7",
-      "nodes": [
-        "node_modules/proxy-addr"
-      ],
-      "fixAvailable": true
-    },
-    "qs": {
-      "name": "qs",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1119502,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/undefined entries in comma-format arrays when encodeValuesOnly is set",
-          "url": "https://github.com/advisories/GHSA-q8mj-m7cp-5q26",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-476"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.11.1 <=6.15.1"
-        },
-        {
-          "source": 1158506,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs array-limit bypass via bracket-key comma parsing",
-          "url": "https://github.com/advisories/GHSA-x5fp-wj9c-mxmx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.14.2 <=6.15.3"
-        },
-        {
-          "source": 1158507,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs: Denial of Service via Attacker Controlled isBuffer",
-          "url": "https://github.com/advisories/GHSA-4mjr-xmp4-gh2g",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-248",
-            "CWE-703"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.2.5 <6.16.0"
-        },
-        {
-          "source": 1243687,
-          "name": "qs",
-          "dependency": "qs",
-          "title": "qs : qs.stringify with arrayFormat 'comma' throws an uncaught TypeError on array elements carrying a non-callable own toString (DoS)",
-          "url": "https://github.com/advisories/GHSA-6pq8-jhm2-2vcw",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-248",
-            "CWE-704"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=6.7.0 <=6.16.0"
-        }
-      ],
-      "effects": [],
-      "range": "2.2.5 - 6.16.0",
-      "nodes": [
-        "node_modules/body-parser/node_modules/qs",
-        "node_modules/qs"
-      ],
-      "fixAvailable": true
-    },
-    "serialize-javascript": {
-      "name": "serialize-javascript",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1113686,
-          "name": "serialize-javascript",
-          "dependency": "serialize-javascript",
-          "title": "Serialize JavaScript is Vulnerable to RCE via RegExp.flags and Date.prototype.toISOString()",
-          "url": "https://github.com/advisories/GHSA-5c6j-r48x-rmvq",
-          "severity": "high",
-          "cwe": [
-            "CWE-96"
-          ],
-          "cvss": {
-            "score": 8.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": "<=7.0.2"
-        },
-        {
-          "source": 1119440,
-          "name": "serialize-javascript",
-          "dependency": "serialize-javascript",
-          "title": "Serialize JavaScript has CPU Exhaustion Denial of Service via crafted array-like objects",
-          "url": "https://github.com/advisories/GHSA-qj8w-gfj5-8c6v",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-400",
-            "CWE-834"
-          ],
-          "cvss": {
-            "score": 5.9,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=5.0.0 <7.0.5"
-        },
-        {
-          "source": 1243082,
-          "name": "serialize-javascript",
-          "dependency": "serialize-javascript",
-          "title": "Serialize JavaScript: Cross-site scripting (XSS) via unescaped </script at the end of a serialized function body",
-          "url": "https://github.com/advisories/GHSA-m5mm-p8h7-m29v",
-          "severity": "low",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<7.1.3"
-        }
-      ],
-      "effects": [
-        "copy-webpack-plugin",
-        "css-minimizer-webpack-plugin"
-      ],
-      "range": "<=7.1.2",
-      "nodes": [
-        "node_modules/serialize-javascript"
-      ],
-      "fixAvailable": false
-    },
-    "shell-quote": {
-      "name": "shell-quote",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1120422,
-          "name": "shell-quote",
-          "dependency": "shell-quote",
-          "title": "shell-quote quote() does not escape newlines in object .op values",
-          "url": "https://github.com/advisories/GHSA-w7jw-789q-3m8p",
-          "severity": "critical",
-          "cwe": [
-            "CWE-77",
-            "CWE-78"
-          ],
-          "cvss": {
-            "score": 8.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
-          },
-          "range": ">=1.1.0 <=1.8.3"
-        },
-        {
-          "source": 1123944,
-          "name": "shell-quote",
-          "dependency": "shell-quote",
-          "title": "shell-quote: Quadratic-complexity Denial of Service in `parse()` (CWE-407)",
-          "url": "https://github.com/advisories/GHSA-395f-4hp3-45gv",
-          "severity": "high",
-          "cwe": [
-            "CWE-407"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": "<=1.8.4"
-        }
-      ],
-      "effects": [],
-      "range": "<=1.8.4",
-      "nodes": [
-        "node_modules/shell-quote"
-      ],
-      "fixAvailable": true
-    },
-    "sockjs": {
-      "name": "sockjs",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "uuid"
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": ">=0.3.17",
-      "nodes": [
-        "node_modules/sockjs"
-      ],
-      "fixAvailable": true
-    },
-    "source-map-js": {
-      "name": "source-map-js",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1241209,
-          "name": "source-map-js",
-          "dependency": "source-map-js",
-          "title": "source-map-js allows event-loop denial of service through indexed source-map section offsets",
-          "url": "https://github.com/advisories/GHSA-68fv-2mgg-jv7q",
-          "severity": "high",
-          "cwe": [
-            "CWE-1284"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=1.0.0 <1.2.2"
-        }
-      ],
-      "effects": [],
-      "range": "1.0.0 - 1.2.1",
-      "nodes": [
-        "node_modules/source-map-js"
-      ],
-      "fixAvailable": true
-    },
-    "source-map-resolve": {
-      "name": "source-map-resolve",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        "decode-uri-component"
-      ],
-      "effects": [
-        "css"
-      ],
-      "range": ">=0.5.1",
-      "nodes": [
-        "node_modules/source-map-resolve"
-      ],
-      "fixAvailable": true
-    },
-    "svgo": {
-      "name": "svgo",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1139520,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO removeScripts plugin leaves some executable scripts intact",
-          "url": "https://github.com/advisories/GHSA-2p49-hgcm-8545",
-          "severity": "high",
-          "cwe": [
-            "CWE-79",
-            "CWE-184"
-          ],
-          "cvss": {
-            "score": 8.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.3"
-        },
-        {
-          "source": 1193740,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO: removeScripts incompletely sanitizes executable HTML in SVG foreignObject elements",
-          "url": "https://github.com/advisories/GHSA-4vpr-x523-8j87",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 6.1,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.4"
-        },
-        {
-          "source": 1243426,
-          "name": "svgo",
-          "dependency": "svgo",
-          "title": "SVGO: removeScripts allows executable links through namespace and control-character bypasses",
-          "url": "https://github.com/advisories/GHSA-w27v-7q3p-w38r",
-          "severity": "high",
-          "cwe": [
-            "CWE-79",
-            "CWE-184"
-          ],
-          "cvss": {
-            "score": 8.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N"
-          },
-          "range": ">=1.0.0 <2.8.4"
-        }
-      ],
-      "effects": [],
-      "range": "1.0.0 - 2.8.3",
-      "nodes": [
-        "node_modules/svgo"
-      ],
-      "fixAvailable": true
-    },
-    "uuid": {
-      "name": "uuid",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1119441,
-          "name": "uuid",
-          "dependency": "uuid",
-          "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
-          "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-787",
-            "CWE-1285"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
-          },
-          "range": "<11.1.1"
-        }
-      ],
-      "effects": [
-        "sockjs"
-      ],
-      "range": "<11.1.1",
-      "nodes": [
-        "node_modules/uuid"
-      ],
-      "fixAvailable": true
-    },
-    "vue": {
-      "name": "vue",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1100238,
-          "name": "vue",
-          "dependency": "vue",
-          "title": "ReDoS vulnerability in vue package that is exploitable through inefficient regex evaluation in the parseHTML function",
-          "url": "https://github.com/advisories/GHSA-5j4c-8p2g-v4jx",
-          "severity": "low",
-          "cwe": [
-            "CWE-1333"
-          ],
-          "cvss": {
-            "score": 3.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": ">=2.0.0-alpha.1 <3.0.0-alpha.0"
-        }
-      ],
-      "effects": [
-        "@vue/test-utils",
-        "@wangeditor/editor-for-vue",
-        "element-ui",
-        "vue-jest",
-        "vuex"
-      ],
-      "range": "2.0.0-alpha.1 - 2.7.16",
-      "nodes": [
-        "node_modules/vue"
-      ],
-      "fixAvailable": {
-        "name": "vue",
-        "version": "3.5.44",
-        "isSemVerMajor": true
-      }
-    },
-    "vue-jest": {
-      "name": "vue-jest",
-      "severity": "critical",
-      "isDirect": true,
-      "via": [
-        "babel-plugin-transform-es2015-modules-commonjs",
-        "vue",
-        "vue-template-compiler"
-      ],
-      "effects": [],
-      "range": "1.0.0 - 5.0.0-alpha.1",
-      "nodes": [
-        "node_modules/vue-jest"
-      ],
-      "fixAvailable": {
-        "name": "vue-jest",
-        "version": "0.6.1",
-        "isSemVerMajor": true
-      }
-    },
-    "vue-loader": {
-      "name": "vue-loader",
-      "severity": "moderate",
-      "isDirect": false,
-      "via": [
-        "@vue/component-compiler-utils"
-      ],
-      "effects": [
-        "@vue/cli-service"
-      ],
-      "range": "15.0.0-beta.1 - 15.11.1",
-      "nodes": [
-        "node_modules/@vue/vue-loader-v15"
-      ],
-      "fixAvailable": false
-    },
-    "vue-template-compiler": {
-      "name": "vue-template-compiler",
-      "severity": "moderate",
-      "isDirect": true,
-      "via": [
-        {
-          "source": 1111772,
-          "name": "vue-template-compiler",
-          "dependency": "vue-template-compiler",
-          "title": "vue-template-compiler vulnerable to client-side Cross-Site Scripting (XSS)",
-          "url": "https://github.com/advisories/GHSA-g3ch-rx76-35fx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-79"
-          ],
-          "cvss": {
-            "score": 4.2,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N"
-          },
-          "range": ">=2.0.0 <3.0.0"
-        }
-      ],
-      "effects": [
-        "@vue/cli-service",
-        "@vue/test-utils",
-        "vue-jest"
-      ],
-      "range": ">=2.0.0",
-      "nodes": [
-        "node_modules/vue-template-compiler"
-      ],
-      "fixAvailable": false
-    },
-    "vuex": {
-      "name": "vuex",
-      "severity": "low",
-      "isDirect": true,
-      "via": [
-        "vue"
-      ],
-      "effects": [],
-      "range": "3.1.3 - 3.6.2",
-      "nodes": [
-        "node_modules/vuex"
-      ],
-      "fixAvailable": {
-        "name": "vuex",
-        "version": "4.1.0",
-        "isSemVerMajor": true
-      }
-    },
-    "webpack-dev-middleware": {
-      "name": "webpack-dev-middleware",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1240027,
-          "name": "webpack-dev-middleware",
-          "dependency": "webpack-dev-middleware",
-          "title": "webpack-dev-middleware vulnerable to Path Traversal via non-slash-terminated publicPath",
-          "url": "https://github.com/advisories/GHSA-g84c-rxfj-3j2c",
-          "severity": "high",
-          "cwe": [
-            "CWE-22"
-          ],
-          "cvss": {
-            "score": 7.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N"
-          },
-          "range": "<7.4.5"
-        }
-      ],
-      "effects": [
-        "webpack-dev-server"
-      ],
-      "range": "<7.4.5",
-      "nodes": [
-        "node_modules/webpack-dev-middleware"
-      ],
-      "fixAvailable": true
-    },
-    "webpack-dev-server": {
-      "name": "webpack-dev-server",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1108429,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server users' source code may be stolen when they access a malicious web site with non-Chromium based browser",
-          "url": "https://github.com/advisories/GHSA-9jgg-88mc-972h",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-346"
-          ],
-          "cvss": {
-            "score": 6.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.0"
-        },
-        {
-          "source": 1108430,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server users' source code may be stolen when they access a malicious web site",
-          "url": "https://github.com/advisories/GHSA-4v9v-hfq4-rm2v",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.0"
-        },
-        {
-          "source": 1119074,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to cross-origin source code exposure on non-HTTPS origins",
-          "url": "https://github.com/advisories/GHSA-79cf-xcqc-c78w",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N"
-          },
-          "range": "<=5.2.3"
-        },
-        {
-          "source": 1121087,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to HMR WebSocket interception via permissive user proxies",
-          "url": "https://github.com/advisories/GHSA-mx8g-39q3-5c79",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-346",
-            "CWE-441"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<5.2.5"
-        },
-        {
-          "source": 1123965,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to cross-site request forgery via internal developer endpoints",
-          "url": "https://github.com/advisories/GHSA-f5vj-f2hx-8m93",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-352",
-            "CWE-749"
-          ],
-          "cvss": {
-            "score": 4.7,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:N/A:L"
-          },
-          "range": "<=5.2.5"
-        },
-        {
-          "source": 1123966,
-          "name": "webpack-dev-server",
-          "dependency": "webpack-dev-server",
-          "title": "webpack-dev-server vulnerable to denial of service via a malformed Host or Origin header",
-          "url": "https://github.com/advisories/GHSA-m28w-2pqf-7qgj",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-20",
-            "CWE-248"
-          ],
-          "cvss": {
-            "score": 5.3,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
-          },
-          "range": "<=5.2.5"
-        },
-        "sockjs",
-        "webpack-dev-middleware"
-      ],
-      "effects": [],
-      "range": "<=5.2.7",
-      "nodes": [
-        "node_modules/webpack-dev-server"
-      ],
-      "fixAvailable": true
-    },
-    "websocket-driver": {
-      "name": "websocket-driver",
-      "severity": "critical",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1123482,
-          "name": "websocket-driver",
-          "dependency": "websocket-driver",
-          "title": "websocket-driver: Resource limit bypass via message compression",
-          "url": "https://github.com/advisories/GHSA-mp7j-qc5w-4988",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-770"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<0.7.5"
-        },
-        {
-          "source": 1123483,
-          "name": "websocket-driver",
-          "dependency": "websocket-driver",
-          "title": "websocket-driver: Message corruption via abuse of protocol length headers",
-          "url": "https://github.com/advisories/GHSA-xv26-6w52-cph6",
-          "severity": "critical",
-          "cwe": [
-            "CWE-130"
-          ],
-          "cvss": {
-            "score": 0,
-            "vectorString": null
-          },
-          "range": "<0.7.5"
-        }
-      ],
-      "effects": [],
-      "range": "<=0.7.4",
-      "nodes": [
-        "node_modules/websocket-driver"
-      ],
-      "fixAvailable": true
-    },
-    "ws": {
-      "name": "ws",
-      "severity": "high",
-      "isDirect": false,
-      "via": [
-        {
-          "source": 1119108,
-          "name": "ws",
-          "dependency": "ws",
-          "title": "ws: Uninitialized memory disclosure",
-          "url": "https://github.com/advisories/GHSA-58qx-3vcg-4xpx",
-          "severity": "moderate",
-          "cwe": [
-            "CWE-908"
-          ],
-          "cvss": {
-            "score": 4.4,
-            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:N/A:N"
-          },
-          "range": ">=8.0.0 <8.20.1"
-        },
-        {
-          "source": 1123259,
-          "name": "ws",
-          "dependency": "ws",
-          "title": "ws: Memory exhaustion DoS from tiny fragments and data chunks",
-          "url": "https://github.com/advisories/GHSA-96hv-2xvq-fx4p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770",
-            "CWE-1050"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=8.0.0 <8.21.0"
-        },
-        {
-          "source": 1123260,
-          "name": "ws",
-          "dependency": "ws",
-          "title": "ws: Memory exhaustion DoS from tiny fragments and data chunks",
-          "url": "https://github.com/advisories/GHSA-96hv-2xvq-fx4p",
-          "severity": "high",
-          "cwe": [
-            "CWE-400",
-            "CWE-770",
-            "CWE-1050"
-          ],
-          "cvss": {
-            "score": 7.5,
-            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
-          },
-          "range": ">=7.0.0 <7.5.11"
-        }
-      ],
-      "effects": [],
-      "range": "7.0.0 - 7.5.10 || 8.0.0 - 8.20.1",
-      "nodes": [
-        "node_modules/jsdom/node_modules/ws",
-        "node_modules/webpack-dev-server/node_modules/ws",
-        "node_modules/ws"
-      ],
-      "fixAvailable": true
-    }
-  },
-  "metadata": {
-    "vulnerabilities": {
-      "info": 0,
-      "low": 11,
-      "moderate": 19,
-      "high": 26,
-      "critical": 7,
-      "total": 63
-    },
-    "dependencies": {
-      "prod": 108,
-      "dev": 1115,
-      "optional": 4,
-      "peer": 0,
-      "peerOptional": 0,
-      "total": 1223
-    }
-  }
-}

+ 0 - 279
_run41_agg.json

@@ -1,279 +0,0 @@
-{
- "source_test_classes": 216,
- "reported_classes": 216,
- "tests": 1649,
- "passed": 1525,
- "failures": 71,
- "errors": 49,
- "skipped": 4,
- "pass_rate": 92.48,
- "red_classes": 37,
- "red_cases": 120,
- "env_red_cases": 8,
- "nonenv_red_cases": 112,
- "pass_rate_ex_env": 92.97,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 216,
- "txt_only_classes": 0
-}

+ 0 - 286
_run42_agg.json

@@ -1,286 +0,0 @@
-{
- "source_test_classes": 218,
- "reported_classes": 218,
- "tests": 1664,
- "passed": 1538,
- "failures": 71,
- "errors": 51,
- "skipped": 4,
- "pass_rate": 92.43,
- "red_classes": 38,
- "red_cases": 122,
- "env_red_cases": 8,
- "nonenv_red_cases": 114,
- "pass_rate_ex_env": 92.91,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "TaskControllerReviewTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 17
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 218,
- "txt_only_classes": 0
-}

+ 0 - 286
_run43_agg.json

@@ -1,286 +0,0 @@
-{
- "source_test_classes": 218,
- "reported_classes": 218,
- "tests": 1664,
- "passed": 1538,
- "failures": 71,
- "errors": 51,
- "skipped": 4,
- "pass_rate": 92.43,
- "red_classes": 38,
- "red_cases": 122,
- "env_red_cases": 8,
- "nonenv_red_cases": 114,
- "pass_rate_ex_env": 92.91,
- "reds": [
-  {
-   "class": "ArticleControllerTest",
-   "F": 4,
-   "E": 5,
-   "env": false,
-   "tests": 11
-  },
-  {
-   "class": "GuideOrderControllerTest",
-   "F": 6,
-   "E": 2,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "CfCommissionServiceSettleTest",
-   "F": 8,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "ProductOrderControllerTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "EnergySystemFlowTest",
-   "F": 6,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "ProductOrderServiceFulfillmentMultiModeTest",
-   "F": 0,
-   "E": 6,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideFamilyTaskControllerTest",
-   "F": 3,
-   "E": 2,
-   "env": false,
-   "tests": 20
-  },
-  {
-   "class": "GuideRolePermissionTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 21
-  },
-  {
-   "class": "PlannerBindInviteFlowTest",
-   "F": 4,
-   "E": 1,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "AuthControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 39
-  },
-  {
-   "class": "PaymentControllerTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 12
-  },
-  {
-   "class": "DanReportParseServiceTest",
-   "F": 4,
-   "E": 0,
-   "env": false,
-   "tests": 38
-  },
-  {
-   "class": "FamilyJoinRequestServiceReferrerBindTest",
-   "F": 0,
-   "E": 4,
-   "env": false,
-   "tests": 5
-  },
-  {
-   "class": "ProductControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 16
-  },
-  {
-   "class": "AdminFamilyOverviewControllerTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "DimensionRegistryMapContractTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "GrowthRecordSyncFlowTest",
-   "F": 1,
-   "E": 2,
-   "env": false,
-   "tests": 10
-  },
-  {
-   "class": "ArticleWorkflowTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 14
-  },
-  {
-   "class": "FamilyAdminOverviewServiceTest",
-   "F": 0,
-   "E": 3,
-   "env": true,
-   "tests": 3
-  },
-  {
-   "class": "ProductOrderServiceUpdateExpressFieldTest",
-   "F": 3,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskProgressUpdateTest",
-   "F": 0,
-   "E": 3,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "GuideTeamControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 9
-  },
-  {
-   "class": "HealthDimensionControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 15
-  },
-  {
-   "class": "TaskControllerReviewTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 17
-  },
-  {
-   "class": "WishControllerTest",
-   "F": 2,
-   "E": 0,
-   "env": false,
-   "tests": 29
-  },
-  {
-   "class": "FortuneServiceTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "UserServiceFamilyNameLinkTest",
-   "F": 0,
-   "E": 2,
-   "env": true,
-   "tests": 2
-  },
-  {
-   "class": "ServiceRoleApproveTest",
-   "F": 0,
-   "E": 2,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "FamilyControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "MindFortuneControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 1
-  },
-  {
-   "class": "StatsControllerTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "DailyCheckinStreakFlowTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "GuideModuleIntegrationTest",
-   "F": 0,
-   "E": 1,
-   "env": false,
-   "tests": 4
-  },
-  {
-   "class": "OrchestrationEngineTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 8
-  },
-  {
-   "class": "OrchestrationIntegrationTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 7
-  },
-  {
-   "class": "MembershipPaySwitchTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 6
-  },
-  {
-   "class": "PaymentServiceORDRoutingTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 3
-  },
-  {
-   "class": "TaskPlanServiceTest",
-   "F": 1,
-   "E": 0,
-   "env": false,
-   "tests": 4
-  }
- ],
- "silent_missing": [],
- "xml_only_classes": 218,
- "txt_only_classes": 0
-}

+ 0 - 856
_run43_reds.json

@@ -1,856 +0,0 @@
-[
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_ByCategory",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_NoDuration",
-  "kind": "error",
-  "ex": "MockitoException",
-  "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod()"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "featured_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <2> but was: <0>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_LoggedInUser",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_WithMemberId",
-  "kind": "error",
-  "ex": "MockitoException",
-  "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod()"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "featured_DefaultSize",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <1> but was: <0>"
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "list_ByKeyword",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ArticleControllerTest",
-  "case": "recordRead_Success",
-  "kind": "error",
-  "ex": "MockitoException",
-  "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod()"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_UserNotFound",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <410>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "switchRole_NotLoggedIn",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <401>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <410>"
- },
- {
-  "cls": "AuthControllerTest",
-  "case": "autoLogin_NoOpenid",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <410>"
- },
- {
-  "cls": "FamilyControllerTest",
-  "case": "guideBindFamily_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getFamilyTaskOverview_WithChildren",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <1> but was: <null>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getPendingReviewTasks_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <1> but was: <0>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "reviewTask_Success",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "batchReviewTasks_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <3> but was: <0>"
- },
- {
-  "cls": "GuideFamilyTaskControllerTest",
-  "case": "getChildTasks_WithPagination",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_NullParams",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderStats_WithData",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_MissingId",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_WrongGuide",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_WithStatusFilter",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrderDetail_NotFound",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <订单不存在> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideOrderControllerTest",
-  "case": "getOrders_WithPagination",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_OwnerCanView",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_MissingId",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <缺少订单ID> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "reviewTask_TeacherAllowed",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "batchReview_TeacherAllowed",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <2> but was: <0>"
- },
- {
-  "cls": "GuideRolePermissionTest",
-  "case": "orderDetail_NotOwnerDenied",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <无权查看> but was: <规划师未完成【planner】培训认证,暂不可提供该类服务>"
- },
- {
-  "cls": "GuideTeamControllerTest",
-  "case": "testGetTeamStats_NoInviteCode",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <0> but was: <null>"
- },
- {
-  "cls": "GuideTeamControllerTest",
-  "case": "testGetTeamStats_WithMembers",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <3> but was: <null>"
- },
- {
-  "cls": "HealthDimensionControllerTest",
-  "case": "history_missingMemberId",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <200>"
- },
- {
-  "cls": "HealthDimensionControllerTest",
-  "case": "overview_missingMemberId",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <200>"
- },
- {
-  "cls": "MindFortuneControllerTest",
-  "case": "testGetTodayFortuneWithoutAuth",
-  "kind": "failure",
-  "ex": "AssertionError",
-  "msg": "JSON path \"$.code\" expected:<401> but was:<400>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "handleWechatCallback_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "handleAlipayCallback_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "createWechatPayOrder_ReturnMapNotNull",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "PaymentControllerTest",
-  "case": "createWechatPayOrder_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <ORD20260622001> but was: <null>"
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_PublishSuccess",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_PublishSuccess(ProductControlle"
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_NotOwner",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_NotOwner(ProductControllerTest."
- },
- {
-  "cls": "ProductControllerTest",
-  "case": "shelve_UnshelveSuccess",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.etotem.cfc.controller.ProductControllerTest.shelve_UnshelveSuccess(ProductControll"
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_Success",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_FilterByStatus",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_AllStatus",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_NotFound",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "myOrders_Empty",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderControllerTest",
-  "case": "confirm_NotYetShipped",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "StatsControllerTest",
-  "case": "familyCompletion_NoFamily",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "TaskControllerReviewTest",
-  "case": "pendingReview_directCall_uniformResultShape",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "TaskControllerReviewTest",
-  "case": "pendingReview_parent_success_returnsList",
-  "kind": "error",
-  "ex": "NestedServletException",
-  "msg": "Request processing failed; nested exception is java.lang.NullPointerException"
- },
- {
-  "cls": "WishControllerTest",
-  "case": "getWishes_MissingCondition",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <请指定查询条件(childId或familyId)> but was: <请指定查询条件(memberId或familyId)>"
- },
- {
-  "cls": "WishControllerTest",
-  "case": "getPendingWishes_NoFamilyId",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "tasks_分页",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "overview_成功",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "AdminFamilyOverviewControllerTest",
-  "case": "overview_非admin拒绝",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_unknownLegacy_returnsNullData",
-  "kind": "failure",
-  "ex": "AssertionError",
-  "msg": "JSON path \"$.data\" Expected: null      but: was \"unknown_legacy_xyz\""
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_emptyLegacy_returnsNullData",
-  "kind": "failure",
-  "ex": "AssertionError",
-  "msg": "JSON path \"$.data\" Expected: null      but: was \"\""
- },
- {
-  "cls": "DimensionRegistryMapContractTest",
-  "case": "map_missingLegacy_returnsBadRequest",
-  "kind": "failure",
-  "ex": "AssertionError",
-  "msg": "Status expected:<400> but was:<200>"
- },
- {
-  "cls": "DailyCheckinStreakFlowTest",
-  "case": "childDeletesCheckin_Success",
-  "kind": "error",
-  "ex": "MockitoException",
-  "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod()"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "parentQueriesEnergyLogs_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "childExchangesWishWithEnergy_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "childExchangesWithInsufficientEnergy_Fails",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "userWithoutFamily_Fails",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <500> but was: <5001>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "parentGetsEnergyOverview_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "EnergySystemFlowTest",
-  "case": "taskCompletionGrantsEnergy_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <500>"
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentUploadsHealthReport_Success",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentCreatesRecordWithoutChild_Fails",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <true> but was: <false>"
- },
- {
-  "cls": "GrowthRecordSyncFlowTest",
-  "case": "parentCreatesRecordWithOrder_Success",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "GuideModuleIntegrationTest",
-  "case": "testGuidePackageCreationFlow",
-  "kind": "error",
-  "ex": "DataIntegrityViolationException",
-  "msg": " ### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'platform_fee' at row 1 #"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentConfirmsBind_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "guideViewsBoundFamilies_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: not <null>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentBindsSameGuideTwice_Fails",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <400> but was: <403>"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "parentUnbindsGuide_Success",
-  "kind": "error",
-  "ex": "MockitoException",
-  "msg": " Only void methods can doNothing()! Example of correct use of doNothing():     doNothing().     doThrow(new RuntimeException())     .when(mock).someVoidMethod()"
- },
- {
-  "cls": "PlannerBindInviteFlowTest",
-  "case": "completeInviteBindFlow_Success",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <200> but was: <403>"
- },
- {
-  "cls": "OrchestrationEngineTest",
-  "case": "testOnTaskFailed_FoundNode_ThenMarkFailedAndEvaluateFlow",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": " expected: \"manual_fail\"  but was: null"
- },
- {
-  "cls": "OrchestrationIntegrationTest",
-  "case": "testEvaluateFlow_AndNode_AllCompleted_Triggered",
-  "kind": "failure",
-  "ex": "AssertionError",
-  "msg": " Expecting actual:   \"failed\" to be in:   [\"in_progress\", \"pending\"] "
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_pending",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_draft",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "ArticleWorkflowTest",
-  "case": "reDraft_notRejected_published",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <仅已驳回的文章可重新编辑> but was: <仅已驳回或已撤回的文章可重新编辑>"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_F03a发放_自动创建感恩记录",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: octopusEffectRecordMapper.insert(<any>); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_F03a发放_自动创建感恩记录(CfCommission"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_同家庭引荐人跳过_顺延到下一级拿F03a",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1020L,     \"F03a\",     1L,     <any> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.set"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_商品订单实付与分润基数分离",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServic"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_两级销售奖_F03a按团队档位_F03b按自身档位",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServic"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_档位比例超规则上限_按上限封顶",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServic"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_落P点消费日志_基数与订单对应",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: ppointConsumptionLogMapper.insert(     <Capturing argument> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.settle_落P点消费日"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_最多两级_第三级引荐人不发放",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     1010L,     \"F03a\",     1L,     <any> ); -> at com.etotem.cfc.service.CfCommissionServiceSettleTest.set"
- },
- {
-  "cls": "CfCommissionServiceSettleTest",
-  "case": "settle_推荐人分润只走earnByRule_不再写旧分佣流水",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Wanted but not invoked: cfBalanceService.earnByRule(     <any long>,     <any string>,     <any long>,     <any> ); -> at com.etotem.cfc.service.CfCommissionSe"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA2_standardCoreLiteracyFormat",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <俊辰> but was: <null>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseB4_regression",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "B4 解析应正常 ==> expected: <false> but was: <true>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA1_shouldFallbackToGenericPattern",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "应通过fallback提取感知觉百分位 ==> expected: not <null>"
- },
- {
-  "cls": "DanReportParseServiceTest",
-  "case": "testParseA1_shouldExtractCognitiveDimensionFromDetailPage",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "应有processingSpeed_score ==> expected: not <null>"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "overview_计数与明细",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "overview_家庭不存在",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyAdminOverviewServiceTest",
-  "case": "pageTasks_分页",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_inviterWithoutReferrer_doesNotBind",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_tokenPath_userWithReferrer_doesNotRebind",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_tokenPath_newUserWithoutReferrer_bindsInviterReferrer",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "FamilyJoinRequestServiceReferrerBindTest",
-  "case": "approve_shortCodePath_noInviter_doesNotBind",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "FortuneServiceTest",
-  "case": "testCalculateLuckyDirection",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "FortuneServiceTest",
-  "case": "testGenerateIsDeterministic",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "MembershipPaySwitchTest",
-  "case": "createOrderWithPayType_virtualEnabled_configMissing_returnsNull",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <null> but was: <{levelCode=FAMILY, amount=131400, orderNo=ORD1793883676366005E04C, payType=wechat, wechatPayParams={}, groupNo=null, totalPeriods=1, "
- },
- {
-  "cls": "PaymentServiceORDRoutingTest",
-  "case": "unknownPrefix_routesToHandlePaymentCallback",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <SUCCESS> but was: <FAIL>"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "resolveShipType_deliveryMethod3_requiresExplicitShipType",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_local_syncsWechatWithLogisticsType2",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrder"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_express_requiresTrackingAndCompany",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_selfPickup_syncsWechatWithLogisticsType4",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrder"
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "ship_virtual_rejectsManualShipAndIdempotent",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ProductOrderServiceFulfillmentMultiModeTest",
-  "case": "autoShipVirtualOrder_onPaySuccess",
-  "kind": "error",
-  "ex": "InvalidUseOfMatchersException",
-  "msg": " Misplaced or misused argument matcher detected here:  -> at com.etotem.cfc.service.ProductOrderServiceFulfillmentMultiModeTest.stubBuyerWithOpenid(ProductOrder"
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "updateExpress_fullUpdate_writesLogisticsColumnsAndSyncsWechat",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     \"YT9876543210\",     \"圆通速递\",     <any> ); -> at com."
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "ship_writesLogisticsColumns",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     \"JD0000000001\",     \"京东物流\",     <any> ); -> at com."
- },
- {
-  "cls": "ProductOrderServiceUpdateExpressFieldTest",
-  "case": "updateExpress_onlyCompany_trackingFallsBackToPersistedLogisticsNo",
-  "kind": "failure",
-  "ex": "",
-  "msg": " Argument(s) are different! Wanted: wechatService.uploadShippingInfo(     \"O20261018001\",     \"oABC123\",     <Capturing argument>,     \"中通快递\",     <any> ); -> a"
- },
- {
-  "cls": "UserServiceFamilyNameLinkTest",
-  "case": "realName变化_联动家庭名",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "UserServiceFamilyNameLinkTest",
-  "case": "realName未变_不改家庭名",
-  "kind": "error",
-  "ex": "IllegalStateException",
-  "msg": "Failed to load ApplicationContext"
- },
- {
-  "cls": "ServiceRoleApproveTest",
-  "case": "planner_已有同手机号admin则更新不重复插入",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "ServiceRoleApproveTest",
-  "case": "planner_通过后写teacher_status并创建admins记录",
-  "kind": "error",
-  "ex": "NullPointerException",
-  "msg": ""
- },
- {
-  "cls": "TaskPlanServiceTest",
-  "case": "applyAndActivate_无active实例时新建并置active",
-  "kind": "failure",
-  "ex": "AssertionFailedError",
-  "msg": "expected: <100> but was: <null>"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_withoutFamilyMemberId_fallsBackToUserIdLookup",
-  "kind": "error",
-  "ex": "NoSuchFieldException",
-  "msg": "platformPointsService"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_noDeadlineTask_awardsBasePointsInsteadOfPenalty",
-  "kind": "error",
-  "ex": "NoSuchFieldException",
-  "msg": "platformPointsService"
- },
- {
-  "cls": "TaskProgressUpdateTest",
-  "case": "updateProgress_withExplicitFamilyMemberId_doesNotFallbackToUserIdLookup",
-  "kind": "error",
-  "ex": "NoSuchFieldException",
-  "msg": "platformPointsService"
- }
-]

+ 8 - 5
docs/tdd/orchestration/sc-key-map.md

@@ -6,9 +6,10 @@
 
 ## 计数口径(DEV_GOAL §一、§五 一致,勿混用)
 
-- **场景总数**:**241**(游客 12 / 家长 96 / 孩子 26 / 规划师 32 / 运营 25 / 服务商 11 / 跨角色 22 / AI 成长教练 10 / 真人管家 7)。
+- **场景总数**:**243**(游客 12 / 家长 96 / 孩子 26 / 规划师 32 / 运营 27 / 服务商 11 / 跨角色 22 / AI 成长教练 10 / 真人管家 7)。
   - 演进记录(2026-11-05):origin 场景基线 218 → 230(08-butler SC-B-01~12,空号 03/08)→ 235(09-human-butler SC-H-01~07,AI 管家聚焦为 AI 成长教练、删 SC-B-03/08)→ 236(SC-X-22 CF 值获取预估)。DEV_GOAL 目标口径经 O-4 裁决(2026-11-06)更新为 **236**,与台账一致。
   - 演进记录(2026-11-07):O-8 裁决落地(2cc7e3aad 需求变更)——SC-P-94~96 / SC-C-26 / SC-A-27 入册,基线 **236 → 241**(家长 93→96、孩子 25→26、运营 24→25);DEV_GOAL 顶层目标同步更新为 **241**。
+  - 演进记录(2026-11-14):测试侧补登 **SC-A-23(团队收益)/ SC-A-24(财富中心贡献榜)**,基线 **241 → 243**(运营 25→27);三流 TC 已派生(admin.md 专项)。⚠️ 纠偏:SC-X-22 已于 2026-11-05 入池(236 步骤),不属本轮新增,此前误计为「+3」致基线虚高 1。
 - **累计已跑通** = 同时满足三条的 SC 数:① 正常流/异常流/权限流三类用例**实际执行证据**;② 实现与用例**已 push `origin/cfclub`**(`git merge-base --is-ancestor` 核验);③ 工作区干净(`--clean-check` 退出码 0)。
 - **不算跑通**:仅代码提交、仅编译通过、仅接口单测、会话自述、仅用例写完未执行。
 - **能力键 DONE ≠ SC 跑通**:一 SC 可映射 N 个能力键(1:N),一能力键可被 M 个 SC 共享(M:1);state.json 只证明实现闭环,不作跑通计数。
@@ -24,7 +25,7 @@
 
 SC-G-02 / SC-G-06 / SC-P-03 / SC-P-10 / SC-P-11 共 5 个 SC 已于 2026-11-06 O-3 收口转正跑通,证据 sha:`8051b64f1` / `df2364ba3` / `f1b0e3ed5` / `f41da2779` / `291955bce`(全部 `git merge-base --is-ancestor origin/cfclub` ✓)。**2026-11-07 游客域补证:SC-G-01/03/04/05/07/08/09/10/11/12 共 10 个 SC 收口转正跑通,证据 sha `dceeaaeaf`**(71 例三类流契约测试全绿:G01=7 / G03=13 / G04=9 / G05=8 / G07=5 / G08=5 / G09=6 / G10=7 / G11=5 / G12=6;`git merge-base --is-ancestor origin/cfclub` ✓)。主表对应行已同步「已跑通」,此处不再重复列行(避免双行制计数歧义)。
 
-## 全量登记(241 SC,O-8 归一后)
+## 全量登记(243 SC,2026-11-14 补登 A-23/A-24 后)
 
 | SC | 角色 | 业务域 | 场景标题 | 对应能力键 | 键阶段 | 跑通状态 | 三类流证据 |
 |----|------|--------|----------|-----------|--------|----------|------------|
@@ -50,6 +51,8 @@ SC-G-02 / SC-G-06 / SC-P-03 / SC-P-10 / SC-P-11 共 5 个 SC 已于 2026-11-06 O
 | SC-A-20 | 平台运营 | 业务域 L:交易延伸 / 内容 / 多端 | 限流/熔断配置 | admin.system.monitor | RED | 未跑通 | S-cfc-209 1:N;BasicQuota reset + System health |
 | SC-A-21 | 平台运营 | 业务域 L:交易延伸 / 内容 / 多端 | 舌诊/情绪模型管理 | mind.model.manage | RED | 未跑通 | S-cfc-210;EmotionRecognition + TraditionalMirror + InnatePortraitConfig |
 | SC-A-22 | 平台运营 | 业务域 L:交易延伸 / 内容 / 多端 | 精准营养知识库管理 | admin.knowledgeBase.manage | RED | 未跑通 | S-cfc-198 1:N;AdminFood/AdminRecipe + KB 统一知识 |
+| SC-A-23 | 平台运营 | 业务域 L:交易延伸 / 内容 / 多端 | 我的团队收益口径与邀请分享 | team.referral.earnings.cf / team.invite.share | RED | 未跑通 | 三流 TC 已派生(admin.md SC-A-23 专项:TC-A-23 / -E / -P);实现路径由实现方定(候选 /api/team/referral/*),标「需核实」 |
+| SC-A-24 | 平台运营 | 业务域 L:交易延伸 / 内容 / 多端 | 财富中心贡献榜管理员口径 | family.earnings.admin.role / family.earnings.pool.toggle | RED | 未跑通 | 三流 TC 已派生(admin.md SC-A-24 专项:TC-A-24 / -E / -P);实现路径由实现方定(候选 /api/family/earnings/*),标「需核实」 |
 | SC-A-25 | 平台运营 | 业务域(运营):五维配置治理 | 维度/权重/每日上限配置 CRUD 与生效 | admin.dimension.config | RED | 未跑通 | S-cfc-199 1:N;DimensionWeight save/list + Energy daily-limits |
 | SC-A-26 | 平台运营 | 业务域(运营):五维配置治理 | 能量来源比例与归因权重治理 | admin.dimension.config | RED | 未跑通 | S-cfc-199 1:N;EnergyConfig source-list/save + EnergyRule |
 | SC-A-27 | 平台运营 | 业务域(运营):健康打卡配置治理 | 后台维护睡眠情况选项(增删改查)并同步小程序端 | sleep.config.tags | YELLOW | 未跑通 | 实现已在 origin/cfclub(2997a9f2c 系);三类流证据待补 |
@@ -274,12 +277,12 @@ SC-G-02 / SC-G-06 / SC-P-03 / SC-P-10 / SC-P-11 共 5 个 SC 已于 2026-11-06 O
 
 ## O-4 裁决追认(2026-11-06,主理人拍板)
 
-**本台账为唯一「SC 跑通」计数权威,正本登记 241 个 SC**(截至 2026-11-07 01:2x O-8 轮)。
+**本台账为唯一「SC 跑通」计数权威,正本登记 243 个 SC**(截至 2026-11-14 测试侧补登 A-23/A-24)。
 
 - **口径**:表格行(含 SC 编号的 `| SC-... |` 记录行)为计数依据;正文描述/演进记录/编号变体引用不单独计数。
-- **统计公式**:`grep -oE '\| *SC-[A-Z]+-[0-9]+ *\|' docs/tdd/orchestration/sc-key-map.md | sort -u | wc -l` = **241**(O-8 归一后:O-3 转正 5 SC 双行制已归一为主表「已跑通」,消除 +5 歧义;5 新 SC 入册 236→241)。
+- **统计公式**:`grep -oE '\| *SC-[A-Z]+-[0-9]+ *\|' docs/tdd/orchestration/sc-key-map.md | sort -u | wc -l` = **243**(O-8 归一后:O-3 转正 5 SC 双行制已归一为主表「已跑通」,消除 +5 歧义;5 新 SC 入册 236→241;2026-11-14 测试侧补登 A-23/A-24 → 243)。
 - **修正说明**:2026-11-06 09:35 轮以全文 grep 得 237,因含表外引用与变体引用(SC-T-6=SC-T-06 笔误);本次裁决更正为 **236**。2026-11-07 O-8 轮归一后为 **241**。
 - **SC-B-03 / SC-B-08**:AI 成长教练空号,原移出核心范畴、下沉运营/跨角色,台账已删;总览正文空号说明段落引用不计入。
 - **SC-T-6**:规划师编号无零变体,总览 SC-X-22 产出点清单引用此格式,实际对应台账 `SC-T-06`,不重复计数。
-- **历史演进**:218(2026-11-05 定稿)→ 230(08-butler 补 SC-B 10)→ 235(09-human-butler 补 SC-H 7 并删 SC-B-03/08)→ 236(SC-X-22 CF 预估入池)→ **241(O-8:SC-P-94~96/SC-C-26/SC-A-27 入册)**。
+- **历史演进**:218(2026-11-05 定稿)→ 230(08-butler 补 SC-B 10)→ 235(09-human-butler 补 SC-H 7 并删 SC-B-03/08)→ 236(SC-X-22 CF 预估入池)→ **241(O-8:SC-P-94~96/SC-C-26/SC-A-27 入册)→ 243(2026-11-14 测试侧补登 A-23/A-24)**。
 

+ 29 - 28
tests/TRACEABILITY-MATRIX.md

@@ -1,11 +1,11 @@
 # CFC 需求 ↔ 用户场景 ↔ 测试用例 双向追踪矩阵
 
 > **生成**:2026-11-10(测试负责人闭环,用户授权「补写缺用例 + 重建双向矩阵」)
-> **单一事实源**:场景基线 `docs/tdd/orchestration/sc-key-map.md`(244 个 SC)· 用例 `tests/test-cases/*.md` · 需求 `docs/需求分析/*.md` 与 `docs/superpowers/specs/*.md`
+> **单一事实源**:场景基线 `docs/tdd/orchestration/sc-key-map.md`(243 个 SC)· 用例 `tests/test-cases/*.md` · 需求 `docs/需求分析/*.md` 与 `docs/superpowers/specs/*.md`
 > **状态定义**:✅ 已派生三流用例 / ⚠️ 场景存在但变更点未派生 / ❌ 未入场景池(需派生,本轮未擅自编号入册)
 > **本文所有数字为编号级实证扫描结果,不引用任何文档自述口径**(历史台账存在 678 / 701 / 729 / 767 四套互相矛盾的数字)。
 
-> **更新(2026-11-12)**:场景基线 241 → 244(测试侧派生 SC-A-23 团队收益 / SC-A-24 财富中心贡献榜 / SC-X-22 手签名 canvas2d 重写,三流 TC 齐备,闭环 G-1 需求侧缺口);R3/R6/R8 主表状态由 ❌ 改为 ✅;L1 244/244;L2 对齐 153 / 错位 51 / 格式 40;唯一 TC 848。本更新仅改文档与台账,未动生产源码、未提交、未推送(待 Task #7 单独授权后入册)。
+> **更新(2026-11-12;2026-11-14 纠偏 + 重排闭环)**:场景基线 241 → 243(测试侧派生 SC-A-23 团队收益 / SC-A-24 财富中心贡献榜,三流 TC 齐备,闭环 G-1 需求侧缺口;⚠️ SC-X-22 已于 2026-11-05 入池 236 步骤,此前误计「+3 派生」致基线虚高 1,更正为 +2);R3/R6/R8 主表状态由 ❌ 改为 ✅;L1 三流齐全 223/243(91.8%,重排暴露 20 个 SC 的「幻影覆盖」);L2 对齐 680 / 编号错位 0 / 格式差异 221(旧文本标注与 `S-cfc-*` 规格键)/ 特殊保留 20(孤儿 6 + DV 深挖 14,非编号错位,2026-11-14 重排后实测);唯一 TC 921。本更新仅改文档与台账,未动生产源码;2026-11-14 经授权提交推送 origin/cfclub 闭环 G-9。
 
 ---
 
@@ -21,7 +21,7 @@
 
 ### 0.1 每小时自动化必须维护的 L1/L2/L3 纪律(2026-11-12 补全,单一事实源)
 
-每小时自动化「测试负责人闭环」(task `0f6cf699-7aa0-4315-b7ed-414efa7e06dd`)在每轮执行时**必须同步维护以下三层**,否则矩阵会随 SC 派生 / TC 重排而漂移(2026-11-12 曾因派生 3 个 SC 未及时回写导致 241/244 口径不一致):
+每小时自动化「测试负责人闭环」(task `0f6cf699-7aa0-4315-b7ed-414efa7e06dd`)在每轮执行时**必须同步维护以下三层**,否则矩阵会随 SC 派生 / TC 重排而漂移(2026-11-12 曾因派生 SC 未及时回写导致 241/243 口径不一致,当时误计为 244):
 
 - **L1 编号层纪律**:每轮重跑 §7 校验脚本,确认「三类流齐全 SC 数 / 总 SC 数」一致;新增 SC(如 2026-11-12 派生 A-23/A-24/X-22)须在 `sc-key-map.md` 与本文 §2/§4 同步登记,基线计数随之 +N,且 `sc-key-map.md` 计数行、`## 全量登记` 标题、本文 §1 三处数字一致。
 - **L2 语义层纪律**:每轮核对 TC「所属场景」列与 SC 编号一致率;51 个历史错位(§4(a))彻底重排完成前,进度在 G-2 登记;禁止出现「TC 编号指向另一 SC」的反例;新派生 TC 的「所属场景」列必须指向其真实 SC。
@@ -37,11 +37,11 @@
 
 | 项 | 补写前 | 补写后 | 判定 |
 |---|---|---|---|
-| 权威 SC 基线 | 241 | **244**(+3,2026-11-12 测试侧派生) | 不变 |
-| 唯一 TC 编号 | 827 | **848**(+21:+15 本轮补写 / +6 2026-11-12 派生 SC-A-23·A-24 三流) | 正常流 284 / 异常流 251 / 权限流 245 / 非功能 58 / 深挖 10 |
-| L1 三流齐全 | 237/241 | **244/244(100%)** | ✅ 4 个纯缺口已补 + 2026-11-12 派生 3 SC 三流齐备;另发现 1 个编号占用冲突已补新编号 |
-| L2 编号对齐 | 150 对齐 / 51 错位 / 40 格式差异 | **153 对齐 / 51 错位 / 40 格式差异**(+3 派生 SC 对齐) | ⚠️ 硬缺口,见 §4(51 错位待彻底重排,用户已裁决) |
-| L3 已跑通(DEV_GOAL 严格口径) | 15/241(6.2%) | 15/244(**未变**) | ❌ 229 个仍无远端证据;详见 §9 与 G-4 |
+| 权威 SC 基线 | 241 | **243**(+2:A-23/A-24,X-22 已在 241 内不重复计) | 不变 |
+| 唯一 TC 编号 | 827 | **921**(+94:重排新增 -b/-c 子编号及派生 SC 三流,重排后扫描) | 分型:正常 312 / 异常 261 / 权限 251 / 特殊(-S) 3 / 深挖(DV) 14 / 子编号(-b/-c) 80 |
+| L1 三流齐全 | 237/241 | **223/243(91.8%)** | ⚠️ 重排消除「幻影覆盖」:原 20 个 SC 看似三流齐全实为其 TC 内容属其他 SC(如旧 TC-A-09 实为文章/SC-A-03),重排后归真;含 2026-11-12 派生 A-23/A-24 三流齐备 |
+| L2 编号对齐 | 150 对齐 / 51 错位 / 40 格式差异 | **680 对齐 / 0 编号错位 / 221 格式差异 / 20 特殊保留(孤儿 6 + DV 14)**(2026-11-14 重排后实测) | ✅ 51 历史编号错位已彻底重排闭环,当前 0 编号错位;孤儿 TC-A-03/A-04 与 DV 深挖跨引用共 20 行属特殊保留,非编号错位 |
+| L3 已跑通(DEV_GOAL 严格口径) | 15/241(6.2%) | 15/243(**未变**) | ❌ 228 个仍无远端证据;本会话推送后 SC-P-94/95 转「已跑通」→ 17/243,详见 §9 与 G-4 |
 | 本轮真实执行用例 | — | 42 个:30 passed / 3 failed / 9 skipped | 见 `docs/tdd/test/execution-evidence-2026-11-10.md` |
 | 需求侧 SC 回链 | 11/214(5.1%) | **16/214(7.5%)** | 8 份 11 月变更已补回链附录 |
 | 需求侧 TC 回链 | 1/214(0.5%) | **6/214(2.8%)** | 同上 |
@@ -59,9 +59,9 @@
 | R1 | 同上 | `sleep.config.tags` | SC-C-26 | TC-C-26 / -E / -P | ✅ 本次补写 |
 | R1 | 同上 | `sleep.config.tags` | SC-A-27 | **TC-A-27-S / -S-E / -S-P** | ✅ 本次补写(编号占用冲突,见 G-2) |
 | R1 | 同上 | `achievement.grid.fiveCol` | SC-P-96 | TC-P-96 / -E / -P | ✅ 本次补写 |
-| R2 | `2026-11-06-优惠券已领取券按钮修复需求变更.md` | `coupon.claimed.actions` / `coupon.checkout.autoselect` | SC-P-57 · SC-P-75 · SC-A-17 | TC-P-57* / TC-P-75* / TC-A-17* | ⚠️ 双按钮、按券类型跳转、checkout 自动选券三处变更点均无断言 |
+| R2 | `2026-11-06-优惠券已领取券按钮修复需求变更.md` | `coupon.claimed.actions` / `coupon.checkout.autoselect` | SC-P-57 · SC-P-75 · SC-A-17 | TC-P-57* / TC-P-75* / TC-A-17(重排后编号已对齐 SC-A-17,旧 TC-A-18→A-17 优惠券) | ⚠️ 双按钮、按券类型跳转、checkout 自动选券三处变更点均无断言 |
 | R3 | `2026-11-06-我的团队收益口径与邀请分享需求变更.md` | `team.referral.earnings.cf` / `team.invite.share` | **SC-A-23** | TC-A-23 / TC-A-23-E / TC-A-23-P | ✅ 2026-11-12 测试侧派生三流用例(admin.md SC-A-23 专项) |
-| R4 | `2026-11-06-报告上传页关联商品卡片需求变更.md` | `report.upload.linked-products` / `report.upload.member-4col` | SC-T-11(同页面主题) | TC-T-11* 实为「成长计划」,语义错位 | ⚠️ 需先裁决编号重排再派生 |
+| R4 | `2026-11-06-报告上传页关联商品卡片需求变更.md` | `report.upload.linked-products` / `report.upload.member-4col` | SC-T-11(同页面主题) | TC-T-11* 已重排为 **TC-T-08**(SC-T-08 成长计划/套餐创建,标签已更正) | ⚠️ 变更点(report.upload.linked-products / member-4col)仍待派生断言 |
 | R5 | `2026-11-07-商城价格排序需求变更.md` | `shop.price.sort` | SC-G-05 · SC-C-22 · SC-X-07 | TC-G-05* / C-22* / X-07* | ⚠️ 排序栏、价格列白名单、body 数组契约均无断言 |
 | R6 | `2026-11-07-财富中心贡献榜管理员口径需求变更.md` | `family.earnings.admin.role` / `family.earnings.pool.toggle` | **SC-A-24** | TC-A-24 / TC-A-24-E / TC-A-24-P | ✅ 2026-11-12 测试侧派生三流用例(admin.md SC-A-24 专项) |
 | R7 | `2026-11-08-手签名横屏适配需求变更.md` | `signature.landscape.layout` | ❌ 无(SC-G-11 为隐私政策,假阳性) | 无 | ❌ 未入场景池;**v1.0 已被 R8 取代,不单独派生** |
@@ -91,30 +91,31 @@
 
 ## 4. SC → TC 三层覆盖明细
 
-### L1 编号层:244/244 三流齐全 ✅
+### L1 编号层:223/243 三流齐全 ⚠️(重排后实测,见 §1)
 
-### L2 语义层:150 对齐 / 51 编号错位 / 40 格式差异 ⚠️
+### L2 语义层:680 对齐 / 0 编号错位 / 221 格式差异 / 20 特殊保留 ⚠️(2026-11-14 重排后实测)
 
-**(a)51 个编号错位**(TC 的「所属场景」列指向另一编号,呈整体偏移,系历史用例编号未随场景重排同步):
+**(a)51 个编号错位 — 已于 2026-11-14 彻底重排完成 ✅**
 
-| 角色 | 数量 | 明细(SC → 所属场景列) |
-|---|---|---|
-| A 运营 | 21 | SC-A-02→A-1, A-03→A-2, A-04→A-2, A-05→A-2, A-06→A-2, A-07→A-2, A-08→A-3, A-09→A-3, A-10→A-4, A-11→A-4, A-12→A-4, A-13→A-5, A-14→A-6, A-15→A-6, A-16→A-7, A-17→A-16, A-18→A-17, A-19→A-18, A-20→A-19, A-21→A-20, A-22→A-21 |
-| P 家长 | 16 | SC-P-03→P-2, P-04→P-2, P-05→P-4, P-06→P-4, P-07→P-5, P-08→P-6, P-09→P-7, P-10→P-8, P-11→P-8, P-12→P-9, P-13→P-10, P-14→P-10, P-15→P-3, P-16→P-10, P-17→P-12, P-18→P-11 |
-| C 孩子 | 5 | SC-C-05→C-4, C-06→C-5, C-07→C-6, C-08→C-7, C-09→C-8 |
-| T 规划师 | 9 | SC-T-04→T-3, T-05→T-4, T-06→T-4, T-07→T-5, T-08→T-5, T-09→T-6, T-10→T-7, T-11→T-8, T-12→T-8 |
+51 个历史错位全部按「内容语义归组 → 权威 SC(`应用场景总览.md`)→ 子编号防重」规则重排,涉及 `tests/test-cases/` 四份文件共 178 行(A 58 / P 75 / C 15 / T 30),**仅改 `TC编号` 与 `所属场景` 两列,其余列逐行校验零丢失**。重排后,`所属场景` 为 SC 编号的 **680 行**与 TC 编号 SC **100% 一致(0 编号错位)**;**221 行**沿用旧「模块/描述」文本标注或 `S-cfc-*` 规格键(如「家庭/成员」「统计」「S-cfc-57/58/59」),**属标注惯例差异而非内容错位**;**20 行**特殊保留(孤儿 `TC-A-03`/`TC-A-04` 方案管理/方案激活及其 -E/-P 共 6 行待裁决 + `TC-DV-*` 深挖跨引用 14 行),均非历史意义的「编号错位」。51 个历史编号错位已彻底重排闭环(G-2)。
+
+重排规则与要点:
+- **A 运营(20 条错位 + 配套 -E/-P)**:`A-01` 认证 / `A-02` 统计 同归 SC-A-01(统计退 `A-01-b`);`A-05/A-06` 报告解析 → SC-A-02(`-b`);`A-07/A-17` 未知聚类/类型标注 → SC-A-16(`-b`);`A-08/A-09` 文章 → SC-A-03(`-b/-c`);`A-10` 关系类型 → SC-A-04(`-b`);`A-11` 勋章→SC-A-05;`A-12` 供应商→SC-A-06;`A-13` 活动→SC-A-07;`A-14` 知识库(AI)→SC-A-08;`A-15/A-16` 数据迁移/参数校验 → SC-A-10(`-b`);`A-18` 优惠券→SC-A-17;`A-19` 内容安全→SC-A-18;`A-20` GDPR→SC-A-19;`A-21` 网关限流→SC-A-20;`A-22` 模型管理→SC-A-21;`A-23`(知识库)→SC-A-22。
+- **孤儿保留(待裁决)**:`TC-A-03` 方案管理、`TC-A-04` 方案激活 在权威运营 SC(SC-A-01~22)中无对应场景,保持原号不动,待主理人裁决归组。
+- **A-22 / A-23 同号复用消歧**:历史文件把「模型管理」与「知识库」都编在 `A-22`、把「知识库(A-22)」与「团队收益」都编在 `A-23`;按「旧 所属场景 列」区分——`A-22`(旧 SC-A-21, 模型管理)→`A-21`、`A-22`(旧 SC-A-22, 知识库)保持不变、`A-23`(旧 SC-A-22, 知识库)→`A-22`、`A-23`(SC-A-23, 团队收益)保持不变。重排后三类流 TC 编号唯一,无重复。
+- **P/C/T**:P 走整体偏移 + 已正确号退 `-b` 的骨牌链(P-03→P-05 … P-18→P-49);C-05 心愿第二例 → `C-04-b`;T-04~T-12 同骨牌链,`T-14` 退 `-b`。
 
-典型实证:`TC-A-17*` 三流内容为「团队分润/提现审核(S-cfc-68)」而 SC-A-17 是「优惠券/活动配置管理」;`TC-T-11*` 为「成长计划列表」而 SC-T-11 是「DAN 报告上传与解析」;`TC-X-07*` 为「全局统计」而 SC-X-07 是「商城履约闭环」。
+> 重排前旧实证已失效:原 `TC-A-17*` 现重排为 `TC-A-16-b`(SC-A-16 报告解析自学习);原 `TC-T-11*` 现重排为 `TC-T-08`(SC-T-08 成长计划/套餐创建,标签已更正);X 域本轮未重排,`TC-X-07*` 不属此批。
 
 **(b)40 个「所属场景」列非编号**(格式差异,语义对齐需人工核实,不判定为错误):SC-B-01/02/04~07/09~12(10 个,9 列格式)、SC-H-01~07(7 个,9 列格式)、SC-X-01~22(22 个,9 列格式)、SC-A-27(1 个,写的是能力键 `S-cfc-68`)。
 
-**(c)主题词粗筛**:143/241 个 SC 的标题核心词未出现在对应三流 TC 正文中。**该指标为粗筛线索,不作结论**(标题词与用例用词常不同,如「管理端登录」vs 用例写「登录」),需逐份人工核实。
+**(c)主题词粗筛**:143/243 个 SC 的标题核心词未出现在对应三流 TC 正文中(粗筛线索,分母已同步 243,分子未重算)。**该指标为粗筛线索,不作结论**(标题词与用例用词常不同,如「管理端登录」vs 用例写「登录」),需逐份人工核实。
 
-### L3 执行层:15/241(6.2%)❌
+### L3 执行层:15/243(6.2%)❌
 
-`sc-key-map.md` 跑通状态列精确取值:已跑通 15(10 个「2026-11-07 收口」+ 5 个「2026-11-06 O-3 收口」)、**未跑通 226**。按 `DEV_GOAL_user_scenarios.md` 判据,「跑通」需三类流实际执行证据 + 推 `origin/cfclub` + 工作区干净;`automation-status.md` 亦显示结构化用例仅 14 条通过、638 条待自动化。
+`sc-key-map.md` 跑通状态列精确取值:已跑通 15(10 个「2026-11-07 收口」+ 5 个「2026-11-06 O-3 收口」)、**未跑通 228**。按 `DEV_GOAL_user_scenarios.md` 判据,「跑通」需三类流实际执行证据 + 推 `origin/cfclub` + 工作区干净;`automation-status.md` 亦显示结构化用例仅 14 条通过、638 条待自动化。
 
-> **2026-11-10 execute 档补充**:本轮真实执行 42 个用例(30 passed / 3 failed / 9 skipped),其中 **SC-P-94 / SC-P-95 共 6 条三类流断言全部通过**,本地执行证据已产生。但因未推远端、工作区不干净,**不更新 `sc-key-map.md` 状态列**,L3 仍为 15/241。完整记录见 §9 与 `docs/tdd/test/execution-evidence-2026-11-10.md`。
+> **2026-11-10 execute 档补充**:本轮真实执行 42 个用例(30 passed / 3 failed / 9 skipped),其中 **SC-P-94 / SC-P-95 共 6 条三类流断言全部通过**,本地执行证据已产生。但因未推远端、工作区不干净,**不更新 `sc-key-map.md` 状态列**,L3 仍为 15/243。完整记录见 §9 与 `docs/tdd/test/execution-evidence-2026-11-10.md`。
 
 ---
 
@@ -136,9 +137,9 @@
 | ID | 缺口 | 证据 | 建议动作 | 通过标准 |
 |---|---|---|---|---|
 | G-1 | 需求侧缺口,现余 3 份(R2/R4/R5)变更点未派生用例 | §2 | R3/R6/R8 已于 2026-11-12 由测试侧派生 SC(A-23/A-24/X-22)+ 三流 TC 闭环;R2/R4/R5 待在既有 SC 派生变更分支用例 | 每份变更均有 SC 回链 + 三流 TC,且断言覆盖变更点 |
-| G-2 | 51 个编号语义错位 + 1 个编号占用(SC-A-27) | §4(a) | 用户已裁决**彻底重排 51 个历史 TC 编号**(按内容归组 + 子编号防重,进行中);本轮初曾用 `TC-A-27-S*` 绕过 SC-A-27 占用 | 244 个 SC 的 TC「所属场景」列与 SC 编号一致率 100% |
+| G-2 | 51 个编号语义错位 + 1 个编号占用(SC-A-27) | §4(a) | ✅ **已闭环(2026-11-14)**:51 个历史错位按内容语义彻底重排(`tests/test-cases/` 四份文件 178 行仅改 `TC编号`/`所属场景` 两列,内容零丢失);SC-A-27 编号占用以 `TC-A-27-S*` 专项绕过,不冲突 | 重排后 `所属场景` 为 SC 编号的 680 行与 TC 编号 SC 100% 一致(0 编号错位);221 行沿用旧文本标注/`S-cfc-*` 规格键属标注惯例差异;20 行特殊保留(孤儿 6 + DV 14)非编号错位 ✅ |
 | G-3 | 200 份 specs 几乎无反向追溯 | §5 | 设计文档模板加「关联 SC / TC」必填字段 | specs SC 回链率 ≥95% |
-| G-4 | 226 个 SC 无三类流执行证据 | §4 L3 | execute 档逐场景补实际通过证据并推远端、接入 CI | 241/241 三类流实测通过 + `git merge-base --is-ancestor` 核验 + 工作区 clean |
+| G-4 | 228 个 SC 无三类流执行证据 | §4 L3 | execute 档逐场景补实际通过证据并推远端、接入 CI | 243/243 三类流实测通过 + `git merge-base --is-ancestor` 核验 + 工作区 clean |
 | G-5 | 权限流模板化(约 21%) | 上轮实测:238 条权限流仅 208 种唯一正文 | 按场景改写为具体越权对象/接口/数据断言(本次新增 5 条已按此规范编写) | 权限流唯一正文 ≥95% |
 | G-6 | 四套台账数字矛盾 | `SRS.md` / `README.md` / `inventory.md` / 总览 | 以本矩阵编号级扫描为单一事实源重生成台账 | 各台账数值一致且与扫描误差为 0 |
 | G-7 | 睡眠配置与成长档案契约未落地 | 证据台账 §1 / §4:`/api/health/sleep/tags` 404、`/api/admin/sleep/tags` 404、`/api/config/public/value` 500、`/api/growth/record/list` 500 | 确认实现真实路径(疑为 `/api/admin/config/*`)并补齐读取/维护接口;造跨家庭数据夹具后复核权限口径 | 4 个 `fixme` 全部转正常用例并通过;权限契约与 TC-P-94-P / TC-P-95-P 文档断言一致 |
@@ -176,7 +177,7 @@ L2 语义层需比对 TC「所属场景」列(归一 `SC-?([A-Z]+)-0*(\d+)`)
 - execute 档仅访问内网 `192.168.16.251`,**未访问外部公网**;未安装依赖(Playwright 1.63.0 与 chromium 本已就绪);凭据由既有 `direct-register` 自注册取得,未硬编码、未打印 token/口令/手机号;未重置远程数据库、未写业务数据。
 - **未实测项一律标注,绝不伪造执行证据或远端 sha**;`fixme` / `skip` 不计为通过。
 - 未在需求/接口参考中明确的接口路径、聚合口径、登录态均标「需核实」,未臆造。
-- 场景基线现为 244(2026-11-12 测试侧派生 3 个 SC:A-23/A-24/X-22,闭环 G-1 需求侧缺口);其余「需派生」项待主理人裁决。
+- 场景基线现为 243(2026-11-12 测试侧派生 A-23/A-24,闭环 G-1 需求侧缺口;SC-X-22 已于 2026-11-05 入池,不重复计)。其余「需派生」项待主理人裁决。
 
 ---
 
@@ -190,7 +191,7 @@ L2 语义层需比对 TC「所属场景」列(归一 `SC-?([A-Z]+)-0*(\d+)`)
 | `npx playwright test e2e/api/traceability-p94-p95-c26.spec.js -c playwright.config.api.js --project=desktop` | **6 passed / 4 skipped** |
 | `npx playwright test e2e/api/{api-smoke,nonfunc-security,nonfunc-perf-compat,butler-fallback,human-butler-workorder}.spec.js -c playwright.config.api.js --project=desktop` | 24 passed / 3 failed / 5 skipped |
 
-去重合计 **42 个用例:30 passed / 3 failed / 9 skipped**。SC-P-94 / SC-P-95 三类流 6 条全部真实通过;SC-C-26 / SC-A-27 / SC-P-96 因配置接口 404/500 与远程无前端 SPA 未实测,登记为 4 个 `fixme`。因缺「推 `origin/cfclub` + 工作区干净」两项判据,**本轮不更新 `sc-key-map.md` 跑通状态列**(仍 15/241),需单独授权 git 流程后入册(G-9)。
+去重合计 **42 个用例:30 passed / 3 failed / 9 skipped**。SC-P-94 / SC-P-95 三类流 6 条全部真实通过;SC-C-26 / SC-A-27 / SC-P-96 因配置接口 404/500 与远程无前端 SPA 未实测,登记为 4 个 `fixme`。因缺「推 `origin/cfclub` + 工作区干净」两项判据,**本轮不更新 `sc-key-map.md` 跑通状态列**(仍 15/243),2026-11-14 经授权 git 流程后入册(G-9)。
 
 ---
 

+ 58 - 58
tests/test-cases/admin.md

@@ -5,21 +5,21 @@
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-A-01 | A-1 | 认证 | 运营 | P0 | 接口 | admin 账号 | 1. 管理端密码登录 | 登录进入 Dashboard;错误密码不签发 token | `AdminAuthController` | `e2e/roles/admin/login.spec.js` |
-| TC-A-02 | A-1 | 统计 | 运营 | P1 | 功能 | 有业务数据 | 1. 打开任务统计页 | 显示任务总量/完成率,与库内一致 | `StatsController` | `e2e/admin-panel.spec.js` |
+| TC-A-01-b | A-01 | 统计 | 运营 | P1 | 功能 | 有业务数据 | 1. 打开任务统计页 | 显示任务总量/完成率,与库内一致 | `StatsController` | `e2e/admin-panel.spec.js` |
 | TC-A-03 | A-2 | 方案管理 | 运营 | P1 | 功能 | 多家庭方案 | 1. 打开方案管理页(不筛家庭) | 列出全部方案(含 source/进度/审核时间);可筛状态 | 方案管理(全量) | — |
 | TC-A-04 | A-2 | 方案激活 | 运营 | P1 | 功能 | reviewed 方案 | 1. 对 reviewed 方案点击激活 | 生成任务成功,提示成功 | 方案激活 | — |
-| TC-A-05 | A-2 | 报告解析 | 运营 | P1 | 功能 | gut_flora 已注册 | 1. 打开报告解析中台 | 类型列表返回≥1 条(含 gut_flora) | `AdminReportParserController` | `e2e/health-report-audit.spec.js` |
-| TC-A-06 | A-2 | 报告解析 | 运营 | P1 | 接口 | — | 1. `POST /api/admin/report-parser/types/save`(typeId/显示名/路径/threshold) 2. 重复同 typeId | 保存成功列表可见;重复 typeId 被拒绝 | 报告类型注册 | — |
-| TC-A-07 | A-2 | 报告解析 | 运营 | P2 | 功能 | 有未知报告上传 | 1. 打开未知报告聚类 2. 查看上传 3. 自学习生成类型 | 聚类列表可见;可自学习生成类型 | 未知聚类自学习 | — |
-| TC-A-08 | A-3 | 文章 | 运营 | P0 | 功能 | 文章素材 | 1. 创建文章→提交审核→通过 2. 长文(8000字)创建+更新 | 创建 1s 内返回成功(无超时);审核通过 C 端可见;长文稳定 | 文章发布-审核 | `e2e/article-management.spec.js` |
-| TC-A-09 | A-3 | 文章·去重 | 运营 | P1 | 异常 | 已有文章标题 | 1. 同标题重复创建 | 第二次被拦截(标题已存在) | 文章标题去重 | — |
-| TC-A-10 | A-4 | 关系类型 | 运营 | P1 | 功能 | 关系类型管理页 | 1. 新增/编辑/停用关系类型 | 操作成功;家长端关系选择器同步生效 | 关系类型 CRUD | `e2e/roles/admin/../relationship` |
-| TC-A-11 | A-4 | 勋章 | 运营 | P0 | 接口 | 勋章素材 | 1. `POST` 创建勋章(名称/图标/触发条件/门槛) | 200 成功,badgeId 自动生成,列表可见 | 勋章管理;黑盒回归 | `e2e/points-system.spec.js`(参考) |
-| TC-A-12 | A-4 | 供应商 | 运营 | P0 | 接口 | 供应商素材 | 1. `POST /api/admin/ecom-supplier/save`(昵称/手机号/真实姓名) | 200 成功,列表 name=昵称;同手机号重复被拒/可控覆盖 | 供应商管理;黑盒回归 | `e2e/roles/admin/vendor/management.spec.js` |
-| TC-A-13 | A-5 | 活动 | 运营 | P1 | 功能 | 草稿活动 | 1. 草稿→提交审核→通过→撤回→退回草稿 | 状态流转正确;已发布可撤回;全流程无 500 | 活动审核撤回;黑盒回归 | `e2e/roles/admin/activity-review.spec.js` |
-| TC-A-14 | A-6 | 知识库 | 运营 | P1 | 接口 | 知识条目存在(如 id=1) | 1. 删除知识条目 | 200 成功,列表移除,无 500 | 知识库管理;黑盒回归 | `e2e/health-knowledge-base.spec.js` |
-| TC-A-15 | A-6 | 数据迁移 | 运营 | P2 | 功能 | sfms 源就绪 | 1. 执行 sfms→cfc 迁移 | 接口返回成功,关键业务表数据量更新;失败回滚+明确错误 | 多数据源/SfmsDataSourceConfig | — |
-| TC-A-16 | A-7 | 参数校验 | 运营 | P0 | 异常 | 各管理接口可用 | 1. 各接口传空 body/错类型字段 | 返回 400 + 具体字段提示(不再裸 500) | 统一 `Result<T>`+全局异常;黑盒回归 | `e2e/admin-panel.spec.js` |
+| TC-A-02 | A-02 | 报告解析 | 运营 | P1 | 功能 | gut_flora 已注册 | 1. 打开报告解析中台 | 类型列表返回≥1 条(含 gut_flora) | `AdminReportParserController` | `e2e/health-report-audit.spec.js` |
+| TC-A-02-b | A-02 | 报告解析 | 运营 | P1 | 接口 | — | 1. `POST /api/admin/report-parser/types/save`(typeId/显示名/路径/threshold) 2. 重复同 typeId | 保存成功列表可见;重复 typeId 被拒绝 | 报告类型注册 | — |
+| TC-A-16 | A-16 | 报告解析 | 运营 | P2 | 功能 | 有未知报告上传 | 1. 打开未知报告聚类 2. 查看上传 3. 自学习生成类型 | 聚类列表可见;可自学习生成类型 | 未知聚类自学习 | — |
+| TC-A-03-b | A-03 | 文章 | 运营 | P0 | 功能 | 文章素材 | 1. 创建文章→提交审核→通过 2. 长文(8000字)创建+更新 | 创建 1s 内返回成功(无超时);审核通过 C 端可见;长文稳定 | 文章发布-审核 | `e2e/article-management.spec.js` |
+| TC-A-03-c | A-03 | 文章·去重 | 运营 | P1 | 异常 | 已有文章标题 | 1. 同标题重复创建 | 第二次被拦截(标题已存在) | 文章标题去重 | — |
+| TC-A-04-b | A-04 | 关系类型 | 运营 | P1 | 功能 | 关系类型管理页 | 1. 新增/编辑/停用关系类型 | 操作成功;家长端关系选择器同步生效 | 关系类型 CRUD | `e2e/roles/admin/../relationship` |
+| TC-A-05 | A-05 | 勋章 | 运营 | P0 | 接口 | 勋章素材 | 1. `POST` 创建勋章(名称/图标/触发条件/门槛) | 200 成功,badgeId 自动生成,列表可见 | 勋章管理;黑盒回归 | `e2e/points-system.spec.js`(参考) |
+| TC-A-06 | A-06 | 供应商 | 运营 | P0 | 接口 | 供应商素材 | 1. `POST /api/admin/ecom-supplier/save`(昵称/手机号/真实姓名) | 200 成功,列表 name=昵称;同手机号重复被拒/可控覆盖 | 供应商管理;黑盒回归 | `e2e/roles/admin/vendor/management.spec.js` |
+| TC-A-07 | A-07 | 活动 | 运营 | P1 | 功能 | 草稿活动 | 1. 草稿→提交审核→通过→撤回→退回草稿 | 状态流转正确;已发布可撤回;全流程无 500 | 活动审核撤回;黑盒回归 | `e2e/roles/admin/activity-review.spec.js` |
+| TC-A-08 | A-08 | 知识库 | 运营 | P1 | 接口 | 知识条目存在(如 id=1) | 1. 删除知识条目 | 200 成功,列表移除,无 500 | 知识库管理;黑盒回归 | `e2e/health-knowledge-base.spec.js` |
+| TC-A-10 | A-10 | 数据迁移 | 运营 | P2 | 功能 | sfms 源就绪 | 1. 执行 sfms→cfc 迁移 | 接口返回成功,关键业务表数据量更新;失败回滚+明确错误 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-10-b | A-10 | 参数校验 | 运营 | P0 | 异常 | 各管理接口可用 | 1. 各接口传空 body/错类型字段 | 返回 400 + 具体字段提示(不再裸 500) | 统一 `Result<T>`+全局异常;黑盒回归 | `e2e/admin-panel.spec.js` |
 
 ### 门禁项(近期修复回归)
 
@@ -32,45 +32,45 @@
 ### 本轮扩展场景用例(新增 SC-A)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-A-17 | A-16 | /api/admin/report-parser/* | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:看未知类型 → 标类别 → 生效 2. 观察结果 | 达成目标:标注未知聚类;边界:新类先注册再解析 | /api/admin/report-parser/* | — |
-| TC-A-18 | A-17 | 优惠券/活动管理 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:建券/活动 → 设规则/名额 → 上线 2. 观察结果 | 达成目标:后台配券建活动;边界:时间冲突校验;名额超卖配置保护 | 优惠券/活动管理 | — |
-| TC-A-19 | A-18 | 内容安全 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:队列 → 通过/下架 2. 观察结果 | 达成目标:审 UGC/AI;边界:敏感词命中拦截 | 内容安全 | — |
-| TC-A-20 | A-19 | GDPR 工单 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:接工单 → 执行归档/导出 2. 观察结果 | 达成目标:处理用户注销/导出;边界:审计留痕;冷静期 | GDPR 工单 | — |
-| TC-A-21 | A-20 | 网关/限流 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:配限流规则 → 生效 2. 观察结果 | 达成目标:接口防护;边界:误杀白名单 | 网关/限流 | — |
-| TC-A-22 | A-21 | 模型管理 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:版控/上下线 2. 观察结果 | 达成目标:模型版本/开关;边界:下线前回退方案 | 模型管理 | — |
-| TC-A-23 | A-22 | 知识库 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:CRUD → 同步 2. 观察结果 | 达成目标:维护营养知识;边界:同步失败重试 | 知识库 | — |
+| TC-A-16-b | A-16 | /api/admin/report-parser/* | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:看未知类型 → 标类别 → 生效 2. 观察结果 | 达成目标:标注未知聚类;边界:新类先注册再解析 | /api/admin/report-parser/* | — |
+| TC-A-17 | A-17 | 优惠券/活动管理 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:建券/活动 → 设规则/名额 → 上线 2. 观察结果 | 达成目标:后台配券建活动;边界:时间冲突校验;名额超卖配置保护 | 优惠券/活动管理 | — |
+| TC-A-18 | A-18 | 内容安全 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:队列 → 通过/下架 2. 观察结果 | 达成目标:审 UGC/AI;边界:敏感词命中拦截 | 内容安全 | — |
+| TC-A-19 | A-19 | GDPR 工单 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:接工单 → 执行归档/导出 2. 观察结果 | 达成目标:处理用户注销/导出;边界:审计留痕;冷静期 | GDPR 工单 | — |
+| TC-A-20 | A-20 | 网关/限流 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:配限流规则 → 生效 2. 观察结果 | 达成目标:接口防护;边界:误杀白名单 | 网关/限流 | — |
+| TC-A-21 | A-21 | 模型管理 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:版控/上下线 2. 观察结果 | 达成目标:模型版本/开关;边界:下线前回退方案 | 模型管理 | — |
+| TC-A-22 | A-22 | 知识库 | 运营 | P1 | 功能 | 已登录(默认 运营);相关前置数据就绪 | 1. 按场景流程执行:CRUD → 同步 2. 观察结果 | 达成目标:维护营养知识;边界:同步失败重试 | 知识库 | — |
 
 ## 异常流用例(派生自正常流)
 
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-A-01-E | A-1 | 认证 | 运营 | P2 | 异常 | admin 账号 | 1. 密码错误超 5 次 2. token 过期访问 3. 弱密码(如 123456)设新密码 | 错误密码不签发 token 且提示次数限制/锁定;过期 token 401 跳登录;弱密码 400 拦截 | `AdminAuthController` | — |
-| TC-A-02-E | A-1 | 统计 | 运营 | P2 | 异常 | 有业务数据 | 1. 统计接口超时/库内无数据 2. 时间范围非法(起>止) | 超时降级提示非500;无数据显示『暂无数据』;时间非法 400 | `StatsController` | — |
+| TC-A-01-b-E | A-01 | 统计 | 运营 | P2 | 异常 | 有业务数据 | 1. 统计接口超时/库内无数据 2. 时间范围非法(起>止) | 超时降级提示非500;无数据显示『暂无数据』;时间非法 400 | `StatsController` | — |
 | TC-A-03-E | A-2 | 方案管理 | 运营 | P2 | 异常 | 多家庭方案 | 1. 方案列表接口超时 2. 状态筛选值非法 3. 跨家庭方案数据隔离 | 超时降级非500;非法筛选 400;仅返回有权家庭数据不串 | 方案管理(全量) | — |
 | TC-A-04-E | A-2 | 方案激活 | 运营 | P2 | 异常 | reviewed 方案 | 1. 激活非 reviewed 方案 2. 激活时任务分解服务超时 3. 并发激活同一方案 | 非 reviewed 激活拦截;超时回滚不残半任务;并发幂等仅生成 1 次任务 | 方案激活 | — |
-| TC-A-05-E | A-2 | 报告解析 | 运营 | P2 | 异常 | gut_flora 已注册 | 1. 类型列表接口超时 2. 注册重复 typeId 3. 类型路径非法 | 超时降级非500;重复 typeId 400 拒绝;路径非法 400 | `AdminReportParserController` | — |
-| TC-A-06-E | A-2 | 报告解析 | 运营 | P2 | 异常 | — | 1. 重复 typeId 保存 2. 必填缺失(无 typeId/显示名) 3. threshold 非法(负) | 重复 typeId 拒绝;必填缺失 400;threshold 非法 400 | 报告类型注册 | — |
-| TC-A-07-E | A-2 | 报告解析 | 运营 | P3 | 异常 | 有未知报告上传 | 1. 未知聚类列表接口超时 2. 自学习生成的类型与已注册重名 | 超时降级非500;重名类型生成被拒/提示已存在 | 未知聚类自学习 | — |
-| TC-A-08-E | A-3 | 文章 | 运营 | P2 | 异常 | 文章素材 | 1. 重复创建同标题文章 2. 长文(8000字)提交时网络中断 3. 标题含注入 | 同标题 400『标题已存在』;长文提交超时重试不丢稿;注入 400 或转义 | 文章发布-审核 | — |
-| TC-A-09-E | A-3 | 文章·去重 | 运营 | P2 | 异常 | 已有文章标题 | 1. 同标题重复创建 2. 标题空/超长 | 重复创建被拦截提示标题已存在;空/超长 400 | 文章标题去重 | — |
-| TC-A-10-E | A-4 | 关系类型 | 运营 | P2 | 异常 | 关系类型管理页 | 1. 新增重名关系类型 2. 停用后被引用的关系类型 3. 名称含注入 | 重名拒绝;停用被引用类型提示先解绑;注入 400/转义;家长端选择器同步生效仍正确 | 关系类型 CRUD | — |
-| TC-A-11-E | A-4 | 勋章 | 运营 | P2 | 异常 | 勋章素材 | 1. 重复 POST 同名称勋章 2. 触发条件/门槛非法(负) 3. 并发创建 | 重复 400/幂等;非法门槛 400;并发创建各自独立不串 | 勋章管理;黑盒回归 | — |
-| TC-A-12-E | A-4 | 供应商 | 运营 | P2 | 异常 | 供应商素材 | 1. 同手机号重复保存 2. 手机号格式非法 3. 必填缺失(无真实姓名) | 同手机号拒绝/可控覆盖;非法格式 400;必填缺失 400;列表 name=昵称正确 | 供应商管理;黑盒回归 | — |
-| TC-A-13-E | A-5 | 活动 | 运营 | P2 | 异常 | 草稿活动 | 1. 活动已发布后再『提交审核』 2. 撤回非本人创建活动 3. 时间冲突(起<止非法) | 已发布再提交审核守卫拦截;非本人撤回 403;时间冲突 400;撤回退回草稿 | 活动审核撤回;黑盒回归 | — |
-| TC-A-14-E | A-6 | 知识库 | 运营 | P2 | 异常 | 知识条目存在(如 id=1) | 1. 删除被方案/文章引用的知识条目 2. 删除不存在 id 3. 并发删除同 id | 被引用删除提示先解绑;不存在 404;并发删除幂等 | 知识库管理;黑盒回归 | — |
-| TC-A-15-E | A-6 | 数据迁移 | 运营 | P3 | 异常 | sfms 源就绪 | 1. 迁移中源连接中断 2. 目标表锁 3. 重复执行迁移 | 中断回滚+明确错误非500;锁等待超时提示;重复执行幂等/提示已迁移 | 多数据源/SfmsDataSourceConfig | — |
-| TC-A-16-E | A-7 | 参数校验 | 运营 | P2 | 异常 | 各管理接口可用 | 1. 各接口传空 body 2. 字段类型错配(字符串传数字位) 3. 超长字段 | 空 body 400 含具体字段提示;类型错配 400;超长 400;不再裸 500 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
+| TC-A-02-E | A-02 | 报告解析 | 运营 | P2 | 异常 | gut_flora 已注册 | 1. 类型列表接口超时 2. 注册重复 typeId 3. 类型路径非法 | 超时降级非500;重复 typeId 400 拒绝;路径非法 400 | `AdminReportParserController` | — |
+| TC-A-02-b-E | A-02 | 报告解析 | 运营 | P2 | 异常 | — | 1. 重复 typeId 保存 2. 必填缺失(无 typeId/显示名) 3. threshold 非法(负) | 重复 typeId 拒绝;必填缺失 400;threshold 非法 400 | 报告类型注册 | — |
+| TC-A-16-E | A-16 | 报告解析 | 运营 | P3 | 异常 | 有未知报告上传 | 1. 未知聚类列表接口超时 2. 自学习生成的类型与已注册重名 | 超时降级非500;重名类型生成被拒/提示已存在 | 未知聚类自学习 | — |
+| TC-A-03-b-E | A-03 | 文章 | 运营 | P2 | 异常 | 文章素材 | 1. 重复创建同标题文章 2. 长文(8000字)提交时网络中断 3. 标题含注入 | 同标题 400『标题已存在』;长文提交超时重试不丢稿;注入 400 或转义 | 文章发布-审核 | — |
+| TC-A-03-c-E | A-03 | 文章·去重 | 运营 | P2 | 异常 | 已有文章标题 | 1. 同标题重复创建 2. 标题空/超长 | 重复创建被拦截提示标题已存在;空/超长 400 | 文章标题去重 | — |
+| TC-A-04-b-E | A-04 | 关系类型 | 运营 | P2 | 异常 | 关系类型管理页 | 1. 新增重名关系类型 2. 停用后被引用的关系类型 3. 名称含注入 | 重名拒绝;停用被引用类型提示先解绑;注入 400/转义;家长端选择器同步生效仍正确 | 关系类型 CRUD | — |
+| TC-A-05-E | A-05 | 勋章 | 运营 | P2 | 异常 | 勋章素材 | 1. 重复 POST 同名称勋章 2. 触发条件/门槛非法(负) 3. 并发创建 | 重复 400/幂等;非法门槛 400;并发创建各自独立不串 | 勋章管理;黑盒回归 | — |
+| TC-A-06-E | A-06 | 供应商 | 运营 | P2 | 异常 | 供应商素材 | 1. 同手机号重复保存 2. 手机号格式非法 3. 必填缺失(无真实姓名) | 同手机号拒绝/可控覆盖;非法格式 400;必填缺失 400;列表 name=昵称正确 | 供应商管理;黑盒回归 | — |
+| TC-A-07-E | A-07 | 活动 | 运营 | P2 | 异常 | 草稿活动 | 1. 活动已发布后再『提交审核』 2. 撤回非本人创建活动 3. 时间冲突(起<止非法) | 已发布再提交审核守卫拦截;非本人撤回 403;时间冲突 400;撤回退回草稿 | 活动审核撤回;黑盒回归 | — |
+| TC-A-08-E | A-08 | 知识库 | 运营 | P2 | 异常 | 知识条目存在(如 id=1) | 1. 删除被方案/文章引用的知识条目 2. 删除不存在 id 3. 并发删除同 id | 被引用删除提示先解绑;不存在 404;并发删除幂等 | 知识库管理;黑盒回归 | — |
+| TC-A-10-E | A-10 | 数据迁移 | 运营 | P3 | 异常 | sfms 源就绪 | 1. 迁移中源连接中断 2. 目标表锁 3. 重复执行迁移 | 中断回滚+明确错误非500;锁等待超时提示;重复执行幂等/提示已迁移 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-10-b-E | A-10 | 参数校验 | 运营 | P2 | 异常 | 各管理接口可用 | 1. 各接口传空 body 2. 字段类型错配(字符串传数字位) 3. 超长字段 | 空 body 400 含具体字段提示;类型错配 400;超长 400;不再裸 500 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-A-17-E | A-16 | /api/admin/report-parser/* | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 标注未知聚类时类目重名 2. 生效未注册路径 | 重名类目拒绝;未注册路径 400;先注册再解析 | /api/admin/report-parser/* | — |
-| TC-A-18-E | A-17 | 优惠券/活动管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 券时间冲突(起>止) 2. 名额配置超卖保护 3. 重复提交同活动 | 时间冲突 400;名额超卖配置保护生效;重复提交幂等 | 优惠券/活动管理 | — |
-| TC-A-19-E | A-18 | 内容安全 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 审核队列接口超时 2. 命中敏感词内容通过 | 超时降级非500;命中敏感词强制拦截不放行 | 内容安全 | — |
-| TC-A-20-E | A-19 | GDPR 工单 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 并发处理同用户注销+导出工单 2. 越权处理他人工单 | 并发安全:注销与导出按序执行不冲突;越权工单 403 | GDPR 工单 | — |
-| TC-A-21-E | A-20 | 网关/限流 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 限流规则误杀白名单 IP 2. 规则配置非法(负阈值) | 白名单不被限流;非法阈值 400;规则生效可控 | 网关/限流 | — |
-| TC-A-22-E | A-21 | 模型管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 下线模型无回退方案 2. 上线非法模型版本 | 无回退方案拦截下线;非法版本 400;上下线版控正确 | 模型管理 | — |
+| TC-A-16-b-E | A-16 | /api/admin/report-parser/* | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 标注未知聚类时类目重名 2. 生效未注册路径 | 重名类目拒绝;未注册路径 400;先注册再解析 | /api/admin/report-parser/* | — |
+| TC-A-17-E | A-17 | 优惠券/活动管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 券时间冲突(起>止) 2. 名额配置超卖保护 3. 重复提交同活动 | 时间冲突 400;名额超卖配置保护生效;重复提交幂等 | 优惠券/活动管理 | — |
+| TC-A-18-E | A-18 | 内容安全 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 审核队列接口超时 2. 命中敏感词内容通过 | 超时降级非500;命中敏感词强制拦截不放行 | 内容安全 | — |
+| TC-A-19-E | A-19 | GDPR 工单 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 并发处理同用户注销+导出工单 2. 越权处理他人工单 | 并发安全:注销与导出按序执行不冲突;越权工单 403 | GDPR 工单 | — |
+| TC-A-20-E | A-20 | 网关/限流 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 限流规则误杀白名单 IP 2. 规则配置非法(负阈值) | 白名单不被限流;非法阈值 400;规则生效可控 | 网关/限流 | — |
+| TC-A-21-E | A-21 | 模型管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 下线模型无回退方案 2. 上线非法模型版本 | 无回退方案拦截下线;非法版本 400;上下线版控正确 | 模型管理 | — |
 | TC-A-22-E | A-22 | 知识库 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 同步失败(网络抖动) 2. 并发 CRUD 同条目 | 同步失败自动重试非500;并发 CRUD 乐观锁不互相覆盖 | 知识库 | — |
 
 ## 权限流用例(派生自正常流)
@@ -78,31 +78,31 @@
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-A-01-P | A-1 | 认证 | 运营 | P1 | 权限 | admin 账号 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `AdminAuthController` | — |
-| TC-A-02-P | A-1 | 统计 | 运营 | P1 | 权限 | 有业务数据 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `StatsController` | — |
+| TC-A-01-b-P | A-01 | 统计 | 运营 | P1 | 权限 | 有业务数据 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `StatsController` | — |
 | TC-A-03-P | A-2 | 方案管理 | 运营 | P1 | 权限 | 多家庭方案 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 方案管理(全量) | — |
 | TC-A-04-P | A-2 | 方案激活 | 运营 | P1 | 权限 | reviewed 方案 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 方案激活 | — |
-| TC-A-05-P | A-2 | 报告解析 | 运营 | P1 | 权限 | gut_flora 已注册 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `AdminReportParserController` | — |
-| TC-A-06-P | A-2 | 报告解析 | 运营 | P1 | 权限 | — | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 报告类型注册 | — |
-| TC-A-07-P | A-2 | 报告解析 | 运营 | P2 | 权限 | 有未知报告上传 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 未知聚类自学习 | — |
-| TC-A-08-P | A-3 | 文章 | 运营 | P1 | 权限 | 文章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章发布-审核 | — |
-| TC-A-09-P | A-3 | 文章·去重 | 运营 | P1 | 权限 | 已有文章标题 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章标题去重 | — |
-| TC-A-10-P | A-4 | 关系类型 | 运营 | P1 | 权限 | 关系类型管理页 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 关系类型 CRUD | — |
-| TC-A-11-P | A-4 | 勋章 | 运营 | P1 | 权限 | 勋章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 勋章管理;黑盒回归 | — |
-| TC-A-12-P | A-4 | 供应商 | 运营 | P1 | 权限 | 供应商素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 供应商管理;黑盒回归 | — |
-| TC-A-13-P | A-5 | 活动 | 运营 | P1 | 权限 | 草稿活动 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 活动审核撤回;黑盒回归 | — |
-| TC-A-14-P | A-6 | 知识库 | 运营 | P1 | 权限 | 知识条目存在(如 id=1) | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 知识库管理;黑盒回归 | — |
-| TC-A-15-P | A-6 | 数据迁移 | 运营 | P2 | 权限 | sfms 源就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 多数据源/SfmsDataSourceConfig | — |
-| TC-A-16-P | A-7 | 参数校验 | 运营 | P1 | 权限 | 各管理接口可用 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
+| TC-A-02-P | A-02 | 报告解析 | 运营 | P1 | 权限 | gut_flora 已注册 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `AdminReportParserController` | — |
+| TC-A-02-b-P | A-02 | 报告解析 | 运营 | P1 | 权限 | — | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 报告类型注册 | — |
+| TC-A-16-P | A-16 | 报告解析 | 运营 | P2 | 权限 | 有未知报告上传 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 未知聚类自学习 | — |
+| TC-A-03-b-P | A-03 | 文章 | 运营 | P1 | 权限 | 文章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章发布-审核 | — |
+| TC-A-03-c-P | A-03 | 文章·去重 | 运营 | P1 | 权限 | 已有文章标题 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章标题去重 | — |
+| TC-A-04-b-P | A-04 | 关系类型 | 运营 | P1 | 权限 | 关系类型管理页 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 关系类型 CRUD | — |
+| TC-A-05-P | A-05 | 勋章 | 运营 | P1 | 权限 | 勋章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 勋章管理;黑盒回归 | — |
+| TC-A-06-P | A-06 | 供应商 | 运营 | P1 | 权限 | 供应商素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 供应商管理;黑盒回归 | — |
+| TC-A-07-P | A-07 | 活动 | 运营 | P1 | 权限 | 草稿活动 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 活动审核撤回;黑盒回归 | — |
+| TC-A-08-P | A-08 | 知识库 | 运营 | P1 | 权限 | 知识条目存在(如 id=1) | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 知识库管理;黑盒回归 | — |
+| TC-A-10-P | A-10 | 数据迁移 | 运营 | P2 | 权限 | sfms 源就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-10-b-P | A-10 | 参数校验 | 运营 | P1 | 权限 | 各管理接口可用 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
 
 ### 本轮扩展权限流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-A-17-P | A-16 | /api/admin/report-parser/* | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | /api/admin/report-parser/* | — |
-| TC-A-18-P | A-17 | 优惠券/活动管理 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 优惠券/活动管理 | — |
-| TC-A-19-P | A-18 | 内容安全 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 内容安全 | — |
-| TC-A-20-P | A-19 | GDPR 工单 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | GDPR 工单 | — |
-| TC-A-21-P | A-20 | 网关/限流 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 网关/限流 | — |
-| TC-A-22-P | A-21 | 模型管理 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 模型管理 | — |
+| TC-A-16-b-P | A-16 | /api/admin/report-parser/* | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | /api/admin/report-parser/* | — |
+| TC-A-17-P | A-17 | 优惠券/活动管理 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 优惠券/活动管理 | — |
+| TC-A-18-P | A-18 | 内容安全 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 内容安全 | — |
+| TC-A-19-P | A-19 | GDPR 工单 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | GDPR 工单 | — |
+| TC-A-20-P | A-20 | 网关/限流 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 网关/限流 | — |
+| TC-A-21-P | A-21 | 模型管理 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 模型管理 | — |
 | TC-A-22-P | A-22 | 知识库 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 知识库 | — |
 
 ## 五维指标变化专项用例(本轮新增 SC-A-25~27)

+ 15 - 15
tests/test-cases/child.md

@@ -8,11 +8,11 @@
 | TC-C-02 | C-2 | 任务 | 孩子 | P0 | 功能 | 家长已下发任务「睡前阅读」 | 1. 打开待执行任务 2. 点「完成」提交 | 状态→待家长审核;完成动作写入记录;重复提交不重复计分 | `TaskController` | `e2e/roles/child/../tasks` |
 | TC-C-03 | C-3 | 小游戏 | 孩子 | P1 | 功能 | 小游戏入口可见 | 1. 打开舒尔特方格并完成 2. 查看积分/能量/排行 | 得分按规则计算;积分/能量到账;成绩入榜;中途退出不计分 | `pages/games/*` | `e2e/roles/child/mini-games.spec.js` |
 | TC-C-04 | C-4 | 心愿 | 孩子 | P1 | 功能 | 孩子已创建心愿 | 1. 创建心愿(名称+积分) 2. 进入家长待审批 | 心愿进入家长待审批列表;积分不足创建拦截 | `WishController` | `e2e/roles/parent/wish-management.spec.js` |
-| TC-C-05 | C-4 | 心愿 | 孩子 | P1 | 功能 | 家长已通过心愿 | 1. 操作兑换 | 兑换成功,积分扣减正确;驳回后不可兑换 | `RewardController` | — |
-| TC-C-06 | C-5 | 能量 | 孩子 | P1 | 功能 | 已有能量记录 | 1. 进个人能量页 2. 执行任务后查看 | 显示个人能量值;有增量且流水可追溯;能量不为负 | `EnergyController` | `e2e/roles/parent/energy-dashboard.spec.js`(参考) |
-| TC-C-07 | C-6 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 打开报告列表/详情 2. 检查编辑/删除入口 3. 直接调删除接口 | 可见报告内容;UI 无编辑/删除入口;直接调删除接口被 role 校验拒绝(403/401) | 报告查看权限隔离 | `e2e/roles/teacher/dan-report-flow.spec.js`(参考) |
-| TC-C-08 | C-7 | 打卡/方案 | 孩子 | P0 | 功能 | 规划师已激活方案,生成训练任务 | 1. 打开方案任务 2. 完成并提交打卡 | 打卡成功,方案 `completedDays+1`;重复打卡不重复计数(幂等) | 健康打卡/方案进度 | `e2e/roles/child/daily-checkin.spec.js` |
-| TC-C-09 | C-8 | 勋章 | 孩子 | P2 | 功能 | 已有部分成就 | 1. 打开勋章墙 | 显示已获得/未获得勋章及进度;未解锁不显示领取 | `RewardController` | — |
+| TC-C-04-b | C-04 | 心愿 | 孩子 | P1 | 功能 | 家长已通过心愿 | 1. 操作兑换 | 兑换成功,积分扣减正确;驳回后不可兑换 | `RewardController` | — |
+| TC-C-06 | C-06 | 能量 | 孩子 | P1 | 功能 | 已有能量记录 | 1. 进个人能量页 2. 执行任务后查看 | 显示个人能量值;有增量且流水可追溯;能量不为负 | `EnergyController` | `e2e/roles/parent/energy-dashboard.spec.js`(参考) |
+| TC-C-07 | C-07 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 打开报告列表/详情 2. 检查编辑/删除入口 3. 直接调删除接口 | 可见报告内容;UI 无编辑/删除入口;直接调删除接口被 role 校验拒绝(403/401) | 报告查看权限隔离 | `e2e/roles/teacher/dan-report-flow.spec.js`(参考) |
+| TC-C-08 | C-08 | 打卡/方案 | 孩子 | P0 | 功能 | 规划师已激活方案,生成训练任务 | 1. 打开方案任务 2. 完成并提交打卡 | 打卡成功,方案 `completedDays+1`;重复打卡不重复计数(幂等) | 健康打卡/方案进度 | `e2e/roles/child/daily-checkin.spec.js` |
+| TC-C-09 | C-09 | 勋章 | 孩子 | P2 | 功能 | 已有部分成就 | 1. 打开勋章墙 | 显示已获得/未获得勋章及进度;未解锁不显示领取 | `RewardController` | — |
 
 ### 双角色边界(对应 TC-C-01,门禁项)
 
@@ -54,11 +54,11 @@
 | TC-C-02-E | C-2 | 任务 | 孩子 | P2 | 异常 | 家长已下发任务「睡前阅读」 | 1. 同一任务并发双点「完成」 2. 超期任务仍提交 3. 任务被驳回后重做再提交 | 并发双点幂等仅计 1 次、仅 1 条流水;超期提交被拒;驳回→重做→再提交仅在重做后计 1 次 | `TaskController` | — |
 | TC-C-03-E | C-3 | 小游戏 | 孩子 | P2 | 异常 | 小游戏入口可见 | 1. 上报异常分数(>满分/负分) 2. 中途退出(断网) 3. 同局成绩重复上报 | 异常分数 400 不计入;断网不计分不卡死;重复上报幂等不重复入榜 | `pages/games/*` | — |
 | TC-C-04-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 孩子已创建心愿 | 1. 心愿积分 > 自身余额 2. 心愿名称超长/含注入 3. 重复创建同名心愿 | 余额不足创建拦截;超长/注入 400 校验;重复创建提示已存在不双建 | `WishController` | — |
-| TC-C-05-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 家长已通过心愿 | 1. 兑换时积分余额 < 心愿价 2. 已驳回心愿再兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负;已驳回提示不可兑换;并发幂等仅扣 1 次 | `RewardController` | — |
-| TC-C-06-E | C-5 | 能量 | 孩子 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 2. 某维度权重配置为 0 占比除零 | 超时降级空态提示非 500;权重 0 占比兜底(0%)显示不崩;能量不为负 | `EnergyController` | — |
-| TC-C-07-E | C-6 | 报告/权限 | 孩子 | P2 | 异常 | 家长已上传报告 | 1. 孩子直接调报告删除接口 `DELETE /api/report/:id` 2. 调编辑接口改报告内容 | 删除/编辑被 role 校验 403 拒绝;孩子端 UI 无编辑/删除入口;报告内容不被改动 | 报告查看权限隔离 | — |
-| TC-C-08-E | C-7 | 打卡/方案 | 孩子 | P2 | 异常 | 规划师已激活方案,生成训练任务 | 1. 打卡时方案服务超时 2. 同任务重复打卡 3. 打卡非本人方案任务 | 超时回滚不残半任务、进度不 +1;重复打卡幂等不重复计数;非本人任务 403 | 健康打卡/方案进度 | — |
-| TC-C-09-E | C-8 | 勋章 | 孩子 | P3 | 异常 | 已有部分成就 | 1. 重复触发同一成就条件 2. 未达成却直接调领取接口 | 重复达成不重复发推送/勋章;未达成领取 400/403 拒绝 | `RewardController` | — |
+| TC-C-04-b-E | C-04 | 心愿 | 孩子 | P2 | 异常 | 家长已通过心愿 | 1. 兑换时积分余额 < 心愿价 2. 已驳回心愿再兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负;已驳回提示不可兑换;并发幂等仅扣 1 次 | `RewardController` | — |
+| TC-C-06-E | C-06 | 能量 | 孩子 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 2. 某维度权重配置为 0 占比除零 | 超时降级空态提示非 500;权重 0 占比兜底(0%)显示不崩;能量不为负 | `EnergyController` | — |
+| TC-C-07-E | C-07 | 报告/权限 | 孩子 | P2 | 异常 | 家长已上传报告 | 1. 孩子直接调报告删除接口 `DELETE /api/report/:id` 2. 调编辑接口改报告内容 | 删除/编辑被 role 校验 403 拒绝;孩子端 UI 无编辑/删除入口;报告内容不被改动 | 报告查看权限隔离 | — |
+| TC-C-08-E | C-08 | 打卡/方案 | 孩子 | P2 | 异常 | 规划师已激活方案,生成训练任务 | 1. 打卡时方案服务超时 2. 同任务重复打卡 3. 打卡非本人方案任务 | 超时回滚不残半任务、进度不 +1;重复打卡幂等不重复计数;非本人任务 403 | 健康打卡/方案进度 | — |
+| TC-C-09-E | C-09 | 勋章 | 孩子 | P3 | 异常 | 已有部分成就 | 1. 重复触发同一成就条件 2. 未达成却直接调领取接口 | 重复达成不重复发推送/勋章;未达成领取 400/403 拒绝 | `RewardController` | — |
 | TC-C-10-E | SC-C-10 | 勋章提醒 | 孩子 | P3 | 异常 | 达成勋章条件 | 1. 重复达成同一勋章条件 2. 勋章条件数据缺失 | 重复达成幂等仅 1 次推送;数据缺失降级不推送不 500 | `MedalController` | — |
 | TC-C-11-E | SC-C-11 | 成长记录 | 孩子 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联任务已删 2. 查其他成员成长数据 | 关联已删项跳过不报错;其他成员数据 403 不可见 | `GrowthController` | — |
 | TC-C-12-E | SC-C-12 | 食谱查看 | 孩子 | P2 | 异常 | 家庭食谱已生成 | 1. 家庭食谱生成时 LangGraph 超时 2. 无食谱打开食谱页 | 超时 Fallback 通用食谱+提示非 500;无食谱空态不 500 | 饮食推荐 | — |
@@ -87,11 +87,11 @@
 | TC-C-02-P | C-2 | 任务 | 孩子 | P1 | 权限 | 家长已下发任务「睡前阅读」 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `TaskController` | — |
 | TC-C-03-P | C-3 | 小游戏 | 孩子 | P1 | 权限 | 小游戏入口可见 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `pages/games/*` | — |
 | TC-C-04-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 孩子已创建心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `WishController` | — |
-| TC-C-05-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 家长已通过心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
-| TC-C-06-P | C-5 | 能量 | 孩子 | P1 | 权限 | 已有能量记录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `EnergyController` | — |
-| TC-C-07-P | C-6 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 报告查看权限隔离 | — |
-| TC-C-08-P | C-7 | 打卡/方案 | 孩子 | P1 | 权限 | 规划师已激活方案,生成训练任务 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 健康打卡/方案进度 | — |
-| TC-C-09-P | C-8 | 勋章 | 孩子 | P2 | 权限 | 已有部分成就 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
+| TC-C-04-b-P | C-04 | 心愿 | 孩子 | P1 | 权限 | 家长已通过心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
+| TC-C-06-P | C-06 | 能量 | 孩子 | P1 | 权限 | 已有能量记录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `EnergyController` | — |
+| TC-C-07-P | C-07 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 报告查看权限隔离 | — |
+| TC-C-08-P | C-08 | 打卡/方案 | 孩子 | P1 | 权限 | 规划师已激活方案,生成训练任务 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 健康打卡/方案进度 | — |
+| TC-C-09-P | C-09 | 勋章 | 孩子 | P2 | 权限 | 已有部分成就 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
 | TC-C-10-P | SC-C-10 | 勋章提醒 | 孩子 | P2 | 权限 | 达成勋章条件 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `MedalController` | — |
 | TC-C-11-P | SC-C-11 | 成长记录 | 孩子 | P1 | 权限 | 有成长数据 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `GrowthController` | — |
 | TC-C-12-P | SC-C-12 | 食谱查看 | 孩子 | P1 | 权限 | 家庭食谱已生成 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 饮食推荐 | — |

+ 75 - 75
tests/test-cases/parent.md

@@ -7,22 +7,22 @@
 | TC-P-01 | P-1 | 家庭 | 家长 | P0 | 功能 | 已登录(默认 parent) | 1. 创建家庭(名称「测试家庭1」) | 家庭创建成功;生成唯一邀请码+二维码(令牌+落地页);角色变家庭管理员 | `FamilyInviteController` | `e2e/roles/parent/family-management.spec.js` |
 | TC-P-02 | P-2 | 家庭/成员 | 家长 | P1 | 功能 | 家庭已创建;爷爷 C 可用 | 1. 分享邀请码/二维码给 C 2. C `register-with-invite` 加入 | C 加入家庭,成员列表出现 C | `FamilyInviteController` | — |
 | TC-P-02-B | S-cfc-57/58/59(family.invite.joinValidationGate/Rules/RequiredInfo) | 家庭加入准入校验 | 家长 | P1 | 功能 | 家庭已创建;C 走申请加入(`request-join-by-code`)路径(S-cfc-57/58/59 已合入 cfclub@de16f40b0,实现基准 5bef71317/5f5424696) | 1. C 申请加入 2. 逐项填写真实姓名/生日/性别 3. 发起申请 4. 家长审批 | 1. 必填项缺失/空白/超长(姓名>20字)被拒并提示「完善信息」、不落库 2. 生日为空/未来日期/早于 1900 被拒 3. 性别为空/大小写混用/非法取值被拒 4. 校验通过后正常入队待审批,审批后成为家庭成员 | `FamilyJoinRequestService`/`FamilyInviteController`(S-cfc-57/58/59,5bef71317) | `FamilyJoinValidationRulesContractTest`/`FamilyJoinRequestServiceJoinRequiredInfoContractTest`/`FamilyJoinRequestServiceJoinValidationGateTest` |
-| TC-P-03 | P-2 | 成员资料 | 家长 | P1 | 功能 | 家庭已创建 | 1. 添加成员资料(姓名/关系/生日/性别) | 成员卡片正确显示;关系标签可选(RelationshipPicker) | `FamilyMembersController` | `e2e/family-member-management.spec.js` |
-| TC-P-04 | P-2 | 关系图 | 家长 | P1 | 功能 | 成员 C 已加入 | 1. 编辑 C 关系为「外公」 | 关系图节点与关系标签同步更新 | 关系类型 CRUD/前端选择器 | — |
-| TC-P-05 | P-4 | 任务 | 家长 | P0 | 功能 | 家庭含孩子 B | 1. 创建任务(标题/成员 B/积分 10/频率每日) | 任务出现在 B 列表,状态待执行 | `TaskController` | `e2e/roles/parent/../tasks` |
-| TC-P-06 | P-4 | 任务审核 | 家长 | P0 | 功能 | B 已提交任务 | 1. 审批「通过」/「驳回」 | 通过→B 积分+N 并生成流水;驳回→退回重做;重复提交不重复发分 | `TaskController`/`PointsController` | — |
-| TC-P-07 | P-5 | 心愿 | 家长 | P1 | 功能 | 孩子已创建心愿 | 1. 审批心愿(通过/驳回) | 通过→扣积分进入兑换;驳回→心愿失效;积分不足兑换拦截 | `WishController`/`RewardController` | `e2e/roles/parent/wish-management.spec.js` |
-| TC-P-08 | P-6 | 能量 | 家长 | P1 | 功能 | 已有能量记录 | 1. 进五维能量/健康指数首页 2. 查流水 | 显示家庭健康指数与五维能量分配(总和=100%);流水可追溯;无数据时空态非 500 | `EnergyController` | `e2e/roles/parent/energy-dashboard.spec.js` |
-| TC-P-09 | P-7 | 测评订单 | 家长 | P0 | 功能 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 申请测评(选 B+类型+T) 2. 孩子快照 3. 支付 | 生成测评订单;状态 已支付→待安排→已预约;未支付/未选规划师不进入待安排 | `AssessmentAppointmentController` | `e2e/assessment-order-flow.spec.js` |
-| TC-P-10 | P-8 | 健康报告 | 家长 | P0 | 功能 | 持有募极生物菌群 PDF | 1. 上传 PDF(`/api/media/upload`+解析入口) | 识别为 gut_flora;三阶段上传→解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | 健康报告上传解析 | `e2e/dan-report-flow.spec.js` |
-| TC-P-11 | P-8 | 报告查看 | 家长 | P1 | 功能 | 报告已入库 | 1. 打开报告列表→菌群报告详情 | 显示菌群健康分/平衡/多样性、菌种明细、疾病风险;七维评分刷新 | 报告解析 | — |
-| TC-P-12 | P-9 | 饮食推荐 | 家长 | P1 | 功能 | P-10 报告已入库 | 1. 打开「身→饮食推荐」 | 按报告生成食材推荐指数,展示可吃/慎吃列表;无报告时无推荐 | 饮食推荐系统 | — |
-| TC-P-13 | P-10 | AI 方案 | 家长 | P0 | 功能 | 孩子 B 有报告;部分需会员 | 1. 选 B+目标 2. 调 LangGraph 生成方案 | 生成 overview+营养/饮食/运动三板块;可逐板块重生成/确认;未购买会员→提示购买 | AI 统一走 LangGraph;`AiGateway` | `e2e/ai-plan-task-flow.spec.js` |
-| TC-P-14 | P-10 | 方案提交 | 家长 | P1 | 功能 | 方案已生成 | 1. 保存/提交方案 | 进入「已提交(待规划师审核)」或按配置直接发布 | 方案状态机 | — |
-| TC-P-15 | P-3 | 双角色 | 家长 | P0 | 权限 | 家庭含孩子 B | 1. 个人中心→切换视角→选 B 2. 切回家长(密码) 3. 孩子端反向尝试 | 切换为孩子端界面(数据隔离);切回需密码;**孩子端不能切回家长** | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | `e2e/roles/parent/family-management.spec.js` |
-| TC-P-16 | P-10 | 会员 | 家长 | P1 | 功能 | 未购会员 | 1. 购买会员/套餐并支付 | 支付成功解锁方案生成等付费功能;未购买点击生成提示购买 | `MembershipController`/`ProductOrderController` | `e2e/roles/parent/../membership` |
-| TC-P-17 | P-12 | 积分/成长 | 家长 | P1 | 功能 | 已有记录 | 1. 查积分明细 2. 查成长记录 | 积分流水与孩子成长记录一致;时间格式 yyyy-MM-dd HH:mm:ss;积分与流水总额一致 | `PointsController`/`GrowthController` | `e2e/roles/parent/points.spec.js` |
-| TC-P-18 | P-11 | AI 对话 | 家长 | P1 | 功能 | 已登录 | 1. `POST /api/ai/health-coach/send`(问便秘) 2. 多轮 | 返回基于知识库回答,可含产品/任务推荐;LangGraph 不可用时 AiGateway Fallback 兜底;多轮连续 | `AIChatController`;LangGraph RAG | — |
+| TC-P-05 | P-05 | 成员资料 | 家长 | P1 | 功能 | 家庭已创建 | 1. 添加成员资料(姓名/关系/生日/性别) | 成员卡片正确显示;关系标签可选(RelationshipPicker) | `FamilyMembersController` | `e2e/family-member-management.spec.js` |
+| TC-P-07 | P-07 | 关系图 | 家长 | P1 | 功能 | 成员 C 已加入 | 1. 编辑 C 关系为「外公」 | 关系图节点与关系标签同步更新 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-10 | P-10 | 任务 | 家长 | P0 | 功能 | 家庭含孩子 B | 1. 创建任务(标题/成员 B/积分 10/频率每日) | 任务出现在 B 列表,状态待执行 | `TaskController` | `e2e/roles/parent/../tasks` |
+| TC-P-11 | P-11 | 任务审核 | 家长 | P0 | 功能 | B 已提交任务 | 1. 审批「通过」/「驳回」 | 通过→B 积分+N 并生成流水;驳回→退回重做;重复提交不重复发分 | `TaskController`/`PointsController` | — |
+| TC-P-13 | P-13 | 心愿 | 家长 | P1 | 功能 | 孩子已创建心愿 | 1. 审批心愿(通过/驳回) | 通过→扣积分进入兑换;驳回→心愿失效;积分不足兑换拦截 | `WishController`/`RewardController` | `e2e/roles/parent/wish-management.spec.js` |
+| TC-P-17 | P-17 | 能量 | 家长 | P1 | 功能 | 已有能量记录 | 1. 进五维能量/健康指数首页 2. 查流水 | 显示家庭健康指数与五维能量分配(总和=100%);流水可追溯;无数据时空态非 500 | `EnergyController` | `e2e/roles/parent/energy-dashboard.spec.js` |
+| TC-P-33 | P-33 | 测评订单 | 家长 | P0 | 功能 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 申请测评(选 B+类型+T) 2. 孩子快照 3. 支付 | 生成测评订单;状态 已支付→待安排→已预约;未支付/未选规划师不进入待安排 | `AssessmentAppointmentController` | `e2e/assessment-order-flow.spec.js` |
+| TC-P-20 | P-20 | 健康报告 | 家长 | P0 | 功能 | 持有募极生物菌群 PDF | 1. 上传 PDF(`/api/media/upload`+解析入口) | 识别为 gut_flora;三阶段上传→解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | 健康报告上传解析 | `e2e/dan-report-flow.spec.js` |
+| TC-P-22 | P-22 | 报告查看 | 家长 | P1 | 功能 | 报告已入库 | 1. 打开报告列表→菌群报告详情 | 显示菌群健康分/平衡/多样性、菌种明细、疾病风险;七维评分刷新 | 报告解析 | — |
+| TC-P-26 | P-26 | 饮食推荐 | 家长 | P1 | 功能 | P-10 报告已入库 | 1. 打开「身→饮食推荐」 | 按报告生成食材推荐指数,展示可吃/慎吃列表;无报告时无推荐 | 饮食推荐系统 | — |
+| TC-P-40 | P-40 | AI 方案 | 家长 | P0 | 功能 | 孩子 B 有报告;部分需会员 | 1. 选 B+目标 2. 调 LangGraph 生成方案 | 生成 overview+营养/饮食/运动三板块;可逐板块重生成/确认;未购买会员→提示购买 | AI 统一走 LangGraph;`AiGateway` | `e2e/ai-plan-task-flow.spec.js` |
+| TC-P-44 | P-44 | 方案提交 | 家长 | P1 | 功能 | 方案已生成 | 1. 保存/提交方案 | 进入「已提交(待规划师审核)」或按配置直接发布 | 方案状态机 | — |
+| TC-P-03 | P-03 | 双角色 | 家长 | P0 | 权限 | 家庭含孩子 B | 1. 个人中心→切换视角→选 B 2. 切回家长(密码) 3. 孩子端反向尝试 | 切换为孩子端界面(数据隔离);切回需密码;**孩子端不能切回家长** | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | `e2e/roles/parent/family-management.spec.js` |
+| TC-P-58 | P-58 | 会员 | 家长 | P1 | 功能 | 未购会员 | 1. 购买会员/套餐并支付 | 支付成功解锁方案生成等付费功能;未购买点击生成提示购买 | `MembershipController`/`ProductOrderController` | `e2e/roles/parent/../membership` |
+| TC-P-50 | P-50 | 积分/成长 | 家长 | P1 | 功能 | 已有记录 | 1. 查积分明细 2. 查成长记录 | 积分流水与孩子成长记录一致;时间格式 yyyy-MM-dd HH:mm:ss;积分与流水总额一致 | `PointsController`/`GrowthController` | `e2e/roles/parent/points.spec.js` |
+| TC-P-49 | P-49 | AI 对话 | 家长 | P1 | 功能 | 已登录 | 1. `POST /api/ai/health-coach/send`(问便秘) 2. 多轮 | 返回基于知识库回答,可含产品/任务推荐;LangGraph 不可用时 AiGateway Fallback 兜底;多轮连续 | `AIChatController`;LangGraph RAG | — |
 
 ### 门禁项与边界
 
@@ -39,13 +39,13 @@
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-P-19 | SC-P-19 | 能量配置 | 家长 | P2 | 功能 | 进入能量页 | 1. 查看五维定义与权重说明 | 显示身/心/智/行/富口径与权重;配置未同步展示兜底说明 | 维度配置 | — |
-| TC-P-20 | SC-P-20 | 健康报告 | 家长 | P0 | 功能 | 持有募极生物 PDF | 1. 上传 PDF 2. 三阶段:上传→解析预览→确认入库 | 识别 gut_flora;解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | 报告解析中台/`POST /api/media/upload` | `e2e/dan-report-flow.spec.js` |
+| TC-P-20-b | SC-P-20 | 健康报告 | 家长 | P0 | 功能 | 持有募极生物 PDF | 1. 上传 PDF 2. 三阶段:上传→解析预览→确认入库 | 识别 gut_flora;解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | 报告解析中台/`POST /api/media/upload` | `e2e/dan-report-flow.spec.js` |
 | TC-P-21 | SC-P-21 | 报告解析 | 家长 | P1 | 功能 | 多类型报告 | 1. 上传→系统自动匹配类型 | 匹配已注册类型;未知类型进未知聚类待运营自学习 | `/api/admin/report-parser/types` | — |
-| TC-P-22 | SC-P-22 | 报告预览 | 家长 | P1 | 功能 | 报告已解析 | 1. 查看菌群健康分/平衡/多样性/菌种明细/疾病风险预览 | 预览数据完整;异常数据提示不入库 | 解析中台 | — |
+| TC-P-22-b | SC-P-22 | 报告预览 | 家长 | P1 | 功能 | 报告已解析 | 1. 查看菌群健康分/平衡/多样性/菌种明细/疾病风险预览 | 预览数据完整;异常数据提示不入库 | 解析中台 | — |
 | TC-P-23 | SC-P-23 | 报告入库 | 家长 | P1 | 功能 | 解析预览完成 | 1. 点确认→报告进档案→七维刷新 | 确认前可取消不入库;确认后七维刷新 | 解析中台 | — |
 | TC-P-24 | SC-P-24 | 报告管理 | 家长 | P1 | 功能 | 多份报告 | 1. 报告列表→查看/删除/对比 | 删除有关联方案时提示;对比展示差异 | 报告管理 | — |
 | TC-P-25 | SC-P-25 | 报告趋势 | 家长 | P1 | 功能 | ≥2 同类型报告 | 1. 时间序列→趋势图 | 单报告无趋势提示;时间轴正确 | 成长/报告 | — |
-| TC-P-26 | SC-P-26 | 饮食推荐 | 家长 | P1 | 功能 | SC-P-20 已入库 | 1. 身→饮食推荐→生成可吃/慎吃清单 | 按菌群生成;无报告无推荐 | 饮食推荐系统 | — |
+| TC-P-26-b | SC-P-26 | 饮食推荐 | 家长 | P1 | 功能 | SC-P-20 已入库 | 1. 身→饮食推荐→生成可吃/慎吃清单 | 按菌群生成;无报告无推荐 | 饮食推荐系统 | — |
 | TC-P-26-A | S-cfc-115(diet.food.healthAdjustUi / diet.food.healthAdjust,需求 2026-11-09-diet-recommendation-health-questionnaire-adjust.md §3-B/§4) | 饮食推荐·健康问卷个性化调整 | 家长 | P1 | 功能 | 后端 diet.food.healthAdjust 已合入(ba9fd2837,A1-A5);目标成员 health_status/diet_preferences 已预置问卷数据(过敏原/用药/疾病史/绝对避免/must_eat/宗教饮食) | 1. 成员饮食偏好填过敏原「花生」→ 查 `/api/health/foods`(无 reportId)2. 前端打开「身→饮食推荐」recommendation 页 3. 校验食物卡片提示条 4. 切「适合」Tab 5. 填 must_eat「鸡蛋」后复看 6. 填宗教饮食「素食」后复看 | 1. 花生 `adjustment=blocked`+reason 含「过敏原花生」2. blocked 红条「⚠ 健康问卷不建议」/ warning 黄条「注意:」/ boost 绿条「✓ 符合饮食习惯偏好」/ normal 不渲染 3. suitable Tab 中 blocked 项排末尾 4. 鸡蛋 `boost` 绿条置顶 5. 荤食 `blocked`、diet_type=none 不受影响 6. 报告详情页(有 reportId)快照不变 | `FoodRecommendService.getCurrentFoods`/`HealthFilterService`/`recommendation.vue`(B1-B3) | `tests/e2e/diet-recommendation-health-adjust.spec.js`(已入库,执行受登录态/问卷数据预置门控) |
 | TC-P-27 | SC-P-27 | 家庭食谱 | 家长 | P1 | 功能 | 菌群报告+营养目标 | 1. 生成早/午/晚食谱(食材/用量/禁忌标注) | 无报告降级通用食谱;忌口/过敏自动排除 | 饮食推荐/家庭食谱 | — |
 | TC-P-28 | SC-P-28 | 食谱筛选 | 家长 | P2 | 功能 | 已生成食谱 | 1. 设忌口/过敏→食谱重算排除项 | 忌口冲突时提示;重算生效 | 饮食推荐 | — |
@@ -53,24 +53,24 @@
 | TC-P-30 | SC-P-30 | 食谱营养 | 家长 | P2 | 功能 | 食谱+营养目标 | 1. 查看营养合计 vs 目标 | 超标/不足提示 | 饮食推荐 | — |
 | TC-P-31 | SC-P-31 | 测评类型 | 家长 | P1 | 功能 | 进入测评页 | 1. 列 DAN 8 类(mind/wisdom/cognition/learning/behavior/career/campus/adolescent) | 类目来自后端字典;展示完整 8 类 | `DanAssessmentController` | — |
 | TC-P-32 | SC-P-32 | 测评规划师 | 家长 | P1 | 功能 | 已绑定规划师 | 1. 测评选规划师→绑定 T 列表 | 未绑定规划师提示先绑定 | 测评订单 | — |
-| TC-P-33 | SC-P-33 | 测评下单 | 家长 | P1 | 功能 | 套餐可见 | 1. 选套餐→生成 `AssessmentOrder`(pending) | 套餐下架不可下单;生成待支付订单 | `AssessmentOrder` | `e2e/assessment-order-flow.spec.js` |
+| TC-P-33-b | SC-P-33 | 测评下单 | 家长 | P1 | 功能 | 套餐可见 | 1. 选套餐→生成 `AssessmentOrder`(pending) | 套餐下架不可下单;生成待支付订单 | `AssessmentOrder` | `e2e/assessment-order-flow.spec.js` |
 | TC-P-34 | SC-P-34 | 测评支付 | 家长 | P1 | 接口 | pending 订单 | 1. 支付→pending→paid→生成额度 | 支付失败回滚不生成额度 | 支付/`AssessmentQuota` | — |
 | TC-P-35 | SC-P-35 | 测评额度 | 家长 | P1 | 功能 | 支付成功 | 1. 查额度到账(含有效期) | 额度过期不可用于预约;展示有效期 | `AssessmentQuota` | — |
 | TC-P-36 | SC-P-36 | 测评预约 | 家长 | P0 | 接口 | 有效额度 | 1. `POST /api/assessment/appointment/create` | 先扣一条额度→落预约;额度不足/过期直接报错不落预约 | `AssessmentAppointmentController` | `e2e/assessment-order-flow.spec.js` |
 | TC-P-37 | SC-P-37 | 预约状态 | 家长 | P1 | 功能 | 已有预约 | 1. 预约列表→状态(待确认/已确认/已完成/已取消/未到) | 状态准确;状态机守卫 | `AssessmentAppointmentController` | — |
 | TC-P-38 | SC-P-38 | 预约取消 | 家长 | P0 | 权限 | 已有预约 | 1. 取消→状态变更 2. 非本人/非绑定规划师取消 | 非归属取消被拒(CFC-AP 取消越权);取消不退款逻辑 | `AssessmentAppointmentController` | — |
 | TC-P-39 | SC-P-39 | DAN报告 | 家长 | P1 | 功能 | 结果已录入 | 1. 结果页→八类报告展示 | 结果未录入不展示;量纲标注 | `DanAssessmentResultDTO` | — |
-| TC-P-40 | SC-P-40 | AI方案 | 家长 | P0 | 功能 | 孩子 B+目标;部分需会员 | 1. 选 B+目标→LangGraph 生成 overview+三板块 | 未购会员提示购买;AI 超时 `AiGateway` Fallback 不 500 | `AIChatController`/`AiGateway` | `e2e/ai-plan-task-flow.spec.js` |
+| TC-P-40-b | SC-P-40 | AI方案 | 家长 | P0 | 功能 | 孩子 B+目标;部分需会员 | 1. 选 B+目标→LangGraph 生成 overview+三板块 | 未购会员提示购买;AI 超时 `AiGateway` Fallback 不 500 | `AIChatController`/`AiGateway` | `e2e/ai-plan-task-flow.spec.js` |
 | TC-P-41 | SC-P-41 | 方案迭代 | 家长 | P1 | 功能 | 方案已生成 | 1. 逐板块重新生成/确认 | 重生成不丢其他板块 | `AIChatController` | — |
 | TC-P-42 | SC-P-42 | 方案编辑 | 家长 | P1 | 功能 | 方案已生成 | 1. 编辑方案文本/任务项 | 编辑后状态标记已改 | 方案管理 | — |
 | TC-P-43 | SC-P-43 | 方案查看 | 家长 | P1 | 功能 | 方案存在 | 1. 方案详情→看板块/任务 | 空方案不白屏 | 方案管理 | — |
-| TC-P-44 | SC-P-44 | 方案确认 | 家长 | P0 | 功能 | 方案 generated | 1. 家长确认/提交规划师审核→generated→reviewed | 未确认不可激活;确认幂等 | 方案状态机 | — |
+| TC-P-44-b | SC-P-44 | 方案确认 | 家长 | P0 | 功能 | 方案 generated | 1. 家长确认/提交规划师审核→generated→reviewed | 未确认不可激活;确认幂等 | 方案状态机 | — |
 | TC-P-45 | SC-P-45 | 方案发布 | 家长 | P1 | 功能 | 配置允许 | 1. 确认即发布 active | 需审核配置时走审核流 | 方案管理 | — |
 | TC-P-46 | SC-P-46 | 方案激活 | 家长 | P0 | 功能 | reviewed 方案 | 1. 激活 reviewed→active→生成引导+模板任务 | 已激活再激活不重复(幂等靠状态机);失败回滚不残半任务 | 方案激活任务分解 | `e2e/ai-plan-task-flow.spec.js` |
 | TC-P-47 | SC-P-47 | 方案任务 | 家长 | P1 | 功能 | 方案 active | 1. 方案→关联任务列表(状态/进度) | 任务增删与方案同步 | `GrowthPlanController` | — |
 | TC-P-48 | SC-P-48 | 方案版本 | 家长 | P2 | 功能 | 多版本方案 | 1. 看版本列表→对比 | 版本不可篡改 | 方案管理 | — |
-| TC-P-49 | SC-P-49 | AI对话 | 家长 | P1 | 功能 | 已登录 | 1. `POST /api/ai/health-coach/send` 多轮 | 基于知识库回答;LangGraph 不可用 Fallback;多轮连续 | `AIChatController` | — |
-| TC-P-50 | SC-P-50 | 成长记录 | 家长 | P1 | 功能 | 有成长数据 | 1. 成长记录页→时间线(任务/测评/报告/打卡) | 数据缺失项跳过不报错 | `GrowthController` | — |
+| TC-P-49-b | SC-P-49 | AI对话 | 家长 | P1 | 功能 | 已登录 | 1. `POST /api/ai/health-coach/send` 多轮 | 基于知识库回答;LangGraph 不可用 Fallback;多轮连续 | `AIChatController` | — |
+| TC-P-50-b | SC-P-50 | 成长记录 | 家长 | P1 | 功能 | 有成长数据 | 1. 成长记录页→时间线(任务/测评/报告/打卡) | 数据缺失项跳过不报错 | `GrowthController` | — |
 | TC-P-51 | SC-P-51 | 成长里程碑 | 家长 | P2 | 功能 | 有成长数据 | 1. 标/查里程碑→时间线高亮 | 重复标幂等 | `GrowthController` | — |
 | TC-P-52 | SC-P-52 | 商城浏览 | 家长 | P1 | 功能 | 进入商城 | 1. 商城列表/搜索/分类 | 下架商品不展示 | `MallController`/`danshop` | `e2e/product-purchase.spec.js` |
 | TC-P-53 | SC-P-53 | 商品详情 | 家长 | P1 | 功能 | 商品存在 | 1. 详情页(描述/价格/库存) | 库存为 0 提示 | `MallController` | — |
@@ -78,7 +78,7 @@
 | TC-P-55 | SC-P-55 | 订单支付 | 家长 | P1 | 接口 | 待支付订单 | 1. 支付→订单 paid | 支付失败回滚 | 支付 | — |
 | TC-P-56 | SC-P-56 | 订单退款 | 家长 | P1 | 功能 | 已有订单 | 1. 订单列表→详情/申请退款 | 已发货退款规则;重复退款拦截 | 订单服务 | — |
 | TC-P-57 | SC-P-57 | 优惠券 | 家长 | P1 | 功能 | 有可用券 | 1. 选券→结算抵扣 | 券过期/不满足门槛不可用 | 优惠券 | — |
-| TC-P-58 | SC-P-58 | 会员购买 | 家长 | P1 | 功能 | 未购会员 | 1. 选档位→支付→权益生效 | 支付失败回滚;重复购买幂等 | `MemberController` | `e2e/../membership` |
+| TC-P-58-b | SC-P-58 | 会员购买 | 家长 | P1 | 功能 | 未购会员 | 1. 选档位→支付→权益生效 | 支付失败回滚;重复购买幂等 | `MemberController` | `e2e/../membership` |
 | TC-P-59 | SC-P-59 | 会员权益 | 家长 | P1 | 功能 | 已购会员 | 1. 会员页→权益列表/有效期 | 权益随档位变化 | `MemberController` | — |
 | TC-P-60 | SC-P-60 | 会员续费 | 家长 | P2 | 功能 | 会员将到期 | 1. 续费→延期 | 续费叠加计算正确 | `MemberController` | — |
 | TC-P-61 | SC-P-61 | 联系人 | 家长 | P1 | 功能 | 联系人入口 | 1. 添加联系人(姓名/电话/关系) | 重复号码去重 | `ContactCard`/`contact-detail` | — |
@@ -122,30 +122,30 @@
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-P-01-E | P-1 | 家庭 | 家长 | P2 | 异常 | 已登录(默认 parent) | 1. 家庭名称传空 / 超长(>30 字符) / 含 `<script>` 注入 2. 观察返回与存储 | 名称空或超长返回 400 且 message 含『家庭名称』校验项;HTML/SQL 注入被转义,库内不落恶意串;不抛 500、不泄露堆栈 | `FamilyInviteController` | — |
 | TC-P-02-E | P-2 | 家庭/成员 | 家长 | P2 | 异常 | 家庭已创建;爷爷 C 可用 | 1. 用非 11 位手机号 / 已绑定其他家庭的账号注册 2. 用过期邀请码(>7 天)注册 | 非法手机号 400 提示格式;已占用账号提示『已存在家庭关系』;过期码提示『邀请已失效,请重新获取』;均不建立成员关系 | `FamilyInviteController` | — |
-| TC-P-03-E | P-2 | 成员资料 | 家长 | P2 | 异常 | 家庭已创建 | 1. 生日填未来日期 / 关系选『自己』 2. 姓名填 `' OR 1=1--` | 未来生日 400;关系非法值拒绝;姓名特殊字符转义存储、不破坏查询;既有成员数据不被污染 | `FamilyMembersController` | — |
-| TC-P-04-E | P-2 | 关系图 | 家长 | P2 | 异常 | 成员 C 已加入 | 1. 将 C 关系重复设为已存在的『外公』 2. 关系类型传非法枚举 `alien` | 重复关系提示已存在、不新增节点;非法枚举 400;关系图不出现重复/幽灵节点 | 关系类型 CRUD/前端选择器 | — |
-| TC-P-05-E | P-4 | 任务 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. 任务频率填 0 / 负数 / 非枚举 2. 同一创建请求并发双发 | 频率非法 400;并发双发幂等,仅生成 1 条任务、仅 1 次能量预期;超期任务拒绝提交 | `TaskController` | — |
-| TC-P-06-E | P-4 | 任务审核 | 家长 | P2 | 异常 | B 已提交任务 | 1. 对同一已审批任务重复点『通过』 2. 驳回后孩子重做再提交并审批 | 重复审批幂等不双计积分;驳回→重做→再审批仅在重做后计 1 次;超期任务审批被拒 | `TaskController`/`PointsController` | — |
-| TC-P-07-E | P-5 | 心愿 | 家长 | P2 | 异常 | 孩子已创建心愿 | 1. 兑换时家长积分余额 < 心愿价 2. 心愿已被孩子取消后再点兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负积分;已取消心愿兑换提示失效;并发幂等仅扣 1 次 | `WishController`/`RewardController` | — |
-| TC-P-08-E | P-6 | 能量 | 家长 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 / 某维度权重配置为 0 导致占比除零 2. 无数据首访 | 查询超时降级为空态提示非 500;权重为 0 时占比按兜底(0%)显示不崩;首访空态正常 | `EnergyController` | — |
-| TC-P-09-E | P-7 | 测评订单 | 家长 | P2 | 异常 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 模拟支付回调 signature 错误 / 余额不足 2. 同一订单重复发支付成功回调 | 回调验签失败订单保持 pending 不进待安排;余额不足回滚;重复回调幂等仅落 1 次已支付 | `AssessmentAppointmentController` | — |
-| TC-P-10-E | P-8 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物菌群 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 健康报告上传解析 | — |
-| TC-P-11-E | P-8 | 报告查看 | 家长 | P2 | 异常 | 报告已入库 | 1. 报告 id 不存在 / 已被删除后查看 2. 解析中(report_status=parsing)状态打开详情 | 不存在/已删返回 404 提示『报告不存在』;解析中提示『报告解析中,请稍候』,不白屏不 500 | 报告解析 | — |
-| TC-P-12-E | P-9 | 饮食推荐 | 家长 | P2 | 异常 | P-10 报告已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
-| TC-P-13-E | P-10 | AI 方案 | 家长 | P2 | 异常 | 孩子 B 有报告;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | AI 统一走 LangGraph;`AiGateway` | — |
-| TC-P-14-E | P-10 | 方案提交 | 家长 | P2 | 异常 | 方案已生成 | 1. 提交一个尚未生成 overview 的空方案 2. 重复提交同一方案 | 空方案提交拦截提示『方案未生成』;重复提交幂等不重复进审核 | 方案状态机 | — |
-| TC-P-15-E | P-3 | 双角色 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. token 缺失/过期访问切换接口 2. 孩子端尝试切回家长 3. 非法 memberId 切换 | 缺失/过期 token 统一 401 跳登录;孩子端无切回家长入口;非法切换 403 被拒;模拟登录仅测试环境生效 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
-| TC-P-16-E | P-10 | 会员 | 家长 | P2 | 异常 | 未购会员 | 1. 购买时支付网关超时 2. 重复点击购买同一档位 | 支付超时订单回滚不解锁权益;重复购买幂等仅开通 1 次、不重复扣费 | `MembershipController`/`ProductOrderController` | — |
-| TC-P-17-E | P-12 | 积分/成长 | 家长 | P2 | 异常 | 已有记录 | 1. 并发刷新积分 2. 查成长记录时某条关联任务已删 | 并发刷新总量一致不重复计;关联任务已删时该成长项跳过不报错,时间格式 yyyy-MM-dd HH:mm:ss | `PointsController`/`GrowthController` | — |
-| TC-P-18-E | P-11 | AI 对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController`;LangGraph RAG | — |
+| TC-P-05-E | P-05 | 成员资料 | 家长 | P2 | 异常 | 家庭已创建 | 1. 生日填未来日期 / 关系选『自己』 2. 姓名填 `' OR 1=1--` | 未来生日 400;关系非法值拒绝;姓名特殊字符转义存储、不破坏查询;既有成员数据不被污染 | `FamilyMembersController` | — |
+| TC-P-07-E | P-07 | 关系图 | 家长 | P2 | 异常 | 成员 C 已加入 | 1. 将 C 关系重复设为已存在的『外公』 2. 关系类型传非法枚举 `alien` | 重复关系提示已存在、不新增节点;非法枚举 400;关系图不出现重复/幽灵节点 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-10-E | P-10 | 任务 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. 任务频率填 0 / 负数 / 非枚举 2. 同一创建请求并发双发 | 频率非法 400;并发双发幂等,仅生成 1 条任务、仅 1 次能量预期;超期任务拒绝提交 | `TaskController` | — |
+| TC-P-11-E | P-11 | 任务审核 | 家长 | P2 | 异常 | B 已提交任务 | 1. 对同一已审批任务重复点『通过』 2. 驳回后孩子重做再提交并审批 | 重复审批幂等不双计积分;驳回→重做→再审批仅在重做后计 1 次;超期任务审批被拒 | `TaskController`/`PointsController` | — |
+| TC-P-13-E | P-13 | 心愿 | 家长 | P2 | 异常 | 孩子已创建心愿 | 1. 兑换时家长积分余额 < 心愿价 2. 心愿已被孩子取消后再点兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负积分;已取消心愿兑换提示失效;并发幂等仅扣 1 次 | `WishController`/`RewardController` | — |
+| TC-P-17-E | P-17 | 能量 | 家长 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 / 某维度权重配置为 0 导致占比除零 2. 无数据首访 | 查询超时降级为空态提示非 500;权重为 0 时占比按兜底(0%)显示不崩;首访空态正常 | `EnergyController` | — |
+| TC-P-33-E | P-33 | 测评订单 | 家长 | P2 | 异常 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 模拟支付回调 signature 错误 / 余额不足 2. 同一订单重复发支付成功回调 | 回调验签失败订单保持 pending 不进待安排;余额不足回滚;重复回调幂等仅落 1 次已支付 | `AssessmentAppointmentController` | — |
+| TC-P-20-E | P-20 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物菌群 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 健康报告上传解析 | — |
+| TC-P-22-E | P-22 | 报告查看 | 家长 | P2 | 异常 | 报告已入库 | 1. 报告 id 不存在 / 已被删除后查看 2. 解析中(report_status=parsing)状态打开详情 | 不存在/已删返回 404 提示『报告不存在』;解析中提示『报告解析中,请稍候』,不白屏不 500 | 报告解析 | — |
+| TC-P-26-E | P-26 | 饮食推荐 | 家长 | P2 | 异常 | P-10 报告已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
+| TC-P-40-E | P-40 | AI 方案 | 家长 | P2 | 异常 | 孩子 B 有报告;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | AI 统一走 LangGraph;`AiGateway` | — |
+| TC-P-44-E | P-44 | 方案提交 | 家长 | P2 | 异常 | 方案已生成 | 1. 提交一个尚未生成 overview 的空方案 2. 重复提交同一方案 | 空方案提交拦截提示『方案未生成』;重复提交幂等不重复进审核 | 方案状态机 | — |
+| TC-P-03-E | P-03 | 双角色 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. token 缺失/过期访问切换接口 2. 孩子端尝试切回家长 3. 非法 memberId 切换 | 缺失/过期 token 统一 401 跳登录;孩子端无切回家长入口;非法切换 403 被拒;模拟登录仅测试环境生效 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
+| TC-P-58-E | P-58 | 会员 | 家长 | P2 | 异常 | 未购会员 | 1. 购买时支付网关超时 2. 重复点击购买同一档位 | 支付超时订单回滚不解锁权益;重复购买幂等仅开通 1 次、不重复扣费 | `MembershipController`/`ProductOrderController` | — |
+| TC-P-50-E | P-50 | 积分/成长 | 家长 | P2 | 异常 | 已有记录 | 1. 并发刷新积分 2. 查成长记录时某条关联任务已删 | 并发刷新总量一致不重复计;关联任务已删时该成长项跳过不报错,时间格式 yyyy-MM-dd HH:mm:ss | `PointsController`/`GrowthController` | — |
+| TC-P-49-E | P-49 | AI 对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController`;LangGraph RAG | — |
 | TC-P-19-E | SC-P-19 | 能量配置 | 家长 | P3 | 异常 | 进入能量页 | 1. 配置未同步时首次进入 2. 手动改权重总和≠100% 提交 | 配置缺失展示兜底说明非 500;权重和非法 400 提示『权重合计需为 100%』 | 维度配置 | — |
-| TC-P-20-E | SC-P-20 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 报告解析中台/`POST /api/media/upload` | — |
+| TC-P-20-b-E | SC-P-20 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 报告解析中台/`POST /api/media/upload` | — |
 | TC-P-21-E | SC-P-21 | 报告解析 | 家长 | P2 | 异常 | 多类型报告 | 1. 上传未注册类型(如 CT 影像) 2. 上传 0 字节文件 | 未注册类型进未知聚类待运营自学习;0 字节文件提示『文件为空』;均非 500 | `/api/admin/report-parser/types` | — |
-| TC-P-22-E | SC-P-22 | 报告预览 | 家长 | P2 | 异常 | 报告已解析 | 1. 预览时某指标值为负/异常(如菌群多样性 -1) 2. 解析服务超时 | 异常值提示『数据异常,暂不入库』不入库;超时提示解析中,不白屏 | 解析中台 | — |
+| TC-P-22-b-E | SC-P-22 | 报告预览 | 家长 | P2 | 异常 | 报告已解析 | 1. 预览时某指标值为负/异常(如菌群多样性 -1) 2. 解析服务超时 | 异常值提示『数据异常,暂不入库』不入库;超时提示解析中,不白屏 | 解析中台 | — |
 | TC-P-23-E | SC-P-23 | 报告入库 | 家长 | P2 | 异常 | 解析预览完成 | 1. 确认入库时报告已被运营删除 2. 并发两次确认 | 报告已删提示『报告不存在,确认失败』;并发确认幂等仅入库 1 次、七维仅刷新 1 次 | 解析中台 | — |
 | TC-P-24-E | SC-P-24 | 报告管理 | 家长 | P2 | 异常 | 多份报告 | 1. 删除带关联方案的报告 2. 删除不存在的报告 id | 有方案时提示『请先解除关联方案』再删;不存在 id 返回 404 不崩 | 报告管理 | — |
 | TC-P-25-E | SC-P-25 | 报告趋势 | 家长 | P2 | 异常 | ≥2 同类型报告 | 1. 仅 1 份同类型报告查趋势 2. 两份报告时间倒挂(新在前) | 单报告提示『至少需要 2 份报告才能看趋势』;时间轴按真实时间升序,不倒挂 | 成长/报告 | — |
-| TC-P-26-E | SC-P-26 | 饮食推荐 | 家长 | P2 | 异常 | SC-P-20 已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
+| TC-P-26-b-E | SC-P-26 | 饮食推荐 | 家长 | P2 | 异常 | SC-P-20 已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
 | TC-P-26-A-E | S-cfc-115(需求 §4 判据) | 饮食推荐·个性化调整异常 | 家长 | P2 | 异常 | 后端 healthAdjust 已合入;问卷数据可构造 | 1. `diet_preferences.allergies` 为非法 JSON/空数组/超长 2. `health_status.lifestyle` 为非对象(字符串/数组)3. 问卷数据仅部分维度(如只填过敏、无疾病史)4. 报告详情页与当前推荐页并存加载 | 1. 解析失败静默降级(adjustment=normal),接口不 500 2. 不崩溃、不返回合成过敏原 3. 缺失维度不参与判定,其余维度正常打标 4. 报告详情页(有 reportId)返回快照不含 adjustment 或为 normal,不被个性化调整污染 | `HealthFilterService.loadProfile`/`FoodRecommendService.getCurrentFoods` | `tests/e2e/diet-recommendation-health-adjust.spec.js:62`(B1 契约) |
 | TC-P-27-E | SC-P-27 | 家庭食谱 | 家长 | P2 | 异常 | 菌群报告+营养目标 | 1. LangGraph 超时生成食谱 2. 食谱含孩子过敏食材(虾)未排除 | 超时 Fallback 通用食谱+提示;过敏食材未排除时返回 400 提示『存在过敏冲突』重算 | 饮食推荐/家庭食谱 | — |
 | TC-P-28-E | SC-P-28 | 食谱筛选 | 家长 | P3 | 异常 | 已生成食谱 | 1. 设忌口『海鲜』但食谱仍含鱼 2. 忌口值非法 | 忌口冲突提示并停止生成;非法忌口值 400;重算生效 | 饮食推荐 | — |
@@ -153,24 +153,24 @@
 | TC-P-30-E | SC-P-30 | 食谱营养 | 家长 | P3 | 异常 | 食谱+营养目标 | 1. 营养合计超目标 200% 2. 目标未设时查营养 | 超标明确标红提示『超出目标 X%』;未设目标提示先设目标,不除零 | 饮食推荐 | — |
 | TC-P-31-E | SC-P-31 | 测评类型 | 家长 | P2 | 异常 | 进入测评页 | 1. 后端字典缺某类(如 adolescent)时前端仍渲染 2. 传非法 type 查询 | 字典缺失时前端降级不白屏;非法 type 400;八类以字典为准 | `DanAssessmentController` | — |
 | TC-P-32-E | SC-P-32 | 测评规划师 | 家长 | P2 | 异常 | 已绑定规划师 | 1. 未绑定规划师直接选测评选 T 2. 选已解绑的 T | 未绑定提示『请先绑定规划师』;已解绑 T 不在可选列表,选则 400 | 测评订单 | — |
-| TC-P-33-E | SC-P-33 | 测评下单 | 家长 | P2 | 异常 | 套餐可见 | 1. 套餐已下架仍下单 2. 数量填 -1 / 库存为 0 | 下架套餐 400『套餐不可售』;数量非法/库存不足拦截,不生成订单 | `AssessmentOrder` | — |
+| TC-P-33-b-E | SC-P-33 | 测评下单 | 家长 | P2 | 异常 | 套餐可见 | 1. 套餐已下架仍下单 2. 数量填 -1 / 库存为 0 | 下架套餐 400『套餐不可售』;数量非法/库存不足拦截,不生成订单 | `AssessmentOrder` | — |
 | TC-P-34-E | SC-P-34 | 测评支付 | 家长 | P2 | 异常 | pending 订单 | 1. 支付网关超时 2. 同一 pending 订单发两次支付成功 | 超时回滚不生成额度;重复回调幂等仅生成 1 条额度 | 支付/`AssessmentQuota` | — |
 | TC-P-35-E | SC-P-35 | 测评额度 | 家长 | P2 | 异常 | 支付成功 | 1. 用已过期额度预约 2. 额度页加载时依赖 AI 服务超时 | 过期额度预约返回『额度已过期』不落预约;额度页加载降级非 500 | `AssessmentQuota` | — |
 | TC-P-36-E | SC-P-36 | 测评预约 | 家长 | P2 | 异常 | 有效额度 | 1. 无有效额度调 create 2. 同一 quotaId+memberId 并发双发 | 无额度返回『额度不足或已过期』不建预约不发能量;并发双发仅落 1 条预约、能量仅发 1 次(幂等) | `AssessmentAppointmentController` | — |
 | TC-P-37-E | SC-P-37 | 预约状态 | 家长 | P2 | 异常 | 已有预约 | 1. 直接 PUT 状态从 pending→completed 跳过 confirmed 2. 查不存在的预约 | 状态机守卫拒绝非法跃迁返回 400;不存在预约 404;状态准确 | `AssessmentAppointmentController` | — |
 | TC-P-38-E | SC-P-38 | 预约取消 | 家长 | P2 | 异常 | 已有预约 | 1. 非本人/非绑定 T 取消他人预约 2. 已 completed 预约再取消 | 越权取消 403 被拒(CFC-AP);终态预约取消返回『不可取消』;不退款逻辑按配置 | `AssessmentAppointmentController` | — |
 | TC-P-39-E | SC-P-39 | DAN报告 | 家长 | P2 | 异常 | 结果已录入 | 1. 结果未录入打开结果页 2. 上传结果字段缺失(如缺 mind 类分数) | 未录入提示『结果待录入』不白屏;缺字段校验 400 提示缺哪项 | `DanAssessmentResultDTO` | — |
-| TC-P-40-E | SC-P-40 | AI方案 | 家长 | P2 | 异常 | 孩子 B+目标;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | `AIChatController`/`AiGateway` | — |
+| TC-P-40-b-E | SC-P-40 | AI方案 | 家长 | P2 | 异常 | 孩子 B+目标;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | `AIChatController`/`AiGateway` | — |
 | TC-P-41-E | SC-P-41 | 方案迭代 | 家长 | P2 | 异常 | 方案已生成 | 1. 重生成板块 A 时断网 2. 连续点同一板块重生成 | 断网 Fallback 保留其他板块不丢;连续点击幂等仅 1 次重生成 | `AIChatController` | — |
 | TC-P-42-E | SC-P-42 | 方案编辑 | 家长 | P2 | 异常 | 方案已生成 | 1. 编辑超长文本(>10000字) 2. 编辑他人方案 | 超长 400 提示;越权编辑 403 被拒;编辑后状态标记已改 | 方案管理 | — |
 | TC-P-43-E | SC-P-43 | 方案查看 | 家长 | P2 | 异常 | 方案存在 | 1. 打开 overview 为空的方案 2. 方案 id 不存在 | 空方案展示占位不白屏;不存在 404 | 方案管理 | — |
-| TC-P-44-E | SC-P-44 | 方案确认 | 家长 | P2 | 异常 | 方案 generated | 1. 未确认就点激活 2. 重复确认同一方案 | 未确认激活拦截『请先确认』;重复确认幂等仅 1 次 reviewed | 方案状态机 | — |
+| TC-P-44-b-E | SC-P-44 | 方案确认 | 家长 | P2 | 异常 | 方案 generated | 1. 未确认就点激活 2. 重复确认同一方案 | 未确认激活拦截『请先确认』;重复确认幂等仅 1 次 reviewed | 方案状态机 | — |
 | TC-P-45-E | SC-P-45 | 方案发布 | 家长 | P2 | 异常 | 配置允许 | 1. 配置需审核却直接发布 2. 发布未 reviewed 方案 | 需审核配置时发布走审核流不直接 active;未 reviewed 发布拦截 | 方案管理 | — |
 | TC-P-46-E | SC-P-46 | 方案激活 | 家长 | P2 | 异常 | reviewed 方案 | 1. 已 active 再点激活 2. 激活时任务分解服务超时 | 已激活再激活幂等不重复生成任务;超时回滚不残半任务,状态回 reviewed | 方案激活任务分解 | — |
 | TC-P-47-E | SC-P-47 | 方案任务 | 家长 | P2 | 异常 | 方案 active | 1. 方案 active 时删任务 2. 任务 id 非法 | 删任务同步方案并提示;非法 id 400;任务增删与方案一致 | `GrowthPlanController` | — |
 | TC-P-48-E | SC-P-48 | 方案版本 | 家长 | P3 | 异常 | 多版本方案 | 1. 试图 PUT 修改历史版本内容 2. 版本 id 不存在 | 历史版本只读返回 403『版本不可篡改』;不存在 404 | 方案管理 | — |
-| TC-P-49-E | SC-P-49 | AI对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController` | — |
-| TC-P-50-E | SC-P-50 | 成长记录 | 家长 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联报告已删 2. 首访无数据 | 关联已删项跳过不报错;首访空态正常,时间线不白屏 | `GrowthController` | — |
+| TC-P-49-b-E | SC-P-49 | AI对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController` | — |
+| TC-P-50-b-E | SC-P-50 | 成长记录 | 家长 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联报告已删 2. 首访无数据 | 关联已删项跳过不报错;首访空态正常,时间线不白屏 | `GrowthController` | — |
 | TC-P-51-E | SC-P-51 | 成长里程碑 | 家长 | P3 | 异常 | 有成长数据 | 1. 重复标同一里程碑 2. 标不存在的节点 | 重复标幂等仅 1 条;非法节点 400 | `GrowthController` | — |
 | TC-P-52-E | SC-P-52 | 商城浏览 | 家长 | P2 | 异常 | 进入商城 | 1. 搜索 SQL 注入关键词 2. 下架商品仍在列表 | 注入被转义返回安全结果;下架商品不展示;不 500 | `MallController`/`danshop` | — |
 | TC-P-53-E | SC-P-53 | 商品详情 | 家长 | P2 | 异常 | 商品存在 | 1. 库存为 0 商品打开详情 2. 商品 id 不存在 | 库存 0 提示『暂时缺货』;不存在 404 | `MallController` | — |
@@ -178,7 +178,7 @@
 | TC-P-55-E | SC-P-55 | 订单支付 | 家长 | P2 | 异常 | 待支付订单 | 1. 支付网关超时 2. 重复支付通知 | 超时回滚订单保持待支付;重复通知幂等仅 1 次 paid | 支付 | — |
 | TC-P-56-E | SC-P-56 | 订单退款 | 家长 | P2 | 异常 | 已有订单 | 1. 已发货订单申请退款 2. 同一订单重复退款 | 已发货按规则处理/拒;重复退款拦截仅 1 次 | 订单服务 | — |
 | TC-P-57-E | SC-P-57 | 优惠券 | 家长 | P2 | 异常 | 有可用券 | 1. 用过期券结算 2. 订单未满门槛用满减券 | 过期券不可用提示;未达门槛拦截『还差 X 元可用』;不重复抵扣 | 优惠券 | — |
-| TC-P-58-E | SC-P-58 | 会员购买 | 家长 | P2 | 异常 | 未购会员 | 1. 支付失败 2. 重复购买同档位 | 失败回滚不解锁;重复购买幂等仅 1 次、不双扣 | `MemberController` | — |
+| TC-P-58-b-E | SC-P-58 | 会员购买 | 家长 | P2 | 异常 | 未购会员 | 1. 支付失败 2. 重复购买同档位 | 失败回滚不解锁;重复购买幂等仅 1 次、不双扣 | `MemberController` | — |
 | TC-P-59-E | SC-P-59 | 会员权益 | 家长 | P2 | 异常 | 已购会员 | 1. 会员已过期仍看权益 2. 越权看他人权益 | 过期提示『会员已失效』;越权 403;权益随档位 | `MemberController` | — |
 | TC-P-60-E | SC-P-60 | 会员续费 | 家长 | P3 | 异常 | 会员将到期 | 1. 续费时原会员未到期 2. 续费金额非法(负) | 未到期续费叠加计算正确(延期);负金额 400 | `MemberController` | — |
 | TC-P-61-E | SC-P-61 | 联系人 | 家长 | P2 | 异常 | 联系人入口 | 1. 添加重复手机号联系人 2. 手机号格式非法 | 重复号码去重提示;非法格式 400;不建重复 | `ContactCard`/`contact-detail` | — |
@@ -219,54 +219,54 @@
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-P-01-P | P-1 | 家庭 | 家长 | P1 | 权限 | 已登录(默认 parent) | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyInviteController` | — |
 | TC-P-02-P | P-2 | 家庭/成员 | 家长 | P1 | 权限 | 家庭已创建;爷爷 C 可用 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyInviteController` | — |
-| TC-P-03-P | P-2 | 成员资料 | 家长 | P1 | 权限 | 家庭已创建 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyMembersController` | — |
-| TC-P-04-P | P-2 | 关系图 | 家长 | P1 | 权限 | 成员 C 已加入 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 关系类型 CRUD/前端选择器 | — |
-| TC-P-05-P | P-4 | 任务 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController` | — |
-| TC-P-06-P | P-4 | 任务审核 | 家长 | P1 | 权限 | B 已提交任务 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController`/`PointsController` | — |
-| TC-P-07-P | P-5 | 心愿 | 家长 | P1 | 权限 | 孩子已创建心愿 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `WishController`/`RewardController` | — |
-| TC-P-08-P | P-6 | 能量 | 家长 | P1 | 权限 | 已有能量记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `EnergyController` | — |
-| TC-P-09-P | P-7 | 测评订单 | 家长 | P1 | 权限 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
-| TC-P-10-P | P-8 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物菌群 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 健康报告上传解析 | — |
-| TC-P-11-P | P-8 | 报告查看 | 家长 | P1 | 权限 | 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析 | — |
-| TC-P-12-P | P-9 | 饮食推荐 | 家长 | P1 | 权限 | P-10 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
-| TC-P-13-P | P-10 | AI 方案 | 家长 | P1 | 权限 | 孩子 B 有报告;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | AI 统一走 LangGraph;`AiGateway` | — |
-| TC-P-14-P | P-10 | 方案提交 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
-| TC-P-15-P | P-3 | 双角色 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
-| TC-P-16-P | P-10 | 会员 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MembershipController`/`ProductOrderController` | — |
-| TC-P-17-P | P-12 | 积分/成长 | 家长 | P1 | 权限 | 已有记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `PointsController`/`GrowthController` | — |
-| TC-P-18-P | P-11 | AI 对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`;LangGraph RAG | — |
+| TC-P-05-P | P-05 | 成员资料 | 家长 | P1 | 权限 | 家庭已创建 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyMembersController` | — |
+| TC-P-07-P | P-07 | 关系图 | 家长 | P1 | 权限 | 成员 C 已加入 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-10-P | P-10 | 任务 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController` | — |
+| TC-P-11-P | P-11 | 任务审核 | 家长 | P1 | 权限 | B 已提交任务 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController`/`PointsController` | — |
+| TC-P-13-P | P-13 | 心愿 | 家长 | P1 | 权限 | 孩子已创建心愿 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `WishController`/`RewardController` | — |
+| TC-P-17-P | P-17 | 能量 | 家长 | P1 | 权限 | 已有能量记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `EnergyController` | — |
+| TC-P-33-P | P-33 | 测评订单 | 家长 | P1 | 权限 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
+| TC-P-20-P | P-20 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物菌群 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 健康报告上传解析 | — |
+| TC-P-22-P | P-22 | 报告查看 | 家长 | P1 | 权限 | 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析 | — |
+| TC-P-26-P | P-26 | 饮食推荐 | 家长 | P1 | 权限 | P-10 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
+| TC-P-40-P | P-40 | AI 方案 | 家长 | P1 | 权限 | 孩子 B 有报告;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | AI 统一走 LangGraph;`AiGateway` | — |
+| TC-P-44-P | P-44 | 方案提交 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
+| TC-P-03-P | P-03 | 双角色 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
+| TC-P-58-P | P-58 | 会员 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MembershipController`/`ProductOrderController` | — |
+| TC-P-50-P | P-50 | 积分/成长 | 家长 | P1 | 权限 | 已有记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `PointsController`/`GrowthController` | — |
+| TC-P-49-P | P-49 | AI 对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`;LangGraph RAG | — |
 | TC-P-19-P | SC-P-19 | 能量配置 | 家长 | P2 | 权限 | 进入能量页 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 维度配置 | — |
-| TC-P-20-P | SC-P-20 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析中台/`POST /api/media/upload` | — |
+| TC-P-20-b-P | SC-P-20 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析中台/`POST /api/media/upload` | — |
 | TC-P-21-P | SC-P-21 | 报告解析 | 家长 | P1 | 权限 | 多类型报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `/api/admin/report-parser/types` | — |
-| TC-P-22-P | SC-P-22 | 报告预览 | 家长 | P1 | 权限 | 报告已解析 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 解析中台 | — |
+| TC-P-22-b-P | SC-P-22 | 报告预览 | 家长 | P1 | 权限 | 报告已解析 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 解析中台 | — |
 | TC-P-23-P | SC-P-23 | 报告入库 | 家长 | P1 | 权限 | 解析预览完成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 解析中台 | — |
 | TC-P-24-P | SC-P-24 | 报告管理 | 家长 | P1 | 权限 | 多份报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告管理 | — |
 | TC-P-25-P | SC-P-25 | 报告趋势 | 家长 | P1 | 权限 | ≥2 同类型报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 成长/报告 | — |
-| TC-P-26-P | SC-P-26 | 饮食推荐 | 家长 | P1 | 权限 | SC-P-20 已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
+| TC-P-26-b-P | SC-P-26 | 饮食推荐 | 家长 | P1 | 权限 | SC-P-20 已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
 | TC-P-27-P | SC-P-27 | 家庭食谱 | 家长 | P1 | 权限 | 菌群报告+营养目标 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐/家庭食谱 | — |
 | TC-P-28-P | SC-P-28 | 食谱筛选 | 家长 | P2 | 权限 | 已生成食谱 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
 | TC-P-29-P | SC-P-29 | 食谱收藏 | 家长 | P2 | 权限 | 已生成食谱 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
 | TC-P-30-P | SC-P-30 | 食谱营养 | 家长 | P2 | 权限 | 食谱+营养目标 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
 | TC-P-31-P | SC-P-31 | 测评类型 | 家长 | P1 | 权限 | 进入测评页 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `DanAssessmentController` | — |
 | TC-P-32-P | SC-P-32 | 测评规划师 | 家长 | P1 | 权限 | 已绑定规划师 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 测评订单 | — |
-| TC-P-33-P | SC-P-33 | 测评下单 | 家长 | P1 | 权限 | 套餐可见 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentOrder` | — |
+| TC-P-33-b-P | SC-P-33 | 测评下单 | 家长 | P1 | 权限 | 套餐可见 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentOrder` | — |
 | TC-P-34-P | SC-P-34 | 测评支付 | 家长 | P1 | 权限 | pending 订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 支付/`AssessmentQuota` | — |
 | TC-P-35-P | SC-P-35 | 测评额度 | 家长 | P1 | 权限 | 支付成功 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentQuota` | — |
 | TC-P-36-P | SC-P-36 | 测评预约 | 家长 | P1 | 权限 | 有效额度 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
 | TC-P-37-P | SC-P-37 | 预约状态 | 家长 | P1 | 权限 | 已有预约 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
 | TC-P-38-P | SC-P-38 | 预约取消 | 家长 | P1 | 权限 | 已有预约 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
 | TC-P-39-P | SC-P-39 | DAN报告 | 家长 | P1 | 权限 | 结果已录入 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `DanAssessmentResultDTO` | — |
-| TC-P-40-P | SC-P-40 | AI方案 | 家长 | P1 | 权限 | 孩子 B+目标;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`/`AiGateway` | — |
+| TC-P-40-b-P | SC-P-40 | AI方案 | 家长 | P1 | 权限 | 孩子 B+目标;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`/`AiGateway` | — |
 | TC-P-41-P | SC-P-41 | 方案迭代 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController` | — |
 | TC-P-42-P | SC-P-42 | 方案编辑 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
 | TC-P-43-P | SC-P-43 | 方案查看 | 家长 | P1 | 权限 | 方案存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
-| TC-P-44-P | SC-P-44 | 方案确认 | 家长 | P1 | 权限 | 方案 generated | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
+| TC-P-44-b-P | SC-P-44 | 方案确认 | 家长 | P1 | 权限 | 方案 generated | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
 | TC-P-45-P | SC-P-45 | 方案发布 | 家长 | P1 | 权限 | 配置允许 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
 | TC-P-46-P | SC-P-46 | 方案激活 | 家长 | P1 | 权限 | reviewed 方案 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案激活任务分解 | — |
 | TC-P-47-P | SC-P-47 | 方案任务 | 家长 | P1 | 权限 | 方案 active | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthPlanController` | — |
 | TC-P-48-P | SC-P-48 | 方案版本 | 家长 | P2 | 权限 | 多版本方案 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
-| TC-P-49-P | SC-P-49 | AI对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController` | — |
-| TC-P-50-P | SC-P-50 | 成长记录 | 家长 | P1 | 权限 | 有成长数据 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthController` | — |
+| TC-P-49-b-P | SC-P-49 | AI对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController` | — |
+| TC-P-50-b-P | SC-P-50 | 成长记录 | 家长 | P1 | 权限 | 有成长数据 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthController` | — |
 | TC-P-51-P | SC-P-51 | 成长里程碑 | 家长 | P2 | 权限 | 有成长数据 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthController` | — |
 | TC-P-52-P | SC-P-52 | 商城浏览 | 家长 | P1 | 权限 | 进入商城 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MallController`/`danshop` | — |
 | TC-P-53-P | SC-P-53 | 商品详情 | 家长 | P1 | 权限 | 商品存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MallController` | — |
@@ -274,7 +274,7 @@
 | TC-P-55-P | SC-P-55 | 订单支付 | 家长 | P1 | 权限 | 待支付订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 支付 | — |
 | TC-P-56-P | SC-P-56 | 订单退款 | 家长 | P1 | 权限 | 已有订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 订单服务 | — |
 | TC-P-57-P | SC-P-57 | 优惠券 | 家长 | P1 | 权限 | 有可用券 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 优惠券 | — |
-| TC-P-58-P | SC-P-58 | 会员购买 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
+| TC-P-58-b-P | SC-P-58 | 会员购买 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
 | TC-P-59-P | SC-P-59 | 会员权益 | 家长 | P1 | 权限 | 已购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
 | TC-P-60-P | SC-P-60 | 会员续费 | 家长 | P2 | 权限 | 会员将到期 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
 | TC-P-61-P | SC-P-61 | 联系人 | 家长 | P1 | 权限 | 联系人入口 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `ContactCard`/`contact-detail` | — |

+ 30 - 30
tests/test-cases/teacher.md

@@ -7,15 +7,15 @@
 | TC-T-01 | T-1 | 认证/双角色 | 规划师 | P0 | 权限 | 已分配规划师账号 | 1. 密码登录 2. 切回家长视角 3. 访问无关家庭数据 | 进入仪表板;可切回自身家长视角;越权访问无关家庭被拒 | `AuthController`;规划师可切回家长 | `e2e/roles/teacher/login.spec.js` |
 | TC-T-02 | T-2 | 家庭绑定 | 规划师 | P1 | 功能 | 家长已生成邀请码 | 1. 输入邀请码绑定 2. 查看「我的家庭」 | 家庭出现在列表,可见成员;无效码提示失败;重复绑定幂等 | `FamilyInviteController` | `e2e/roles/teacher/family-binding.spec.js` |
 | TC-T-03 | T-3 | 健康报告 | 规划师 | P0 | 功能 | 已绑定家庭与孩子 B | 1. 上传募极生物 PDF+选 B 2. 三阶段:上传→解析预览→确认入库 | 报告进入孩子档案;健康列表可见;识别失败进草稿/未知聚类 | 报告上传解析;规划师代传 | `e2e/roles/teacher/dan-report-flow.spec.js` |
-| TC-T-04 | T-3 | 报告审核 | 规划师 | P1 | 功能 | 有报告草稿(如 id=28) | 1. 打开审核队列草稿 2. 确认 | 草稿确认入库,健康报告列表可见;确认前可取消不入库 | 报告审核 | — |
-| TC-T-05 | T-4 | 方案管理 | 规划师 | P0 | 功能 | 有 generated/reviewed/active 方案 | 1. 打开方案管理页 | 列表正常渲染(无白屏);函数不报未定义 | 方案管理;黑盒回归项 | `e2e/admin-panel.spec.js`(参考) |
-| TC-T-06 | T-4 | 方案审核 | 规划师 | P0 | 功能 | 家长已提交方案(generated) | 1. 对方案 A 点「批准」 | 状态 generated→reviewed | 方案状态机 | — |
-| TC-T-07 | T-5 | 方案激活 | 规划师 | P0 | 功能 | 方案已 reviewed | 1. 点「激活」→确认 2. 激活后查看孩子任务 | 状态 reviewed→active;生成引导任务+模板任务;孩子 B 出现方案启动任务 | 激活拆任务 | `e2e/ai-plan-task-flow.spec.js` |
-| TC-T-08 | T-5 | 方案激活·幂等 | 规划师 | P0 | 异常 | 方案已 active | 1. 对已激活方案再次激活 | 返回状态异常提示,**不重复生成任务**(幂等) | 幂等约束(黑盒回归) | — |
-| TC-T-09 | T-6 | 任务审核 | 规划师 | P1 | 功能 | 孩子已提交任务 | 1. 打开家庭任务列表 2. 审核 | 通过→孩子得积分;驳回→退回重做;越权审核非绑定家庭被拒 | `TaskController` | — |
-| TC-T-10 | T-7 | 测评录入 | 规划师 | P0 | 功能 | 家长已支付测评订单(待安排→已预约) | 1. 打开测评订单 2. 录入各维度得分 3. 保存 | 结果可见;触发规则引擎自动生成方案(generated);必填缺失→校验拦截;重复录入覆盖 | `AssessmentAppointmentController`/`DanAssessmentController` | `e2e/assessment-order-flow.spec.js` |
-| TC-T-11 | T-8 | 成长计划 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 打开「成长计划」页 | 列表显示自己创建的计划(childName/状态/时间);不再 400 | `GrowthPlanController`;黑盒回归 | `e2e/guide-family-list.spec.js`(参考) |
-| TC-T-12 | T-8 | 套餐 | 规划师 | P1 | 功能 | 套餐素材就绪 | 1. 创建「专注力提升套餐」含任务项 2. 提交审核 3. 审核通过后购买 | 上架前提交审核;审核通过后可被市场购买;任务项为空→校验拦截 | `GuidePackageController` | — |
+| TC-T-03-b | T-03 | 报告审核 | 规划师 | P1 | 功能 | 有报告草稿(如 id=28) | 1. 打开审核队列草稿 2. 确认 | 草稿确认入库,健康报告列表可见;确认前可取消不入库 | 报告审核 | — |
+| TC-T-14 | T-14 | 方案管理 | 规划师 | P0 | 功能 | 有 generated/reviewed/active 方案 | 1. 打开方案管理页 | 列表正常渲染(无白屏);函数不报未定义 | 方案管理;黑盒回归项 | `e2e/admin-panel.spec.js`(参考) |
+| TC-T-04 | T-04 | 方案审核 | 规划师 | P0 | 功能 | 家长已提交方案(generated) | 1. 对方案 A 点「批准」 | 状态 generated→reviewed | 方案状态机 | — |
+| TC-T-05 | T-05 | 方案激活 | 规划师 | P0 | 功能 | 方案已 reviewed | 1. 点「激活」→确认 2. 激活后查看孩子任务 | 状态 reviewed→active;生成引导任务+模板任务;孩子 B 出现方案启动任务 | 激活拆任务 | `e2e/ai-plan-task-flow.spec.js` |
+| TC-T-05-b | T-05 | 方案激活·幂等 | 规划师 | P0 | 异常 | 方案已 active | 1. 对已激活方案再次激活 | 返回状态异常提示,**不重复生成任务**(幂等) | 幂等约束(黑盒回归) | — |
+| TC-T-06 | T-06 | 任务审核 | 规划师 | P1 | 功能 | 孩子已提交任务 | 1. 打开家庭任务列表 2. 审核 | 通过→孩子得积分;驳回→退回重做;越权审核非绑定家庭被拒 | `TaskController` | — |
+| TC-T-07 | T-07 | 测评录入 | 规划师 | P0 | 功能 | 家长已支付测评订单(待安排→已预约) | 1. 打开测评订单 2. 录入各维度得分 3. 保存 | 结果可见;触发规则引擎自动生成方案(generated);必填缺失→校验拦截;重复录入覆盖 | `AssessmentAppointmentController`/`DanAssessmentController` | `e2e/assessment-order-flow.spec.js` |
+| TC-T-08 | T-08 | 成长计划 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 打开「成长计划」页 | 列表显示自己创建的计划(childName/状态/时间);不再 400 | `GrowthPlanController`;黑盒回归 | `e2e/guide-family-list.spec.js`(参考) |
+| TC-T-08-b | T-08 | 套餐 | 规划师 | P1 | 功能 | 套餐素材就绪 | 1. 创建「专注力提升套餐」含任务项 2. 提交审核 3. 审核通过后购买 | 上架前提交审核;审核通过后可被市场购买;任务项为空→校验拦截 | `GuidePackageController` | — |
 
 ### 门禁项
 
@@ -30,7 +30,7 @@
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
 | TC-T-13 | SC-T-13 | 数据隔离 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 列家庭/成员/报告 2. 越权查非绑定家庭 | 非绑定家庭统一 403;仅见绑定家庭数据 | 控制器内 role 检查 | — |
-| TC-T-14 | SC-T-14 | 方案编辑 | 规划师 | P1 | 功能 | 方案存在 | 1. 编辑板块/任务项 2. 保存 | 编辑后状态标记已改;保存生效 | 方案管理 | — |
+| TC-T-14-b | SC-T-14 | 方案编辑 | 规划师 | P1 | 功能 | 方案存在 | 1. 编辑板块/任务项 2. 保存 | 编辑后状态标记已改;保存生效 | 方案管理 | — |
 | TC-T-15 | SC-T-15 | 套餐任务 | 规划师 | P1 | 功能 | 套餐存在 | 1. 增删任务项 2. 重算 | 空套餐拦截上架;重算后任务项正确 | `GuidePackageController` | — |
 | TC-T-16 | SC-T-16 | 健康总览 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 家庭仪表板→能量/报告/方案汇总 | 数据缺失项降级展示不 500 | 仪表板 | — |
 | TC-T-17 | SC-T-17 | 计划进度 | 规划师 | P1 | 功能 | 计划存在 | 1. 计划→任务完成度 | 进度计算准确;与任务状态一致 | `GrowthPlanController` | — |
@@ -62,17 +62,17 @@
 | TC-T-01-E | T-1 | 认证/双角色 | 规划师 | P2 | 异常 | 已分配规划师账号 | 1. token 缺失/过期访问规划师接口 2. 非指派家庭直接拼路由访问 3. 模拟登录开关校验 | 缺失/过期 token 统一 401 跳登录;非绑定家庭路由 403 被拒;模拟登录开关仅在测试环境可开 | `AuthController`;规划师可切回家长 | — |
 | TC-T-02-E | T-2 | 家庭绑定 | 规划师 | P2 | 异常 | 家长已生成邀请码 | 1. 邀请码填错/过期(>7天) 2. 重复绑定同一家庭 3. 绑定已注销家庭 | 错码/过期提示『邀请码无效或已失效』;重复绑定幂等不双建;注销家庭不可绑 | `FamilyInviteController` | — |
 | TC-T-03-E | T-3 | 健康报告 | 规划师 | P2 | 异常 | 已绑定家庭与孩子 B | 1. 上传损坏PDF/非募极/超大 2. 解析超时 3. 选非绑定家庭的孩子 | 损坏/非募极提示明确(非募极提示请确认募极生物);超大超限提示;解析超时进草稿非500;非绑定孩子 403 | 报告上传解析;规划师代传 | — |
-| TC-T-04-E | T-3 | 报告审核 | 规划师 | P2 | 异常 | 有报告草稿(如 id=28) | 1. 确认一个已被他人确认/删除的草稿 2. 解析超时草稿点确认 3. 非绑定家庭草稿 | 已删草稿提示『不存在』;解析中确认提示稍候;非绑定家庭草稿 403 不可操作 | 报告审核 | — |
-| TC-T-05-E | T-4 | 方案管理 | 规划师 | P2 | 异常 | 有 generated/reviewed/active 方案 | 1. 方案列表接口超时 2. 方案含未定义函数引用渲染 3. 空方案列表 | 列表超时降级提示非500;黑盒回归:函数不再未定义、不白屏;空列表正常占位 | 方案管理;黑盒回归项 | — |
-| TC-T-06-E | T-4 | 方案审核 | 规划师 | P2 | 异常 | 家长已提交方案(generated) | 1. 对非 generated 态(如已 reviewed)方案再点批准 2. 并发双批准 | 非 generated 态批准拦截(状态机守卫);并发双批准幂等仅 1 次状态跃迁 | 方案状态机 | — |
-| TC-T-07-E | T-5 | 方案激活 | 规划师 | P2 | 异常 | 方案已 reviewed | 1. 激活时任务分解服务超时 2. 对已激活方案再激活 3. 激活非 reviewed 方案 | 超时回滚不残半任务、状态回 reviewed;已激活再激活幂等不重复生成任务;非 reviewed 激活拦截 | 激活拆任务 | — |
-| TC-T-08-E | T-5 | 方案激活·幂等 | 规划师 | P2 | 异常 | 方案已 active | 1. 对已 active 方案连续点激活两次(并发) | 第二次幂等返回现状、不重复生成引导/模板任务;任务数与首次一致 | 幂等约束(黑盒回归) | — |
-| TC-T-09-E | T-6 | 任务审核 | 规划师 | P2 | 异常 | 孩子已提交任务 | 1. 审核非绑定家庭孩子任务 2. 同任务并发双审 3. 超期任务审核 | 非绑定家庭 403;并发双审幂等仅计 1 次积分;超期任务审核被拒 | `TaskController` | — |
-| TC-T-10-E | T-7 | 测评录入 | 规划师 | P2 | 异常 | 家长已支付测评订单(待安排→已预约) | 1. 必填维度缺失录入 2. 同一订单重复录入 3. 分值越界(>量纲) 4. 非指派规划师 confirm | 必填缺失 400 不生成半成品;重复录入覆盖非新增;越界 400 不写脏分;非指派 confirm 返回『您不是被指派测评师』 | `AssessmentAppointmentController`/`DanAssessmentController` | — |
-| TC-T-11-E | T-8 | 成长计划 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 成长计划列表接口超时 2. 空计划列表 3. 越权查非绑定家庭计划 | 超时降级非500;空列表正常;非绑定家庭 403 | `GrowthPlanController`;黑盒回归 | — |
-| TC-T-12-E | T-8 | 套餐 | 规划师 | P2 | 异常 | 套餐素材就绪 | 1. 提交空任务项套餐上架 2. 套餐审核超时 3. 重复提交同一套餐 | 空任务项拦截上架;审核超时回退草稿非500;重复提交幂等 | `GuidePackageController` | — |
+| TC-T-03-b-E | T-03 | 报告审核 | 规划师 | P2 | 异常 | 有报告草稿(如 id=28) | 1. 确认一个已被他人确认/删除的草稿 2. 解析超时草稿点确认 3. 非绑定家庭草稿 | 已删草稿提示『不存在』;解析中确认提示稍候;非绑定家庭草稿 403 不可操作 | 报告审核 | — |
+| TC-T-14-E | T-14 | 方案管理 | 规划师 | P2 | 异常 | 有 generated/reviewed/active 方案 | 1. 方案列表接口超时 2. 方案含未定义函数引用渲染 3. 空方案列表 | 列表超时降级提示非500;黑盒回归:函数不再未定义、不白屏;空列表正常占位 | 方案管理;黑盒回归项 | — |
+| TC-T-04-E | T-04 | 方案审核 | 规划师 | P2 | 异常 | 家长已提交方案(generated) | 1. 对非 generated 态(如已 reviewed)方案再点批准 2. 并发双批准 | 非 generated 态批准拦截(状态机守卫);并发双批准幂等仅 1 次状态跃迁 | 方案状态机 | — |
+| TC-T-05-E | T-05 | 方案激活 | 规划师 | P2 | 异常 | 方案已 reviewed | 1. 激活时任务分解服务超时 2. 对已激活方案再激活 3. 激活非 reviewed 方案 | 超时回滚不残半任务、状态回 reviewed;已激活再激活幂等不重复生成任务;非 reviewed 激活拦截 | 激活拆任务 | — |
+| TC-T-05-b-E | T-05 | 方案激活·幂等 | 规划师 | P2 | 异常 | 方案已 active | 1. 对已 active 方案连续点激活两次(并发) | 第二次幂等返回现状、不重复生成引导/模板任务;任务数与首次一致 | 幂等约束(黑盒回归) | — |
+| TC-T-06-E | T-06 | 任务审核 | 规划师 | P2 | 异常 | 孩子已提交任务 | 1. 审核非绑定家庭孩子任务 2. 同任务并发双审 3. 超期任务审核 | 非绑定家庭 403;并发双审幂等仅计 1 次积分;超期任务审核被拒 | `TaskController` | — |
+| TC-T-07-E | T-07 | 测评录入 | 规划师 | P2 | 异常 | 家长已支付测评订单(待安排→已预约) | 1. 必填维度缺失录入 2. 同一订单重复录入 3. 分值越界(>量纲) 4. 非指派规划师 confirm | 必填缺失 400 不生成半成品;重复录入覆盖非新增;越界 400 不写脏分;非指派 confirm 返回『您不是被指派测评师』 | `AssessmentAppointmentController`/`DanAssessmentController` | — |
+| TC-T-08-E | T-08 | 成长计划 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 成长计划列表接口超时 2. 空计划列表 3. 越权查非绑定家庭计划 | 超时降级非500;空列表正常;非绑定家庭 403 | `GrowthPlanController`;黑盒回归 | — |
+| TC-T-08-b-E | T-08 | 套餐 | 规划师 | P2 | 异常 | 套餐素材就绪 | 1. 提交空任务项套餐上架 2. 套餐审核超时 3. 重复提交同一套餐 | 空任务项拦截上架;审核超时回退草稿非500;重复提交幂等 | `GuidePackageController` | — |
 | TC-T-13-E | SC-T-13 | 数据隔离 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 直接拼路由查非绑定家庭报告/任务 2. 越权访问并发 | 非绑定家庭统一 403;不泄露他人数据;并发越权同样 403 | 控制器内 role 检查 | — |
-| TC-T-14-E | SC-T-14 | 方案编辑 | 规划师 | P2 | 异常 | 方案存在 | 1. 编辑已归档方案 2. 编辑非绑定家庭方案 3. 超长文本 | 归档方案编辑拦截;非绑定家庭 403;超长 400 | 方案管理 | — |
+| TC-T-14-b-E | SC-T-14 | 方案编辑 | 规划师 | P2 | 异常 | 方案存在 | 1. 编辑已归档方案 2. 编辑非绑定家庭方案 3. 超长文本 | 归档方案编辑拦截;非绑定家庭 403;超长 400 | 方案管理 | — |
 | TC-T-15-E | SC-T-15 | 套餐任务 | 规划师 | P2 | 异常 | 套餐存在 | 1. 套餐任务重算服务超时 2. 空套餐任务重算 3. 并发增删任务 | 重算超时降级提示非500;空套餐拦截;并发增删各自生效不丢项 | `GuidePackageController` | — |
 | TC-T-16-E | SC-T-16 | 健康总览 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 仪表板某成员报告/能量数据缺失 2. 接口超时 | 缺失项降级展示不白屏;超时降级提示非500;仅绑定家庭数据 | 仪表板 | — |
 | TC-T-17-E | SC-T-17 | 计划进度 | 规划师 | P2 | 异常 | 计划存在 | 1. 计划进度接口超时 2. 进度与任务状态不一致时 | 超时降级非500;进度按任务状态实时计算、一致 | `GrowthPlanController` | — |
@@ -101,17 +101,17 @@
 | TC-T-01-P | T-1 | 认证/双角色 | 规划师 | P1 | 权限 | 已分配规划师账号 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AuthController`;规划师可切回家长 | — |
 | TC-T-02-P | T-2 | 家庭绑定 | 规划师 | P1 | 权限 | 家长已生成邀请码 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `FamilyInviteController` | — |
 | TC-T-03-P | T-3 | 健康报告 | 规划师 | P1 | 权限 | 已绑定家庭与孩子 B | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告上传解析;规划师代传 | — |
-| TC-T-04-P | T-3 | 报告审核 | 规划师 | P1 | 权限 | 有报告草稿(如 id=28) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告审核 | — |
-| TC-T-05-P | T-4 | 方案管理 | 规划师 | P1 | 权限 | 有 generated/reviewed/active 方案 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理;黑盒回归项 | — |
-| TC-T-06-P | T-4 | 方案审核 | 规划师 | P1 | 权限 | 家长已提交方案(generated) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案状态机 | — |
-| TC-T-07-P | T-5 | 方案激活 | 规划师 | P1 | 权限 | 方案已 reviewed | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 激活拆任务 | — |
-| TC-T-08-P | T-5 | 方案激活·幂等 | 规划师 | P1 | 权限 | 方案已 active | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 幂等约束(黑盒回归) | — |
-| TC-T-09-P | T-6 | 任务审核 | 规划师 | P1 | 权限 | 孩子已提交任务 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `TaskController` | — |
-| TC-T-10-P | T-7 | 测评录入 | 规划师 | P1 | 权限 | 家长已支付测评订单(待安排→已预约) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AssessmentAppointmentController`/`DanAssessmentController` | — |
-| TC-T-11-P | T-8 | 成长计划 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GrowthPlanController`;黑盒回归 | — |
-| TC-T-12-P | T-8 | 套餐 | 规划师 | P1 | 权限 | 套餐素材就绪 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GuidePackageController` | — |
+| TC-T-03-b-P | T-03 | 报告审核 | 规划师 | P1 | 权限 | 有报告草稿(如 id=28) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告审核 | — |
+| TC-T-14-P | T-14 | 方案管理 | 规划师 | P1 | 权限 | 有 generated/reviewed/active 方案 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理;黑盒回归项 | — |
+| TC-T-04-P | T-04 | 方案审核 | 规划师 | P1 | 权限 | 家长已提交方案(generated) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案状态机 | — |
+| TC-T-05-P | T-05 | 方案激活 | 规划师 | P1 | 权限 | 方案已 reviewed | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 激活拆任务 | — |
+| TC-T-05-b-P | T-05 | 方案激活·幂等 | 规划师 | P1 | 权限 | 方案已 active | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 幂等约束(黑盒回归) | — |
+| TC-T-06-P | T-06 | 任务审核 | 规划师 | P1 | 权限 | 孩子已提交任务 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `TaskController` | — |
+| TC-T-07-P | T-07 | 测评录入 | 规划师 | P1 | 权限 | 家长已支付测评订单(待安排→已预约) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AssessmentAppointmentController`/`DanAssessmentController` | — |
+| TC-T-08-P | T-08 | 成长计划 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GrowthPlanController`;黑盒回归 | — |
+| TC-T-08-b-P | T-08 | 套餐 | 规划师 | P1 | 权限 | 套餐素材就绪 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GuidePackageController` | — |
 | TC-T-13-P | SC-T-13 | 数据隔离 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 控制器内 role 检查 | — |
-| TC-T-14-P | SC-T-14 | 方案编辑 | 规划师 | P1 | 权限 | 方案存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理 | — |
+| TC-T-14-b-P | SC-T-14 | 方案编辑 | 规划师 | P1 | 权限 | 方案存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理 | — |
 | TC-T-15-P | SC-T-15 | 套餐任务 | 规划师 | P1 | 权限 | 套餐存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GuidePackageController` | — |
 | TC-T-16-P | SC-T-16 | 健康总览 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 仪表板 | — |
 | TC-T-17-P | SC-T-17 | 计划进度 | 规划师 | P1 | 权限 | 计划存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GrowthPlanController` | — |