test(deploy): verify fourth feedback capture and public release

This commit is contained in:
xsl
2026-10-12 20:27:45 +08:00
parent 92a3965b7d
commit 3f165bf9e5
10 changed files with 707 additions and 648 deletions
+15 -2
View File
@@ -39,7 +39,7 @@
| 歪头 roll | 不判断 | ≤10° |
| 脸部平均亮度 | 65~235 | 75~225 |
| 稳定累计 | 450ms,短暂漏检不打断 | ≥650ms 且≥3 合格帧;任何漏检/异常打断,帧间隔>2000ms 打断 |
| 稳定期间漂移 | 未单独判断 | 相对起始合格帧 yaw/pitch≤5°,中心 x/y≤原帧 3.5%,框高比例变化≤4.5% |
| 稳定期间漂移 | 未单独判断 | 相对起始合格帧 yaw/pitch≤5°,中心 x/y≤原帧 3.5%,框高占比变化≤4.5 个百分点 |
| 最终 JPEG | 实时抓拍后直接推进 | 抓拍后本地复验通过才推进 |
系统相机/相册文件使用同样的单人、完整入镜、距离、角度、光线门限;由于系统照片可能已镜像,沿用不判断左右方向的兼容方式,并记录 `direction_checked:false`。模型加载中最多等待 8 秒;模型确实不可用时保留原有手动/文件降级通路,并记录 `unchecked/model-unavailable`,不伪称已校验。
@@ -72,4 +72,17 @@
- 使用本地真实模型对 C3_180、C3_-135、C3_135 三张样例进行推理,当前收紧门限均通过(yaw 约 4.28°/-44.77°/42.59°)。这不是对真实手机拍摄合格率的保证。
- `node h5/test/capture-quality-browser.mjs`:真实识别引擎和原始模型,使用保持长宽比、居中后的三视角样例模拟视频流,实际自动拍摄三张并复验 JPEG;正脸不能冒充侧脸、反方向侧脸不能直接推进,诊断对应正确视角,相机成功后释放。不是手动触发快门,也不是模拟识别结果。
全部写入测试仅发生在独立临时数据目录,上游测肤以本地样例替代;不调用收费 Face++,不修改生产账号、照片、报告或配置。真实手机微信/相机验收与上线需后续执行。
全部写入测试仅发生在独立临时数据目录,上游测肤以本地样例替代;不调用收费 Face++,不修改生产账号、照片、报告或配置。真实手机微信/相机仍需用户最终验收。
## 生产部署及只读验收
- 功能提交:`92a3965b7d637f19ec3d31389f142447339ff2a6`(`feat(h5): apply fourth feedback and tighten local capture validation`)。
- 服务器:`ubuntu@1me.xajuzi.com:/home/ubuntu/juzi`;入口:<https://1me.xajuzi.com/state/>。部署前服务器工作区干净、HEAD 与 origin/main 均为 `e53c809`;通过 Git bundle 快进更新,不代替用户 push、不覆盖服务器私有配置或已有用户数据。
- 更新后重启 `juzi-h5.service`,让服务端评分展示模块、质量诊断模块及前端同版。服务 active/running,`NRestarts=0`,健康接口 `ok:true`;检查时最近 10 分钟错误级日志为 0。
- 公网首页、app/capture-quality/head-pose/report-ui 四个脚本、CSS、两份扫描素材全部 200;逐文件 SHA-256 与本地一致,均为 `Cache-Control: no-cache`。
- 公网未登录报告、后台页面及统计接口均 401;私有身份文件、server.js 均 404;微信配置仍启用,不修改微信凭据或流程。
- 公网真实模型的自动三连拍测试通过:三个实际合格视角自动抓拍、最终 JPEG 本地复验、实际识别到的正脸/错误方向不能冒充目标侧脸、正确诊断归属、报告后释放摄像头;登录与测肤响应仅浏览器内拦截,不产生生产账号或报告、不调用收费测肤。
- 公网第三轮专项串行复验通过:五种屏宽的弹窗断行/产品版式、三款产品、扫描动效与成功进入报告、六种等待视口、装饰图标、取消/迟到响应/失败恢复及字体/扫描图失败降级;无页面 JS 异常。已检查公网首页、等待画面及产品截图。
- 公网第二轮回归串行复验通过:首页口号/Logo 比例、实际 PSD 字体、首屏不加载完整字体和识别引擎、全屏相机、三种圆角轮廓/五官辅助线、五种宽度无溢出;无页面 JS 异常。
- 公网报告交互串行复验通过:三个维度独立滑动/键盘切换、垂直滚动不误切换、图片放大、七张检测图、三档产品排版;皱纹正文显示指定结论、不再包含分区技术附文。无页面 JS 异常。
- 同时启动多套冷浏览器时曾出现字体/资源下载超时;串行重试自动拍摄流程通过。字体仍按原 PSD 使用原始 MiSans,并不将此网络压力测试描述为真实手机合格率保证。
+18 -15
View File
@@ -4,9 +4,9 @@
"2": "app.js",
"3": "skin-score.js",
"4": "customer-feedback-second.js",
"5": "n",
"6": "extractFaceTensors",
"7": ".loadFromDisk",
"5": "r",
"6": "extractFaces",
"7": "customer-feedback-third.mjs",
"8": "admin.js",
"9": "__awaiter",
"10": "FaceLandmarks68",
@@ -14,14 +14,14 @@
"12": "server.js",
"13": "files",
"14": ".draw",
"15": "extractFaces",
"15": "getEnv",
"16": "巨子测肤 · 1'me 在线肌肤测试 — UI 设计规范",
"17": "k",
"18": "1'me 在线肌肤测试 H5",
"19": "customer-feedback-fourth.js",
"20": "build_fixtures.py",
"21": "disposeUnusedWeightTensors",
"22": "FaceExpressionNet",
"22": "AgeGenderNet",
"23": "facepp-skinanalyze(旷视皮肤分析专业版调用技能)",
"24": "巨子测肤 · 1'me 语音播报内容设计文档 V1.0",
"25": "mobile-select.iife.min.js",
@@ -42,7 +42,7 @@
"40": "第四轮反馈修改与验收",
"41": "NeuralNetwork",
"42": "layer_at",
"43": "normalize",
"43": "convLayer",
"44": "start-local.sh",
"45": "PredictAllAgeAndGenderWithFaceAlignmentTask",
"46": "PredictAllFaceExpressionsWithFaceAlignmentTask",
@@ -65,27 +65,27 @@
"63": "e2e-browser.mjs",
"64": "account-client.js",
"65": "微信登录接入与公网部署说明",
"66": "report-persistence.mjs",
"66": ".div",
"67": "ui-20261009.mjs",
"68": "analyze-timeout.js",
"69": "misans/README.md",
"70": "extractConvParamsFactory",
"71": "AgeGenderNet",
"71": ".predictAgeAndGender",
"72": "build_report_copy.py",
"73": "camera-geometry.js",
"74": "report-copy.js",
"75": "prepare_h5_assets.py",
"76": ".detect",
"76": "TinyYolov2Base",
"77": "drawFaceExpressions",
"78": "t",
"78": "n",
"79": "登录反馈与加载优化(2026-10-12)",
"80": "线上微信登录部署记录",
"81": "wechat-production.mjs",
"82": "wechat-browser.mjs",
"82": ".forwardInput",
"83": "10.09 新版 H5 实施与验收",
"84": "微信登录联调:2026-10-12",
"85": "test/accounts.js",
"86": "TinyFaceFeatureExtractor",
"86": "normalize",
"87": "产品推荐规则:肤龄基准与边界调整",
"88": "ui-20261012/manifest.json",
"89": "傅艳NEW与项思炼的会话 2026年10月12日.md",
@@ -94,14 +94,17 @@
"92": "客户反馈修改(2026-10-12)",
"93": ".runAndExtendWithFaceDetections",
"94": "第三轮反馈:PSD 对齐、验收及上线记录",
"95": "login-performance.mjs",
"96": "production-loop.mjs",
"95": ".forwardInput",
"96": ".run",
"97": "PredictSingleAgeAndGenderWithFaceAlignmentTask",
"98": "PredictSingleFaceExpressionsWithFaceAlignmentTask",
"99": "DetectSingleFaceLandmarksTask",
"100": "extractAllFacesAndComputeResults",
"101": ".toBatchTensor",
"102": "TinyYolov2",
"103": "第四轮反馈/傅艳NEW与项思炼的会话 2026年10月12日.md",
"104": "export_fourth_feedback_assets.py",
"105": "capture-quality-browser.mjs",
"106": "第三轮反馈20261012/傅艳NEW与项思炼的会话 2026年10月12日.md"
"106": "第三轮反馈20261012/傅艳NEW与项思炼的会话 2026年10月12日.md",
"107": "rescaleAndNormalize"
}
+1 -1
View File
@@ -1 +1 @@
{"0": "37652788ec545d8c", "1": "cb6ea50bd4e4a5ca", "2": "b159712c832c558e", "3": "1f737ca8edb978f2", "4": "56bf12952b0de42b", "5": "47494afa617b619b", "6": "8ebd0f43f0e86540", "7": "29c0ad4b6e50513b", "8": "a689fcb62e7754af", "9": "fcd7da5fb21df420", "10": "15606ce5d8eec23a", "11": "4a490abd5e503318", "12": "aeca274694e158d2", "13": "7e3b558a587a4ebe", "14": "bf75bfc99d4f9e34", "15": "2c0eaf406546159b", "16": "95add6a975c0cb72", "17": "ea5cb911b81546f5", "18": "38bb0b185ceed116", "19": "39abb1eef19df707", "20": "aecf2fce44ba49c5", "21": "9d50601a75c5903e", "22": "f7ad594ba6fb1a78", "23": "90fac00055070ce2", "24": "f85b5b1634224c86", "25": "46e8db3e6e3f37ea", "26": "b6934549d800f3bd", "27": "eab427ce9a5219e9", "28": "3c44bc4b258aa360", "29": "c608f1c6492e1cb1", "30": "73c13793fca09f56", "31": "fbbcfc059751cc6a", "32": "f6bcf56c4589316b", "33": "75f750c5b7d9f63d", "34": "f024ff7942935690", "35": "241be5abeab1da6f", "36": "a7d375041779bad4", "37": "cb8f26249485324a", "38": "9a25b1230b5fe649", "39": "fdd95375b4a5ddb3", "40": "0ea4c7c8a34ebf68", "41": "d96493a5f110bd4c", "42": "916170b9f5d7346b", "43": "eb9096fc959866ce", "44": "852c1bb2446edd9c", "45": "92ab3e5134ed8685", "46": "65718282b3c32109", "47": "e594ecaa8e7d1538", "48": "cf2f2424bc00436f", "49": "1f976711cda158dc", "50": "bbb2b57d72922b16", "51": "eb6a182204867275", "52": "2ec3c8c088568ba9", "53": "68c45056378341a7", "54": "c58d41e8e580fdc6", "55": "ed3c8df05ff45f5e", "56": "9ee2ad45dc27851d", "57": "f2a40b5f1b29f669", "58": "9a659f254e1ffa46", "59": "891f59cda3708718", "60": "a505b7de6257a4e8", "61": "9ed244ba3453a0c1", "62": "1366ae24c7e5897d", "63": "c256b43f75d7809e", "64": "ce0e68dab611f022", "65": "74ae017de0ffd36b", "66": "e042d7fe7351bcb9", "67": "3e126d8deaf6e200", "68": "6b91f3679541de79", "69": "e511846eeba03076", "70": "e2303b43add6bddd", "71": "14fdf4e4c496519f", "72": "c84f196a7bd35861", "73": "2b887bf601ccfb9f", "74": "ae2a154311e1f53a", "75": "69fdd23278518884", "76": "9f2b7646fd18ba5d", "77": "2165f45a42456a76", "78": "7f25acff11d57ca1", "79": "c6cfdfe181232ecc", "80": "315325cde1352e98", "81": "37c559741825be74", "82": "2b037735e1f5b0f6", "83": "1284897282eb47a3", "84": "d8bb296741d3d05c", "85": "4bc370be8afd7db1", "86": "ec24a95b0cbd8486", "87": "e5fa7717989eda80", "88": "8b5ab5232cef3457", "89": "9e3363b80eeceeea", "90": "dd1c246e19a2d032", "91": "83b0fd3b14363e4d", "92": "fced244d93677d90", "93": "a38797466ce43978", "94": "713d04996c4627df", "95": "59c31f858c7b6970", "96": "4195478d5c528371", "97": "01f68dfc34a29d32", "98": "8c471c7baeaaca54", "99": "23f1d406f6c779ae", "100": "29debca18be73445", "103": "6ffbe07b521a061b", "104": "e114a7aebaaca2f1", "105": "0567be4dc8048b9c", "106": "8bc72c179793e1c2"}
{"0": "cd6fa4c897b52500", "1": "cb6ea50bd4e4a5ca", "2": "b159712c832c558e", "3": "1f737ca8edb978f2", "4": "56bf12952b0de42b", "5": "d50faa21d10efe9c", "6": "7162685b110caea8", "7": "325690c89d34f602", "8": "a689fcb62e7754af", "9": "1215838433447012", "10": "68c52c80f38f8b2c", "11": "7c739fd002680640", "12": "aeca274694e158d2", "13": "7e3b558a587a4ebe", "14": "bf75bfc99d4f9e34", "15": "bbd2902bccbcfc9c", "16": "95add6a975c0cb72", "17": "68c8c4a53446cb29", "18": "38bb0b185ceed116", "19": "39abb1eef19df707", "20": "aecf2fce44ba49c5", "21": "d4699b3ebc30431b", "22": "bb2dc34c7d87256a", "23": "90fac00055070ce2", "24": "f85b5b1634224c86", "25": "46e8db3e6e3f37ea", "26": "6039f82328197b7e", "27": "eab427ce9a5219e9", "28": "0018a4ff1d5fe668", "29": "c608f1c6492e1cb1", "30": "73c13793fca09f56", "31": "fbbcfc059751cc6a", "32": "f6bcf56c4589316b", "33": "75f750c5b7d9f63d", "34": "f024ff7942935690", "35": "0a737a97b7cae9fc", "36": "a7d375041779bad4", "37": "cb8f26249485324a", "38": "9a25b1230b5fe649", "39": "fdd95375b4a5ddb3", "40": "5e546676ab96de03", "41": "d96493a5f110bd4c", "42": "916170b9f5d7346b", "43": "4eaa3e8b9eed3bf1", "44": "852c1bb2446edd9c", "45": "92ab3e5134ed8685", "46": "65718282b3c32109", "47": "e594ecaa8e7d1538", "48": "cf2f2424bc00436f", "49": "1f976711cda158dc", "50": "bbb2b57d72922b16", "51": "eb6a182204867275", "52": "2ec3c8c088568ba9", "53": "68c45056378341a7", "54": "c58d41e8e580fdc6", "55": "a4d51d71a07be14b", "56": "9ee2ad45dc27851d", "57": "f2a40b5f1b29f669", "58": "55bfa752b54c63f4", "59": "891f59cda3708718", "60": "a505b7de6257a4e8", "61": "57344ed1fd5c260f", "62": "1366ae24c7e5897d", "63": "c256b43f75d7809e", "64": "ce0e68dab611f022", "65": "74ae017de0ffd36b", "66": "09b9b4b462ad944a", "67": "3e126d8deaf6e200", "68": "6b91f3679541de79", "69": "e511846eeba03076", "70": "af5864c4ac65160d", "71": "a2b13160223b5a98", "72": "c84f196a7bd35861", "73": "2b887bf601ccfb9f", "74": "ae2a154311e1f53a", "75": "69fdd23278518884", "76": "4880b6c8e510f062", "77": "d5ce16a18b491627", "78": "390555e7d7f0d203", "79": "c6cfdfe181232ecc", "80": "315325cde1352e98", "81": "37c559741825be74", "82": "315b401775d71d8e", "83": "1284897282eb47a3", "84": "d8bb296741d3d05c", "85": "4bc370be8afd7db1", "86": "8824c7a0092ee36e", "87": "e5fa7717989eda80", "88": "8b5ab5232cef3457", "89": "9e3363b80eeceeea", "90": "dd1c246e19a2d032", "91": "83b0fd3b14363e4d", "92": "fced244d93677d90", "93": "84a88fb74d1ce216", "94": "713d04996c4627df", "95": "5fec2bbca3634aec", "96": "1511ecae12413095", "97": "01f68dfc34a29d32", "98": "8c471c7baeaaca54", "99": "23f1d406f6c779ae", "100": "b8eb9c4c56ab3204", "101": "0c404de2055f9462", "102": "c96276581a8c98d4", "103": "6ffbe07b521a061b", "104": "e114a7aebaaca2f1", "105": "0567be4dc8048b9c", "106": "8bc72c179793e1c2", "107": "8d5f4e992bac9095"}
+100 -89
View File
@@ -1,16 +1,16 @@
# Graph Report - juzi (2026-10-12)
## Corpus Check
- 92 files · ~4,888,704 words
- 92 files · ~4,888,834 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1381 nodes · 2809 edges · 105 communities (82 shown, 23 thin omitted)
- 1382 nodes · 2810 edges · 108 communities (84 shown, 24 thin omitted)
- Extraction: 93% EXTRACTED · 7% INFERRED · 0% AMBIGUOUS · INFERRED: 189 edges (avg confidence: 0.54)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `e53c8095`
- Built from commit: `92a3965b`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -20,9 +20,9 @@
- app.js
- skin-score.js
- customer-feedback-second.js
- n
- extractFaceTensors
- .loadFromDisk
- r
- extractFaces
- customer-feedback-third.mjs
- admin.js
- __awaiter
- FaceLandmarks68
@@ -30,14 +30,14 @@
- server.js
- files
- .draw
- extractFaces
- getEnv
- 巨子测肤 · 1'me 在线肌肤测试 — UI 设计规范
- k
- 1'me 在线肌肤测试 H5
- customer-feedback-fourth.js
- build_fixtures.py
- disposeUnusedWeightTensors
- FaceExpressionNet
- AgeGenderNet
- facepp-skinanalyze(旷视皮肤分析专业版调用技能)
- 巨子测肤 · 1'me 语音播报内容设计文档 V1.0
- mobile-select.iife.min.js
@@ -56,7 +56,7 @@
- 第四轮反馈修改与验收
- NeuralNetwork
- layer_at
- normalize
- convLayer
- start-local.sh
- PredictAllAgeAndGenderWithFaceAlignmentTask
- PredictAllFaceExpressionsWithFaceAlignmentTask
@@ -76,24 +76,24 @@
- e2e-browser.mjs
- account-client.js
- 微信登录接入与公网部署说明
- report-persistence.mjs
- .div
- ui-20261009.mjs
- analyze-timeout.js
- misans/README.md
- extractConvParamsFactory
- AgeGenderNet
- .predictAgeAndGender
- build_report_copy.py
- .detect
- TinyYolov2Base
- drawFaceExpressions
- t
- n
- 登录反馈与加载优化(2026-10-12)
- 线上微信登录部署记录
- wechat-production.mjs
- wechat-browser.mjs
- .forwardInput
- 10.09 新版 H5 实施与验收
- 微信登录联调:2026-10-12
- test/accounts.js
- TinyFaceFeatureExtractor
- normalize
- 产品推荐规则:肤龄基准与边界调整
- ui-20261012/manifest.json
- 傅艳NEW与项思炼的会话 2026年10月12日.md
@@ -101,14 +101,17 @@
- 客户反馈修改(2026-10-12)
- .runAndExtendWithFaceDetections
- 第三轮反馈:PSD 对齐、验收及上线记录
- login-performance.mjs
- production-loop.mjs
- .forwardInput
- .run
- PredictSingleAgeAndGenderWithFaceAlignmentTask
- PredictSingleFaceExpressionsWithFaceAlignmentTask
- DetectSingleFaceLandmarksTask
- extractAllFacesAndComputeResults
- .toBatchTensor
- TinyYolov2
- 第四轮反馈/傅艳NEW与项思炼的会话 2026年10月12日.md
- 第三轮反馈20261012/傅艳NEW与项思炼的会话 2026年10月12日.md
- rescaleAndNormalize
## God Nodes (most connected - your core abstractions)
1. `__awaiter()` - 59 edges
@@ -137,11 +140,11 @@
## Import Cycles
- None detected.
## Communities (105 total, 23 thin omitted)
## Communities (108 total, 24 thin omitted)
### Community 0 - "face-api.js"
Cohesion: 0.02
Nodes (36): cn(), computeReshapedDimensions(), createBrowserEnv(), createFileSystem(), createNodejsEnv(), Dimensions(), dr(), en() (+28 more)
Nodes (34): boxPredictionLayer(), cn(), createBrowserEnv(), createFileSystem(), createNodejsEnv(), decodeBoxesLayer(), depthwiseConvLayer(), dr() (+26 more)
### Community 1 - "线上闭环测试(不含真实微信授权)"
Cohesion: 0.25
@@ -159,33 +162,29 @@ Nodes (45): acneGrade(), buildViewModel(), calcAcne(), calcContour(), calcSens()
Cohesion: 0.17
Nodes (10): assert, context, face, fs, geometry, original, path, source (+2 more)
### Community 5 - "n"
Cohesion: 0.11
Nodes (44): a(), ae(), bf(), cf(), d(), da(), drawContour(), dt() (+36 more)
### Community 5 - "r"
Cohesion: 0.14
Nodes (34): a(), ae(), bf(), cf(), d(), drawContour(), dt(), ea() (+26 more)
### Community 6 - "extractFaceTensors"
### Community 6 - "extractFaces"
Cohesion: 0.10
Nodes (9): bgrToRgbTensor(), Box(), DetectAllFaceLandmarksTask(), extendWithFaceLandmarks(), extractFaceTensors(), FaceLandmarks(), isDimensions(), minBbox() (+1 more)
Nodes (15): bgrToRgbTensor(), Box(), DetectAllFaceLandmarksTask(), Dimensions(), extendWithFaceLandmarks(), extractFaces(), extractFaceTensors(), imageTensorToCanvas() (+7 more)
### Community 7 - ".loadFromDisk"
Cohesion: 0.25
Nodes (4): ComposableTask(), getModelUris(), Gf(), TinyFaceDetector()
### Community 7 - "customer-feedback-third.mjs"
Cohesion: 0.14
Nodes (9): actualLines(), errors, guideLines, manifest, rect(), requests, root, widths (+1 more)
### Community 8 - "admin.js"
Cohesion: 0.20
Nodes (29): ageText(), api(), bind(), captureQualityHtml(), closeDetail(), collectFilters(), dimsHtml(), doRetry() (+21 more)
### Community 9 - "__awaiter"
Cohesion: 0.13
Nodes (13): __awaiter(), extendWithFaceExpressions(), extractSingleFaceAndComputeResult(), fetchImage(), fetchJson(), fetchNetWeights(), fetchOrThrow(), __generator() (+5 more)
### Community 10 - "FaceLandmarks68"
Cohesion: 0.19
Nodes (3): FaceLandmarks5(), FaceLandmarks68(), getCenterPoint()
Cohesion: 0.14
Nodes (13): __awaiter(), ComposableTask(), fetchImage(), fetchJson(), fetchNetWeights(), fetchOrThrow(), __generator(), getModelUris() (+5 more)
### Community 11 - "lib/accounts.js"
Cohesion: 0.17
Nodes (20): atomic(), body(), cookie(), cookies(), crypto, fs, json(), login() (+12 more)
Cohesion: 0.06
Nodes (37): atomic(), body(), cookie(), cookies(), crypto, fs, json(), login() (+29 more)
### Community 12 - "server.js"
Cohesion: 0.08
@@ -195,17 +194,17 @@ Nodes (52): accounts, appendRecord(), callFacepp(), CaptureDiagnostics, CRED, cr
Cohesion: 0.12
Nodes (15): files, analyze-fail, analyzing, countdown-321, hint-far, hint-front, hint-hold, hint-near (+7 more)
### Community 15 - "extractFaces"
Cohesion: 0.19
Nodes (18): awaitMediaLoaded(), bufferToImage(), createCanvas(), createCanvasFromMedia(), extractFaces(), extractImagePatches(), getContext2dOrThrow(), getEnv() (+10 more)
### Community 15 - "getEnv"
Cohesion: 0.27
Nodes (14): awaitMediaLoaded(), bufferToImage(), createCanvas(), createCanvasFromMedia(), extractImagePatches(), getContext2dOrThrow(), getEnv(), getMediaDimensions() (+6 more)
### Community 16 - "巨子测肤 · 1'me 在线肌肤测试 — UI 设计规范"
Cohesion: 0.15
Nodes (12): 1. 基准与尺寸换算, 2. 色彩规范, 3. 字体规范, 4. 组件切图(assets/svg/), 5. 图片素材(assets/images/,共 15 张), 6. 页面清单(design/ 下有整屏 PNG 预览), 7. 目录结构, 8. 还原建议 (+4 more)
### Community 17 - "k"
Cohesion: 0.17
Nodes (12): b(), ba(), gn(), k(), kn(), ne(), tt(), wo() (+4 more)
Cohesion: 0.15
Nodes (15): b(), ba(), ca(), da(), fa(), k(), ne(), pa() (+7 more)
### Community 18 - "1'me 在线肌肤测试 H5"
Cohesion: 0.13
@@ -220,8 +219,8 @@ Cohesion: 0.40
Nodes (9): build_case1(), build_case2(), build_truth(), col(), dump(), main(), parse_value(), set_path() (+1 more)
### Community 21 - "disposeUnusedWeightTensors"
Cohesion: 0.14
Nodes (23): disposeUnusedWeightTensors(), extractorsFactory$3(), extractorsFactory$5(), extractorsFactory$7(), extractorsFactory$9(), extractParamsFromWeigthMap(), extractParamsFromWeigthMap$1(), extractParamsFromWeigthMap$2() (+15 more)
Cohesion: 0.09
Nodes (24): disposeUnusedWeightTensors(), extractorsFactory$3(), extractorsFactory$5(), extractorsFactory$7(), extractorsFactory$9(), extractParamsFromWeigthMap(), extractParamsFromWeigthMap$1(), extractParamsFromWeigthMap$2() (+16 more)
### Community 23 - "facepp-skinanalyze(旷视皮肤分析专业版调用技能)"
Cohesion: 0.20
@@ -236,8 +235,8 @@ Cohesion: 0.20
Nodes (16): _arrayLikeToArray(), _arrayWithHoles(), _arrayWithoutHoles(), _classCallCheck(), _createClass(), _defineProperties(), h(), _iterableToArray() (+8 more)
### Community 26 - ".extractWeights"
Cohesion: 0.13
Nodes (15): createFaceDetectionNet(), createFaceRecognitionNet(), createMtcnn(), createSsdMobilenetv1(), createTinyFaceDetector(), createTinyYolov2(), extractFCParamsFactory(), extractorsFactory$2() (+7 more)
Cohesion: 0.12
Nodes (16): createFaceDetectionNet(), createFaceRecognitionNet(), createMtcnn(), createSsdMobilenetv1(), createTinyFaceDetector(), createTinyYolov2(), extractFCParamsFactory(), extractorsFactory$2() (+8 more)
### Community 27 - "gen_voice.py"
Cohesion: 0.30
@@ -245,7 +244,7 @@ Nodes (11): ndarray, Path, gen_countdown(), main(), normalize_clip(), 倒计时
### Community 28 - "C"
Cohesion: 0.09
Nodes (29): ao(), C(), cd(), cl(), co(), Do(), eo(), fo() (+21 more)
Nodes (34): ao(), Bo(), C(), cd(), cl(), co(), Do(), eo() (+26 more)
### Community 29 - "face-api.js 本地化依赖(h5/vendor/faceapi/)"
Cohesion: 0.29
@@ -260,8 +259,8 @@ Cohesion: 0.60
Nodes (4): main(), 递归缩放 result 内全部坐标:{left,top,width,height} 矩形与 {x,y} 点,与原数据同为整数。, scale_coords(), to_data_url()
### Community 35 - "customer-feedback.js"
Cohesion: 0.06
Nodes (27): alternate, approved, assert, crop, details, excellent, fs, model (+19 more)
Cohesion: 0.11
Nodes (18): alternate, approved, assert, crop, details, excellent, fs, model (+10 more)
### Community 37 - "UI 外发版 10.09 图片资源"
Cohesion: 0.40
@@ -272,16 +271,16 @@ Cohesion: 0.40
Nodes (4): 1meAI测肤旷视UI问题反馈, UI交互界面调整, 交互, **设计**
### Community 40 - "第四轮反馈修改与验收"
Cohesion: 0.25
Nodes (7): PSD 来源, 前端参数及限制, 后台校准留痕, 已确认并实现, 皱纹(紧塑力)原文, 第四轮反馈修改与验收, 验证
Cohesion: 0.22
Nodes (8): PSD 来源, 前端参数及限制, 后台校准留痕, 已确认并实现, 生产部署及只读验收, 皱纹(紧塑力)原文, 第四轮反馈修改与验收, 验证
### Community 42 - "layer_at"
Cohesion: 0.18
Nodes (11): list, bounds(), layer_at(), main(), save_image(), composite(), main(), sha256() (+3 more)
### Community 43 - "normalize"
Cohesion: 0.05
Nodes (37): boxPredictionLayer(), conv(), conv$1(), convDown(), convLayer(), convLayer$1(), convNoRelu(), convWithBatchNorm() (+29 more)
### Community 43 - "convLayer"
Cohesion: 0.23
Nodes (11): convLayer(), convWithBatchNorm(), depthwiseSeparableConv$1(), fullyConnectedLayer(), leaky(), ONet(), PNet(), prelu() (+3 more)
### Community 44 - "start-local.sh"
Cohesion: 0.50
@@ -304,8 +303,8 @@ Cohesion: 0.11
Nodes (17): 1. 结论和依据, 2. 统一比较口径, 3. 逐页差异和调整内容, 4. 报告数据如何接到新 UI, 5. 登录与“我的报告”的真实能力缺口, 6. 原稿中需要整理的内容, 7. 实施顺序与交付物, 8. 验收定义 (+9 more)
### Community 55 - "i"
Cohesion: 0.10
Nodes (24): bn(), ca(), dn(), ee(), Ef(), et(), fa(), fn() (+16 more)
Cohesion: 0.09
Nodes (22): bn(), dn(), ee(), Ef(), et(), fn(), i(), je() (+14 more)
### Community 56 - "report-ui.js"
Cohesion: 0.50
@@ -316,12 +315,8 @@ Cohesion: 0.60
Nodes (5): diffCtx(), loadJSON(), main(), okNum(), okStr()
### Community 58 - ".dispose"
Cohesion: 0.16
Nodes (12): extractBoundingBoxes(), FaceRecognitionNet(), getSizesForScale(), nonMaxSuppression(), normalize$1(), pyramidDown(), rescaleAndNormalize(), scale() (+4 more)
### Community 61 - "FaceProcessor"
Cohesion: 0.24
Nodes (3): extractParams$1(), FaceLandmark68TinyNet(), FaceProcessor()
Cohesion: 0.17
Nodes (12): computeReshapedDimensions(), extractBoundingBoxes(), iou(), isEven(), nonMaxSuppression(), nonMaxSuppression$1(), pyramidDown(), scale() (+4 more)
### Community 62 - "提交前 Review(2026-10-11)"
Cohesion: 0.40
@@ -339,29 +334,33 @@ Nodes (5): browser(), init(), read(), rememberKind(), request()
Cohesion: 0.22
Nodes (7): 公网服务器配置, 公网真机验收清单, 反向代理与后台保护, 已完成的链路, 微信登录接入与公网部署说明, 数据、迁移与备份, 本机开发环境限制(不代表线上状态)
### Community 66 - "report-persistence.mjs"
Cohesion: 0.29
Nodes (6): child, dataRoot, fx, h5, ReportUI, require
### Community 66 - ".div"
Cohesion: 0.21
Nodes (4): FaceLandmark68NetBase(), FaceLandmarks5(), getCenterPoint(), Point()
### Community 68 - "analyze-timeout.js"
Cohesion: 0.20
Nodes (7): assert, end, fs, path, source, start, vm
### Community 70 - "extractConvParamsFactory"
Cohesion: 0.28
Nodes (8): extractConvParamsFactory(), extractorsFactory(), extractorsFactory$1(), extractorsFactory$6(), extractParams(), extractParams$2(), extractParams$6(), extractSeparableConvParamsFactory()
Cohesion: 0.20
Nodes (9): extractConvParamsFactory(), extractorsFactory(), extractorsFactory$1(), extractorsFactory$6(), extractParams(), extractParams$2(), extractParams$6(), extractParamsTiny() (+1 more)
### Community 76 - ".detect"
Cohesion: 0.13
Nodes (8): iou(), isEven(), NetInput(), nonMaxSuppression$1(), sigmoid(), TinyYolov2(), TinyYolov2Base(), validateConfig()
### Community 71 - ".predictAgeAndGender"
Cohesion: 0.28
Nodes (4): extendWithAge(), extendWithGender(), PredictAllAgeAndGenderTask(), PredictSingleAgeAndGenderTask()
### Community 76 - "TinyYolov2Base"
Cohesion: 0.40
Nodes (3): sigmoid(), TinyYolov2Base(), validateConfig()
### Community 77 - "drawFaceExpressions"
Cohesion: 0.21
Nodes (9): DrawBox(), drawDetections(), drawFaceExpressions(), DrawFaceLandmarks(), FaceExpressions(), isWithFaceDetection(), isWithFaceExpressions(), isWithFaceLandmarks() (+1 more)
Cohesion: 0.22
Nodes (8): DrawBox(), drawDetections(), drawFaceExpressions(), DrawFaceLandmarks(), FaceExpressions(), isWithFaceDetection(), isWithFaceExpressions(), isWithFaceLandmarks()
### Community 78 - "t"
Cohesion: 0.12
Nodes (24): be(), bi(), Bo(), ce(), de(), e(), er(), fe() (+16 more)
### Community 78 - "n"
Cohesion: 0.10
Nodes (33): be(), bi(), ce(), de(), e(), er(), fe(), Ie() (+25 more)
### Community 79 - "登录反馈与加载优化(2026-10-12)"
Cohesion: 0.25
@@ -375,9 +374,9 @@ Nodes (6): 初次部署时的凭据查找记录(现已由用户提供), 初
Cohesion: 0.60
Nodes (4): api(), base, callback(), start()
### Community 82 - "wechat-browser.mjs"
Cohesion: 0.22
Nodes (6): createAccounts, h5, ReportUI, require, root, SkinScore
### Community 82 - ".forwardInput"
Cohesion: 0.31
Nodes (6): conv(), denseBlock4(), depthwiseSeparableConv(), mainBlock(), reductionBlock(), TinyXception()
### Community 83 - "10.09 新版 H5 实施与验收"
Cohesion: 0.29
@@ -391,6 +390,10 @@ Nodes (6): 后续真机确认与体验优化, 微信登录联调:2026-10-12,
Cohesion: 0.22
Nodes (9): assert, create, fs, http, os, path, ReportUI, SkinScore (+1 more)
### Community 86 - "normalize"
Cohesion: 0.20
Nodes (5): denseBlock3(), FaceFeatureExtractor(), normalize(), __spreadArrays(), TinyFaceFeatureExtractor()
### Community 87 - "产品推荐规则:肤龄基准与边界调整"
Cohesion: 0.33
Nodes (6): 产品推荐规则:肤龄基准与边界调整, 决策顺序, 后台与前端一致性, 实施与验证范围, 已明确的要求, 已确认的三个条件
@@ -408,34 +411,42 @@ Cohesion: 0.33
Nodes (5): 公网部署与复测, 客户反馈修改(2026-10-12), 皱纹数据说明, 逐项处理, 验证
### Community 93 - ".runAndExtendWithFaceDetections"
Cohesion: 0.21
Nodes (7): allFacesMtcnn(), allFacesSsdMobilenetv1(), allFacesTinyYolov2(), detectAllFaces(), DetectAllFacesTask(), DetectSingleFaceTask(), extendWithFaceDetection()
Cohesion: 0.19
Nodes (8): allFacesMtcnn(), allFacesSsdMobilenetv1(), allFacesTinyYolov2(), detectAllFaces(), DetectAllFacesTask(), DetectSingleFaceTask(), extendWithFaceDetection(), resizeResults()
### Community 94 - "第三轮反馈:PSD 对齐、验收及上线记录"
Cohesion: 0.33
Nodes (5): 原稿与导出可追溯性, 已完成, 本地验证, 生产部署及只读验收, 第三轮反馈:PSD 对齐、验收及上线记录
### Community 96 - "production-loop.mjs"
Cohesion: 0.50
Nodes (3): artifacts, errors, samples
### Community 95 - ".forwardInput"
Cohesion: 0.48
Nodes (6): conv$1(), convDown(), convLayer$1(), convNoRelu(), residual(), residualDown()
### Community 96 - ".run"
Cohesion: 0.29
Nodes (3): extendWithFaceExpressions(), PredictAllFaceExpressionsTask(), PredictSingleFaceExpressionsTask()
### Community 100 - "extractAllFacesAndComputeResults"
Cohesion: 0.12
Nodes (8): ComputeAllFaceDescriptorsTask(), ComputeSingleFaceDescriptorTask(), extendWithAge(), extendWithFaceDescriptor(), extendWithGender(), extractAllFacesAndComputeResults(), PredictAllAgeAndGenderTask(), PredictSingleAgeAndGenderTask()
Cohesion: 0.11
Nodes (8): ComputeAllFaceDescriptorsTask(), ComputeSingleFaceDescriptorTask(), extendWithFaceDescriptor(), extractAllFacesAndComputeResults(), extractSingleFaceAndComputeResult(), FaceLandmarks(), FaceRecognitionNet(), minBbox()
### Community 107 - "rescaleAndNormalize"
Cohesion: 0.67
Nodes (3): getSizesForScale(), normalize$1(), rescaleAndNormalize()
## Knowledge Gaps
- **284 isolated node(s):** `source`, `document_size`, `pages`, `assets`, `layers` (+279 more)
- **285 isolated node(s):** `source`, `document_size`, `pages`, `assets`, `layers` (+280 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **23 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **24 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `v()` connect `n` to `report-ui.js`, `face-api.js`, `app.js`, `C`?**
- **Why does `v()` connect `r` to `report-ui.js`, `face-api.js`, `app.js`, `C`?**
_High betweenness centrality (0.069) - this node is a cross-community bridge._
- **Why does `k()` connect `k` to `face-api.js`, `app.js`, `n`, `lib/accounts.js`, `t`, `i`?**
- **Why does `k()` connect `k` to `face-api.js`, `app.js`, `r`, `lib/accounts.js`, `n`, `C`?**
_High betweenness centrality (0.063) - this node is a cross-community bridge._
- **Why does `fill()` connect `report-ui.js` to `n`?**
- **Why does `fill()` connect `report-ui.js` to `r`?**
_High betweenness centrality (0.055) - this node is a cross-community bridge._
- **Are the 24 inferred relationships involving `n()` (e.g. with `newRecordId()` and `ae()`) actually correct?**
_`n()` has 24 INFERRED edges - model-reasoned connections that need verification._
@@ -444,4 +455,4 @@ _Questions this graph is uniquely positioned to answer:_
- **Are the 9 inferred relationships involving `i()` (e.g. with `da()` and `f()`) actually correct?**
_`i()` has 9 INFERRED edges - model-reasoned connections that need verification._
- **What connects `source`, `document_size`, `pages` to the rest of the system?**
_284 weakly-connected nodes found - possible documentation gaps or missing edges._
_285 weakly-connected nodes found - possible documentation gaps or missing edges._
File diff suppressed because one or more lines are too long
+546 -524
View File
File diff suppressed because it is too large Load Diff
+8 -8
View File
@@ -1625,8 +1625,8 @@
"semantic_hash": ""
},
"h5/test/customer-feedback.mjs": {
"mtime": 1791807197.0309076,
"ast_hash": "03ab67670a7091048dcf8804e10830dc",
"mtime": 1791807904.8348992,
"ast_hash": "6bc22a957a60d361c8350bbaa60f63ca",
"semantic_hash": ""
},
"feedback/\u5085\u8273NEW\u4e0e\u9879\u601d\u70bc\u7684\u4f1a\u8bdd 2026\u5e7410\u670812\u65e5/\u5085\u8273NEW\u4e0e\u9879\u601d\u70bc\u7684\u4f1a\u8bdd 2026\u5e7410\u670812\u65e5.md": {
@@ -1680,8 +1680,8 @@
"semantic_hash": ""
},
"h5/test/customer-feedback-second.mjs": {
"mtime": 1791792650.5151644,
"ast_hash": "2e340ce46b90c142341cb1f9636cb2e7",
"mtime": 1791807904.8348992,
"ast_hash": "169cedf52d8e32afc0c85cd68de2d0b1",
"semantic_hash": ""
},
"docs/\u5ba2\u6237\u53cd\u9988\u7b2c\u4e8c\u6279\u4fee\u6539-2026-10-12.md": {
@@ -1815,8 +1815,8 @@
"semantic_hash": ""
},
"h5/test/capture-quality-browser.mjs": {
"mtime": 1791807372.9989223,
"ast_hash": "a63b2d89c7a103dcd3d9e240f6423c4a",
"mtime": 1791807622.1829002,
"ast_hash": "e47f574f9e0254921d5f38be1e348b71",
"semantic_hash": ""
},
"h5/test/customer-feedback-fourth.js": {
@@ -1835,8 +1835,8 @@
"semantic_hash": ""
},
"docs/\u5ba2\u6237\u53cd\u9988\u7b2c\u56db\u8f6e\u4fee\u6539-2026-10-12.md": {
"mtime": 1791807372.9989223,
"ast_hash": "65ff64dac35dd7015251fb0ce0ab6617",
"mtime": 1791807904.8348992,
"ast_hash": "cf06ddce0c92fd331e89edfe663d0f81",
"semantic_hash": ""
},
"feedback/\u7b2c\u56db\u8f6e\u53cd\u9988/\u5085\u8273NEW\u4e0e\u9879\u601d\u70bc\u7684\u4f1a\u8bdd 2026\u5e7410\u670812\u65e5.md": {
+13 -5
View File
@@ -10,7 +10,9 @@ const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 375, height: 726 } });
page.setDefaultTimeout(60000);
const errors = []; page.on('pageerror', e => errors.push(e.message));
const errors = [], failedRequests = [];
page.on('pageerror', e => errors.push(e.message));
page.on('requestfailed', request => failedRequests.push({ path: new URL(request.url()).pathname, error: request.failure().errorText }));
await page.route('**/api/auth/session', route => route.fulfill({ json: { ok: true, user: { id: 'local-camera-fixture', kind: 'browser' } } }));
for (const name of ['C3_180.jpg', 'C3_135.jpg', 'C3_-135.jpg']) {
const body = fs.readFileSync(fileURLToPath(new URL('../../reference/facepp-skinanalyze/examples/images/' + name, import.meta.url)));
@@ -54,12 +56,18 @@ try {
try {
await page.waitForFunction(() => window.faceapi && faceapi.nets.faceLandmark68Net.isLoaded && document.querySelector('#s-cam').classList.contains('cam-live'));
} catch (error) {
console.log(await page.evaluate(() => ({ status: document.querySelector('#cam-status').textContent, hint: document.querySelector('#cam-hint').textContent, toast: document.querySelector('#toast').textContent, width: document.querySelector('#cam-video').videoWidth, classes: document.querySelector('#s-cam').className, engine: !!window.faceapi })), errors);
console.log(await page.evaluate(() => ({ status: document.querySelector('#cam-status').textContent, hint: document.querySelector('#cam-hint').textContent, toast: document.querySelector('#toast').textContent, width: document.querySelector('#cam-video').videoWidth, classes: document.querySelector('#s-cam').className, engine: !!window.faceapi })), errors, failedRequests);
throw error;
}
assert.equal(await page.locator('#s-cam.cam-manual').count(), 0, 'real automatic pipeline, not manual bypass');
await page.evaluate(() => {
window.__holdSamples = []; window.__hints = [];
window.__holdSamples = []; window.__hints = []; window.__evaluations = [];
const evaluate = CaptureQuality.evaluate;
CaptureQuality.evaluate = function(d, options) {
const result = evaluate(d, options);
window.__evaluations.push({ target: options.target, ok: result.ok, hint: result.hint });
return result;
};
const hold = CaptureQuality.hold;
CaptureQuality.hold = function(state, obs, now) {
const result = hold(state, obs, now);
@@ -79,11 +87,11 @@ try {
ratio: window.__dbgRatio, faces: faces.map(d => ({ score: d.detection.score, pose: HeadPose.estimate(d.landmarks.positions, false), box: d.detection.box })), holds: window.__holdSamples, hints: window.__hints };
}).then(value => JSON.stringify(value, null, 2)), errors); throw error;
}
await page.waitForTimeout(1000);
await page.waitForFunction(() => window.__evaluations.some(row => row.target === 'right' && !row.ok));
assert((await page.locator('#cam-step').textContent()).includes('2/3'), 'front photo cannot pass the side gate');
await page.evaluate(() => window.__cameraFixture.set('C3_135.jpg'));
await page.waitForFunction(() => document.querySelector('#cam-step').textContent.includes('3/3'));
await page.waitForTimeout(800);
await page.waitForFunction(() => window.__evaluations.some(row => row.target === 'left' && !row.ok));
assert((await page.locator('#cam-step').textContent()).includes('3/3'), 'wrong-direction side cannot pass');
const sent = page.waitForRequest(r => r.url().endsWith('/api/skin-analyze'));
await page.evaluate(() => window.__cameraFixture.set('C3_-135.jpg'));
+1
View File
@@ -10,6 +10,7 @@ const artifacts = process.env.H5_ARTIFACT_DIR;
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 375, height: 726 }, isMobile: true, hasTouch: true });
page.setDefaultTimeout(60000); // Match the production-facing third-round suite.
const errors = [], requests = [];
page.on('pageerror', e => errors.push(e.message));
page.on('request', r => requests.push(new URL(r.url()).pathname));
+1
View File
@@ -9,6 +9,7 @@ const base = process.env.H5_BASE_URL || 'http://127.0.0.1:8080/';
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 375, height: 726 }, isMobile: true, hasTouch: true });
page.setDefaultTimeout(60000); // Cold public-site font downloads can exceed 30s.
const errors = [];
page.on('pageerror', e => errors.push(e.message));
await page.goto(base + '?mock=1&screen=report');