业务本体与标准实体:跨源键值对齐、对账共变算子、健康证据链与实体助手

- 新增标准业务实体(CanonicalEntity)模型、确定性跨源编码翻译、后台候选实体扫描与文档驱动实体智能助手
- 新增指标本体图谱(factor / reconciles_with / upstream_driver)、DAG 防环校验以及 ontology_neighbors / source_health 内置工具
- 新增跨源对账(analysis_reconcile)与滞后共变(analysis_cochange)分析算子,打通 [[h:H1]] 数据源健康证据链、报告导出与本体消融评测
- 数据目录新增「标准业务实体」视图与候选审阅工作台,口径页集成指标本体拓扑面板与端到端浏览器检查
This commit is contained in:
ThearchyHelios
2026-11-12 12:57:53 +08:00
parent 2f90f0eb3a
commit 8d9a712eae
106 changed files with 16654 additions and 295 deletions
+10 -4
View File
@@ -92,6 +92,7 @@ async function open({ theme = 'dark', state }) {
// 主题以本地为准,别让沙箱库里存的偏好把这次检查的主题改掉
if (url.pathname === '/api/settings') return route.fulfill({ json: { ui: { theme } } })
if (url.pathname === '/api/approvals') return route.fulfill({ json: state.approvals })
if (url.pathname === '/api/workflows' && state.workflows) return route.fulfill({ json: state.workflows })
// 导航上的两个徽标按来源分开数:「记录」数不属于应用的(other),「应用」数应用里的(apps)。这里的待审批都不属于应用。
// latest 同服务端:派给我的待处理待办里最新一条的开出时间(数不变、却换了一条时,新待办通知看它)
if (url.pathname === '/api/tasks/count') {
@@ -194,13 +195,13 @@ await section('导航', '=== 导航 ===', async () => {
for (const end = Date.now() + 3000; !(await lit()).startsWith('数据') && Date.now() < end;) await page.waitForTimeout(100)
check('数据页点亮「数据」', (await lit()).startsWith('数据'), await lit())
// 矮窗口:导航按高度收紧,最底下的遥测点和署名不能被切掉(十个导航项:600、520、480 三种高度各量一遍)
// 矮窗口:导航按高度收紧,最底下的遥测点和署名不能被切掉(十一个导航项:700、600、520、480 四种高度各量一遍)
const bottomFits = () => page.evaluate(() => {
const n = document.querySelector('nav[aria-label="主导航"]')
const t = document.querySelector('[data-telemetry]').getBoundingClientRect()
return { ok: n.scrollHeight <= innerHeight && t.bottom <= innerHeight, tel: Math.round(t.bottom), vh: innerHeight }
})
for (const h of [600, 520, 480]) {
for (const h of [700, 600, 520, 480]) {
await page.setViewportSize({ width: 1280, height: h })
await page.waitForTimeout(150)
const fit = await bottomFits()
@@ -404,7 +405,12 @@ await section('标签页标题', '\n=== 标签页标题、favicon、后台提醒
// ---------------------------------------------------------------------------
await section('⌘K 命令面板', '\n=== ⌘K 命令面板 ===', async () => {
const state = { approvals: PENDING, offline: false, writes: [] }
// 搜索“设置”时保留第二个匹配结果,才能检出旧选中索引误执行工作流的问题。
const realWorkflows = await (await fetch(`${WEB}/api/workflows`)).json().catch(() => [])
const state = { approvals: PENDING, offline: false, writes: [], workflows: [
...realWorkflows,
{ id: 'shell-settings-workflow', name: '设置流程说明', description: '设置相关流程', updated_at: ago(1000) },
] }
const { ctx, page } = await open({ state })
await page.goto(`${WEB}/runs`)
await waitNav(page)
@@ -428,7 +434,7 @@ await section('⌘K 命令面板', '\n=== ⌘K 命令面板 ===', async () => {
await input.fill('设置')
const first = dialog.locator('[role="option"][aria-selected="true"]')
check('搜「设置」第一项就是设置页', (await first.innerText()).startsWith('设置'), (await first.innerText()).split('\n')[0])
check('搜「设置」立即选中设置页,不能沿用旧结果索引', await first.getAttribute('data-command') === 'page:/settings', (await first.innerText()).split('\n')[0])
await page.keyboard.press('Enter')
check('回车跳过去、面板关掉', await page.waitForURL(/\/settings/, { timeout: 5000 }).then(() => true, () => false)
&& !(await dialog.isVisible()), page.url())