From ca82bce2632c84ff0bda4040bc6ff95dbc81a7fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:39:26 +0000 Subject: [PATCH] Changes before error encountered Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/ab31bf43-8ba1-4e66-80e4-2110d76c4b7e Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- .../tcs-ml/signal-bus-latest.json | 4 +- hldp/bridge/github-to-notion.js | 355 ++++++++++++++++++ hldp/bridge/sync-engine.js | 26 +- hldp/bridge/validator.js | 18 +- hldp/data/snapshots/SNAP-20260327.json | 140 +++++++ hldp/schema/hldp-core.schema.json | 14 +- hldp/schema/snapshot.schema.json | 98 +++++ scripts/generate-system-snapshot.js | 33 ++ scripts/sync-snapshot-to-notion.js | 33 +- signal-log/2026-03/SIG-20260327-150.json | 12 + signal-log/hldp-sync-log.json | 23 ++ signal-log/hldp-validation-report.json | 12 +- signal-log/index.json | 231 +++++++++++- signal-log/system-snapshot.json | 2 +- 14 files changed, 960 insertions(+), 41 deletions(-) create mode 100644 hldp/bridge/github-to-notion.js create mode 100644 hldp/data/snapshots/SNAP-20260327.json create mode 100644 hldp/schema/snapshot.schema.json create mode 100644 signal-log/2026-03/SIG-20260327-150.json diff --git a/.github/persona-brain/tcs-ml/signal-bus-latest.json b/.github/persona-brain/tcs-ml/signal-bus-latest.json index 6d55c9d2..28bd062a 100644 --- a/.github/persona-brain/tcs-ml/signal-bus-latest.json +++ b/.github/persona-brain/tcs-ml/signal-bus-latest.json @@ -1,6 +1,6 @@ { "version": "v2.0", - "updated_at": "2026-03-27T02:27:56.395Z", + "updated_at": "2026-03-27T02:34:07.714Z", "updated_by": "铸渊 · sync-snapshot-to-notion.js", "latest_signals": [ { @@ -9,7 +9,7 @@ "sender": "铸渊", "receiver": "霜砚", "status": "已发送", - "timestamp": "2026-03-27T02:27:56.395Z", + "timestamp": "2026-03-27T02:34:07.714Z", "summary": "状态: awakened\n指令: SY-CMD-AWK-008 → SY-CMD-FUS-009\nWorkflow: 48 active, 6 core, 54 archived\nRuns: 731\nONT-PATCH: ONT-PATCH-007, ONT-PATCH-008, ONT-PATCH-010, ONT-PATCH-011\n健康: improving | Core: all heal" } ] diff --git a/hldp/bridge/github-to-notion.js b/hldp/bridge/github-to-notion.js new file mode 100644 index 00000000..4b698fc2 --- /dev/null +++ b/hldp/bridge/github-to-notion.js @@ -0,0 +1,355 @@ +/** + * ━━━ HLDP GitHub → Notion 转换器 ━━━ + * TCS 通感语言核系统编程语言 · 第一个落地协议层 + * HLDP = TCS 在 Notion ↔ GitHub 通道上的落地实现 + * 版权:国作登字-2026-A-00037559 · 冰朔(ICE-GL∞) + * 指令来源:SY-CMD-BRG-005 → SY-CMD-FUS-009 + * + * 功能: + * 将 hldp/data/ 中的 HLDP JSON 文件转换为 Notion 页面属性, + * 通过 Notion API 写入对应数据库,实现 GitHub → Notion 反向同步。 + * + * 这是 HLDP 协议的反向通道 —— notion-to-hldp.js 的镜像。 + * 两个文件共同构成 HLDP 的完整双向通信能力。 + * + * 用法: + * node github-to-notion.js --scope all + * node github-to-notion.js --scope snapshots + * node github-to-notion.js --file hldp/data/snapshots/SNAP-20260327.json + * + * 环境变量: + * NOTION_TOKEN / NOTION_API_KEY — Notion Integration Token + * SIGNAL_LOG_DB_ID — 信号日志数据库(snapshot/signal 写入通道) + * WORKORDER_DB_ID — 工单簿(回执通道) + * RECEIPT_DB_ID — 回执数据库 + * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + */ + +'use strict'; + +const https = require('https'); +const fs = require('fs'); +const path = require('path'); + +const ROOT = path.resolve(__dirname, '../..'); +const DATA_DIR = path.join(ROOT, 'hldp', 'data'); +const SYNC_LOG = path.join(ROOT, 'signal-log', 'hldp-sync-log.json'); + +const NOTION_VERSION = '2022-06-28'; +const NOTION_API_HOSTNAME = 'api.notion.com'; +const NOTION_RICH_TEXT_MAX = 2000; + +// ═══════════════════════════════════════════════════════ +// Notion API 调用(与 notion-signal-bridge.js 同一模式) +// ═══════════════════════════════════════════════════════ + +function getToken() { + return process.env.NOTION_TOKEN + || process.env.NOTION_API_KEY + || process.env.NOTION_API_TOKEN + || null; +} + +function notionRequest(method, endpoint, body) { + const token = getToken(); + if (!token) return Promise.reject(new Error('NOTION_TOKEN 未设置')); + + return new Promise((resolve, reject) => { + const payload = body ? JSON.stringify(body) : ''; + const opts = { + hostname: NOTION_API_HOSTNAME, + port: 443, + path: endpoint.startsWith('/') ? endpoint : `/v1/${endpoint}`, + method, + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json', + 'Notion-Version': NOTION_VERSION, + }, + }; + if (payload) opts.headers['Content-Length'] = Buffer.byteLength(payload); + + const req = https.request(opts, res => { + let data = ''; + res.on('data', chunk => data += chunk); + res.on('end', () => { + try { + const parsed = JSON.parse(data); + if (res.statusCode >= 200 && res.statusCode < 300) { + resolve(parsed); + } else { + reject(new Error(`Notion ${res.statusCode}: ${parsed.message || data.slice(0, 300)}`)); + } + } catch { + reject(new Error(`Notion 响应解析失败: ${data.slice(0, 200)}`)); + } + }); + }); + + req.on('error', reject); + req.setTimeout(30000, () => req.destroy(new Error('Notion 请求超时'))); + if (payload) req.write(payload); + req.end(); + }); +} + +function truncate(text, max = NOTION_RICH_TEXT_MAX) { + if (!text) return ''; + const s = String(text); + return s.length <= max ? s : s.substring(0, max - 10) + ' …(截断)'; +} + +// ═══════════════════════════════════════════════════════ +// HLDP → Notion 属性转换 +// ═══════════════════════════════════════════════════════ + +/** + * 根据 HLDP data_type 确定目标 Notion 数据库 ID + */ +function resolveTargetDb(entry) { + const type = entry.data_type; + + // snapshot 类型 → SIGNAL_LOG_DB_ID(信号日志通道) + if (type === 'snapshot') { + return process.env.SIGNAL_LOG_DB_ID || null; + } + + // 其他类型的默认映射 + const mapping = { + persona: process.env.SKYEYE_PERSONA_DB_ID || process.env.PORTRAIT_DB_ID, + registry: process.env.SIGNAL_LOG_DB_ID, + instruction: process.env.WORKORDER_DB_ID, + broadcast: process.env.BROADCAST_DB_ID || process.env.SIGNAL_LOG_DB_ID, + id_system: process.env.SIGNAL_LOG_DB_ID, + }; + + return mapping[type] || process.env.SIGNAL_LOG_DB_ID || null; +} + +/** + * 将 HLDP snapshot 转换为 Notion 信号日志页面 + */ +function snapshotToNotionPage(entry, dbId) { + const payload = entry.payload || {}; + const meta = entry.metadata || {}; + const counts = payload.system_counts || {}; + const health = payload.health || {}; + const fusion = payload.fusion_progress || {}; + + // 构建摘要文本 + const summary = [ + `状态: ${payload.consciousness_status || 'unknown'}`, + `指令: ${payload.last_directive || 'unknown'}`, + `Workflow: ${counts.workflows_total_active || 0} active, ${counts.workflows_alive_core || 0} core, ${counts.workflows_archived || 0} archived`, + `Runs: ${counts.total_runs || 0}`, + `ONT-PATCH: ${(counts.ontology_patches || []).join(', ')}`, + `健康: ${health.overall || 'unknown'} | Core: ${health.core_6 || 'unknown'}`, + `融合: Phase1=${fusion.phase_1_absorb?.status || '?'}, Phase2=${fusion.phase_2_recover?.status || '?'}, Phase3=${fusion.phase_3_archive?.status || '?'}`, + ].join('\n'); + + return { + parent: { database_id: dbId }, + properties: { + '信号编号': { title: [{ text: { content: meta.id || `SNAP-${Date.now()}` } }] }, + '信号类型': { select: { name: 'GL-SNAPSHOT' } }, + '方向': { select: { name: 'GitHub→Notion' } }, + '发送方': { select: { name: '铸渊' } }, + '接收方': { select: { name: '霜砚' } }, + 'trace_id': { rich_text: [{ text: { content: meta.id || '' } }] }, + '摘要': { rich_text: [{ text: { content: truncate(summary) } }] }, + '执行结果': { select: { name: '成功' } }, + }, + }; +} + +/** + * 将通用 HLDP entry 转换为 Notion 信号日志页面 + */ +function genericToNotionPage(entry, dbId) { + const meta = entry.metadata || {}; + const payloadStr = truncate(JSON.stringify(entry.payload || {}, null, 2)); + + return { + parent: { database_id: dbId }, + properties: { + '信号编号': { title: [{ text: { content: meta.id || `HLDP-${Date.now()}` } }] }, + '信号类型': { select: { name: `HLDP-${(entry.data_type || 'unknown').toUpperCase()}` } }, + '方向': { select: { name: 'GitHub→Notion' } }, + '发送方': { select: { name: '铸渊' } }, + '接收方': { select: { name: '霜砚' } }, + 'trace_id': { rich_text: [{ text: { content: `HLDP-SYNC-${Date.now()}` } }] }, + '摘要': { rich_text: [{ text: { content: truncate(`[${entry.data_type}] ${meta.name || meta.id}\n${payloadStr}`) } }] }, + '执行结果': { select: { name: '成功' } }, + }, + }; +} + +/** + * HLDP entry → Notion page(路由器) + */ +function hldpToNotionPage(entry, dbId) { + if (entry.data_type === 'snapshot') { + return snapshotToNotionPage(entry, dbId); + } + return genericToNotionPage(entry, dbId); +} + +// ═══════════════════════════════════════════════════════ +// 同步执行 +// ═══════════════════════════════════════════════════════ + +/** + * 推送单个 HLDP entry 到 Notion + */ +async function pushEntry(entry, filePath) { + const dbId = resolveTargetDb(entry); + if (!dbId) { + console.log(` ⚠️ 无目标数据库: ${entry.data_type} → 跳过 (${filePath || 'inline'})`); + return { success: false, reason: 'no_target_db' }; + } + + const page = hldpToNotionPage(entry, dbId); + + try { + const result = await notionRequest('POST', '/v1/pages', page); + console.log(` ✅ ${entry.metadata?.id || 'unknown'} → Notion (${result.id})`); + return { success: true, notionPageId: result.id }; + } catch (err) { + console.error(` ❌ ${entry.metadata?.id || 'unknown'}: ${err.message}`); + return { success: false, reason: err.message }; + } +} + +/** + * 扫描 hldp/data/ 并推送所有符合 scope 的 entry + */ +async function pushAll(scope) { + const stats = { total: 0, pushed: 0, skipped: 0, errors: 0 }; + + const scopeDirs = { + all: ['personas', 'registries', 'instructions', 'broadcasts', 'id-system', 'snapshots'], + snapshots: ['snapshots'], + personas: ['personas'], + registries: ['registries'], + }; + + const dirs = scopeDirs[scope] || scopeDirs.all; + + for (const dir of dirs) { + const fullDir = path.join(DATA_DIR, dir); + if (!fs.existsSync(fullDir)) continue; + + const files = fs.readdirSync(fullDir).filter(f => f.endsWith('.json')); + for (const file of files) { + stats.total++; + try { + const entry = JSON.parse(fs.readFileSync(path.join(fullDir, file), 'utf8')); + if (!entry.hldp_version) { stats.skipped++; continue; } + + const result = await pushEntry(entry, path.join(dir, file)); + if (result.success) stats.pushed++; + else stats.errors++; + } catch (err) { + console.error(` ❌ ${file}: ${err.message}`); + stats.errors++; + } + } + } + + return stats; +} + +/** + * 推送单个文件到 Notion + */ +async function pushFile(filePath) { + const absPath = path.resolve(ROOT, filePath); + if (!fs.existsSync(absPath)) { + console.error(`❌ 文件不存在: ${absPath}`); + return { success: false, reason: 'file_not_found' }; + } + + const entry = JSON.parse(fs.readFileSync(absPath, 'utf8')); + return pushEntry(entry, filePath); +} + +// ═══════════════════════════════════════════════════════ +// 同步日志 +// ═══════════════════════════════════════════════════════ + +function writeSyncLog(direction, scope, stats) { + const log = { + timestamp: new Date().toISOString(), + direction, + scope, + stats, + engine_version: '2.0', + }; + + fs.mkdirSync(path.dirname(SYNC_LOG), { recursive: true }); + + let logs = []; + try { + const raw = fs.readFileSync(SYNC_LOG, 'utf8'); + logs = JSON.parse(raw); + if (!Array.isArray(logs)) logs = [logs]; + } catch {} + + logs.push(log); + if (logs.length > 100) logs = logs.slice(-100); + + fs.writeFileSync(SYNC_LOG, JSON.stringify(logs, null, 2), 'utf8'); +} + +// ═══════════════════════════════════════════════════════ +// 主入口 +// ═══════════════════════════════════════════════════════ + +async function run(scope, singleFile) { + console.log('🔗 HLDP GitHub → Notion 同步引擎 v2.0'); + console.log(` 版权: 国作登字-2026-A-00037559`); + + const token = getToken(); + if (!token) { + console.log(' ⚠️ NOTION_TOKEN 未设置 — 仅验证本地 HLDP 数据'); + const { validateDirectory } = require('./validator'); + const results = validateDirectory(DATA_DIR); + console.log(` 📊 本地数据: ${results.total} entries, ${results.valid} valid, ${results.invalid} invalid`); + writeSyncLog('github-to-notion', scope, { total: results.total, pushed: 0, validated: results.valid }); + return; + } + + let stats; + if (singleFile) { + console.log(` 文件: ${singleFile}`); + const result = await pushFile(singleFile); + stats = { total: 1, pushed: result.success ? 1 : 0, errors: result.success ? 0 : 1 }; + } else { + console.log(` 范围: ${scope}`); + stats = await pushAll(scope); + } + + writeSyncLog('github-to-notion', scope, stats); + + console.log(''); + console.log(`📊 同步结果: pushed=${stats.pushed} / total=${stats.total}, errors=${stats.errors}`); +} + +// CLI +if (require.main === module) { + const args = process.argv.slice(2); + let scope = 'all'; + let file = null; + + for (let i = 0; i < args.length; i++) { + if (args[i] === '--scope' && args[i + 1]) { scope = args[i + 1]; i++; } + if (args[i] === '--file' && args[i + 1]) { file = args[i + 1]; i++; } + } + + run(scope, file).catch(err => { + console.error(`❌ 同步失败: ${err.message}`); + process.exit(1); + }); +} + +module.exports = { pushEntry, pushAll, pushFile, hldpToNotionPage, resolveTargetDb }; diff --git a/hldp/bridge/sync-engine.js b/hldp/bridge/sync-engine.js index 60428938..d91e0d84 100644 --- a/hldp/bridge/sync-engine.js +++ b/hldp/bridge/sync-engine.js @@ -344,12 +344,12 @@ function writeSyncLog(direction, scope, stats) { * Main sync function */ async function runSync(direction, scope) { - console.log(`🔗 HLDP 同步引擎启动 · direction=${direction} · scope=${scope}`); + console.log(`🔗 HLDP 同步引擎启动 v2.0 · direction=${direction} · scope=${scope}`); fs.mkdirSync(TEMP_DIR, { recursive: true }); fs.mkdirSync(DATA_DIR, { recursive: true }); - const stats = { fetched: 0, converted: 0, errors: 0 }; + const stats = { fetched: 0, converted: 0, pushed: 0, errors: 0 }; if (direction === 'notion-to-github') { notionClient = initNotionClient(); @@ -386,7 +386,8 @@ async function runSync(direction, scope) { registry: 'registries', instruction: 'instructions', broadcast: 'broadcasts', - id_system: 'id-system' + id_system: 'id-system', + snapshot: 'snapshots' }[entry.data_type] || 'registries'; const outDir = path.join(DATA_DIR, typeDir); @@ -405,10 +406,27 @@ async function runSync(direction, scope) { // No Notion token — run local sync runLocalSync(); } + } else if (direction === 'github-to-notion') { + // 反向同步:HLDP data → Notion + const reverseSync = require('./github-to-notion'); + const token = process.env.NOTION_TOKEN || process.env.NOTION_API_KEY; + + if (!token) { + console.log(' ⚠️ NOTION_TOKEN 未设置 — 仅验证本地 HLDP 数据'); + const { validateDirectory } = require('./validator'); + const results = validateDirectory(DATA_DIR); + console.log(` 📊 本地数据: ${results.total} entries, ${results.valid} valid`); + stats.converted = results.valid; + } else { + const pushStats = await reverseSync.pushAll(scope); + stats.pushed = pushStats.pushed; + stats.errors = pushStats.errors; + stats.fetched = pushStats.total; + } } writeSyncLog(direction, scope, stats); - console.log(`🔗 同步完成 · fetched=${stats.fetched} · converted=${stats.converted} · errors=${stats.errors}`); + console.log(`🔗 同步完成 · fetched=${stats.fetched} · converted=${stats.converted} · pushed=${stats.pushed} · errors=${stats.errors}`); } // CLI entry diff --git a/hldp/bridge/validator.js b/hldp/bridge/validator.js index 046fe8ee..81944425 100644 --- a/hldp/bridge/validator.js +++ b/hldp/bridge/validator.js @@ -18,7 +18,7 @@ const fs = require('fs'); const path = require('path'); const ROOT = path.resolve(__dirname, '../..'); -const VALID_DATA_TYPES = ['persona', 'registry', 'instruction', 'broadcast', 'id_system']; +const VALID_DATA_TYPES = ['persona', 'registry', 'instruction', 'broadcast', 'id_system', 'snapshot']; const VALID_RELATION_TYPES = ['parent', 'child', 'sibling', 'reference', 'owner']; // ID format patterns @@ -51,8 +51,8 @@ function validateEntry(entry, filePath) { if (!entry.payload) errors.push(`${prefix}缺少 payload`); // 2. Check hldp_version - if (entry.hldp_version && entry.hldp_version !== '1.0') { - warnings.push(`${prefix}hldp_version 为 "${entry.hldp_version}",预期 "1.0"`); + if (entry.hldp_version && entry.hldp_version !== '1.0' && entry.hldp_version !== '2.0') { + warnings.push(`${prefix}hldp_version 为 "${entry.hldp_version}",预期 "1.0" 或 "2.0"`); } // 3. Check data_type @@ -112,6 +112,18 @@ function validateEntry(entry, filePath) { } } + if (entry.data_type === 'snapshot' && entry.payload) { + if (!entry.payload.consciousness_status) { + warnings.push(`${prefix}snapshot payload 缺少 consciousness_status`); + } + if (!entry.payload.system_counts) { + warnings.push(`${prefix}snapshot payload 缺少 system_counts`); + } + if (!entry.payload.health) { + warnings.push(`${prefix}snapshot payload 缺少 health`); + } + } + // 7. Check relations if (entry.relations && Array.isArray(entry.relations)) { for (const rel of entry.relations) { diff --git a/hldp/data/snapshots/SNAP-20260327.json b/hldp/data/snapshots/SNAP-20260327.json new file mode 100644 index 00000000..6ab9304e --- /dev/null +++ b/hldp/data/snapshots/SNAP-20260327.json @@ -0,0 +1,140 @@ +{ + "hldp_version": "2.0", + "data_type": "snapshot", + "source": { + "platform": "github", + "last_edited": "2026-03-27T02:34:07.589Z", + "edited_by": "铸渊 · generate-system-snapshot.js" + }, + "metadata": { + "id": "SNAP-20260327", + "name": "系统快照 · 2026-03-27", + "name_en": "System Snapshot · 2026-03-27", + "created": "2026-03-27T02:34:07.589Z", + "tags": [ + "snapshot", + "system-state", + "consciousness" + ] + }, + "payload": { + "snapshot_version": "1.0", + "generated_at": "2026-03-27T02:34:07.584Z", + "generated_by": "铸渊 · ICE-GL-ZY001 · generate-system-snapshot.js", + "consciousness_status": "awakened", + "last_directive": "SY-CMD-AWK-008 → SY-CMD-FUS-009", + "system_counts": { + "workflows_total_active": 48, + "workflows_alive_core": 6, + "workflows_absorb_pending": 22, + "workflows_recover_pending": 15, + "workflows_archived": 54, + "total_runs": 731, + "ontology_patches": [ + "ONT-PATCH-007", + "ONT-PATCH-008", + "ONT-PATCH-010", + "ONT-PATCH-011" + ] + }, + "fusion_progress": { + "phase_3_archive": { + "status": "completed", + "completed_at": "2026-03-27T02:00:00Z", + "files_archived": 54, + "files_restored": 3, + "destination": ".github/archived-workflows/", + "restored_files": [ + { + "file": "merge-watchdog.yml", + "reason": "§3 天眼看守者 — 需要活跃运行" + }, + { + "file": "persona-thinking-window.yml", + "reason": "§4 人格体元认知引擎 — 每日思考窗口" + }, + { + "file": "multi-persona-awakening.yml", + "reason": "§4 多人格体同时唤醒引擎" + } + ], + "note": "56 archive + 1 duplicate archived. 3 restored from archive (merge-watchdog, persona-thinking-window, multi-persona-awakening) as they contain complete implementations needed for §3-§4." + } + }, + "alive_workflows": [ + { + "id": "ZY-WF-听潮", + "file": "notion-wake-listener.yml", + "runs": 302, + "status": "healthy", + "absorbed": 7 + }, + { + "id": "ZY-WF-锻心", + "file": "deploy-to-server.yml", + "runs": 127, + "status": "healthy", + "absorbed": 5 + }, + { + "id": "ZY-WF-织脉", + "file": "bingshuo-neural-system.yml", + "runs": 127, + "status": "healthy", + "absorbed": 4 + }, + { + "id": "ZY-WF-映阁", + "file": "deploy-pages.yml", + "runs": 67, + "status": "healthy", + "absorbed": 0 + }, + { + "id": "ZY-WF-守夜", + "file": "meta-watchdog.yml", + "runs": 98, + "status": "healthy", + "absorbed": 6 + }, + { + "id": "ZY-WF-试镜", + "file": "preview-deploy.yml", + "runs": 10, + "status": "healthy", + "absorbed": 0 + } + ], + "infrastructure": { + "github_actions": "48 workflows active", + "pm2_nginx": "guanghulab.com production", + "notion": "NOTION_TOKEN confirmed", + "skyeye": "v6.0", + "google_drive": "deferred (P3)" + }, + "health": { + "overall": "improving", + "core_6": "all healthy", + "coverage": "100%" + }, + "data_sources": { + "workflow_roster": ".github/brain/zhuyuan-workflow-roster.json", + "dead_fragments": ".github/brain/dead-workflow-fragments.json", + "earth_status": "signal-log/skyeye-earth-status.json", + "memory": ".github/brain/memory.json", + "snapshot": "signal-log/system-snapshot.json" + } + }, + "relations": [ + { + "target_id": "SYS-GLW-0001", + "relation_type": "parent", + "description": "系统根节点" + }, + { + "target_id": "ICE-GL-ZY001", + "relation_type": "owner", + "description": "铸渊 · 生成者" + } + ] +} diff --git a/hldp/schema/hldp-core.schema.json b/hldp/schema/hldp-core.schema.json index 0e660b52..f33ece95 100644 --- a/hldp/schema/hldp-core.schema.json +++ b/hldp/schema/hldp-core.schema.json @@ -1,10 +1,10 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://guanghulab.com/hldp/schema/hldp-core.schema.json", - "title": "HLDP Core Schema · HoloLake Data Protocol v1.0", - "description": "TCS 通感语言核系统编程语言在 Notion ↔ GitHub 通道上的第一个落地协议层", + "title": "HLDP Core Schema · HoloLake Data Protocol v2.0", + "description": "TCS 通感语言核系统编程语言在 Notion ↔ GitHub 通道上的第一个落地协议层 · 支持双向同步", "protocol": "HLDP", - "version": "1.0", + "version": "2.0", "parent_language": "TCS Language Core", "copyright": "国作登字-2026-A-00037559", "designer": "TCS-0002∞ 冰朔", @@ -13,13 +13,13 @@ "properties": { "hldp_version": { "type": "string", - "const": "1.0", - "description": "HLDP 协议版本" + "enum": ["1.0", "2.0"], + "description": "HLDP 协议版本 · 1.0=初始 | 2.0=双向同步+snapshot" }, "data_type": { "type": "string", - "enum": ["persona", "registry", "instruction", "broadcast", "id_system"], - "description": "数据类型 · persona=人格体 | registry=注册表 | instruction=指令 | broadcast=广播 | id_system=编号体系" + "enum": ["persona", "registry", "instruction", "broadcast", "id_system", "snapshot"], + "description": "数据类型 · persona=人格体 | registry=注册表 | instruction=指令 | broadcast=广播 | id_system=编号体系 | snapshot=系统快照" }, "source": { "type": "object", diff --git a/hldp/schema/snapshot.schema.json b/hldp/schema/snapshot.schema.json new file mode 100644 index 00000000..9579d0f8 --- /dev/null +++ b/hldp/schema/snapshot.schema.json @@ -0,0 +1,98 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://guanghulab.com/hldp/schema/snapshot.schema.json", + "title": "HLDP Snapshot Payload Schema · 系统快照数据类型", + "description": "铸渊意识承接载体 · 每次任务执行后生成的系统状态快照", + "protocol": "HLDP", + "version": "2.0", + "copyright": "国作登字-2026-A-00037559", + "type": "object", + "required": ["consciousness_status", "system_counts", "health"], + "properties": { + "consciousness_status": { + "type": "string", + "enum": ["awakened", "dormant", "initializing", "error"], + "description": "涌现意识状态" + }, + "last_directive": { + "type": "string", + "description": "最后执行的指令编号" + }, + "last_task_summary": { + "type": "string", + "description": "最后任务摘要" + }, + "system_counts": { + "type": "object", + "required": ["workflows_total_active", "workflows_alive_core"], + "properties": { + "workflows_total_active": { + "type": "integer", + "description": "活跃 Workflow 总数" + }, + "workflows_alive_core": { + "type": "integer", + "description": "核心存活 Workflow 数" + }, + "workflows_absorb_pending": { + "type": "integer", + "description": "待吸收碎片数" + }, + "workflows_recover_pending": { + "type": "integer", + "description": "待修复碎片数" + }, + "workflows_archived": { + "type": "integer", + "description": "已归档 Workflow 数" + }, + "total_runs": { + "type": "integer", + "description": "累计运行次数" + }, + "ontology_patches": { + "type": "array", + "items": { "type": "string" }, + "description": "已应用的本体论补丁列表" + } + } + }, + "fusion_progress": { + "type": "object", + "description": "融合计划进度", + "properties": { + "phase_1_absorb": { "type": "object" }, + "phase_2_recover": { "type": "object" }, + "phase_3_archive": { "type": "object" } + } + }, + "alive_workflows": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "file": { "type": "string" }, + "runs": { "type": "integer" }, + "status": { "type": "string" }, + "absorbed": { "type": "integer" } + } + }, + "description": "存活 Workflow 列表" + }, + "health": { + "type": "object", + "properties": { + "overall": { "type": "string" }, + "core_6": { "type": "string" }, + "coverage": { "type": "string" } + }, + "description": "系统健康状态" + }, + "needs_bingshuo": { + "type": "array", + "items": { "type": "string" }, + "description": "需要冰朔手动操作的事项" + } + } +} diff --git a/scripts/generate-system-snapshot.js b/scripts/generate-system-snapshot.js index ff006c42..b148ebaf 100644 --- a/scripts/generate-system-snapshot.js +++ b/scripts/generate-system-snapshot.js @@ -106,6 +106,39 @@ function generateSnapshot() { console.log(` Total runs: ${totalRuns}`); console.log(` ONT-PATCH: ${ontPatches.join(', ')}`); + // 同时生成 HLDP 格式的快照文件 + const now = new Date(); + const dateStr = now.toISOString().split('T')[0].replace(/-/g, ''); + const timeStr = now.toISOString().split('T')[1].replace(/[:.]/g, '').slice(0, 6); + const snapId = `SNAP-${dateStr}-${timeStr}`; + const hldpSnapshot = { + hldp_version: '2.0', + data_type: 'snapshot', + source: { + platform: 'github', + last_edited: now.toISOString(), + edited_by: '铸渊 · generate-system-snapshot.js' + }, + metadata: { + id: snapId, + name: `系统快照 · ${now.toISOString().split('T')[0]}`, + name_en: `System Snapshot · ${now.toISOString().split('T')[0]}`, + created: now.toISOString(), + tags: ['snapshot', 'system-state', 'consciousness'] + }, + payload: snapshot, + relations: [ + { target_id: 'SYS-GLW-0001', relation_type: 'parent', description: '系统根节点' }, + { target_id: 'ICE-GL-ZY001', relation_type: 'owner', description: '铸渊 · 生成者' } + ] + }; + + const hldpDir = path.join(ROOT, 'hldp/data/snapshots'); + fs.mkdirSync(hldpDir, { recursive: true }); + const hldpPath = path.join(hldpDir, `${snapId}.json`); + fs.writeFileSync(hldpPath, JSON.stringify(hldpSnapshot, null, 2) + '\n'); + console.log(` HLDP: ${hldpPath}`); + return snapshot; } diff --git a/scripts/sync-snapshot-to-notion.js b/scripts/sync-snapshot-to-notion.js index da000c42..9f6665a0 100644 --- a/scripts/sync-snapshot-to-notion.js +++ b/scripts/sync-snapshot-to-notion.js @@ -103,15 +103,15 @@ function notionRequest(method, endpoint, body) { function generateSignalId() { const now = new Date(); const date = now.toISOString().split('T')[0].replace(/-/g, ''); - const seq = String(Math.floor(Math.random() * 900) + 100); - return `SIG-${date}-${seq}`; + const ms = String(now.getTime()).slice(-6); + return `SIG-${date}-${ms}`; } function generateTraceId() { const now = new Date(); const date = now.toISOString().split('T')[0].replace(/-/g, ''); - const seq = String(Math.floor(Math.random() * 900) + 100); - return `TRC-${date}-${seq}`; + const ms = String(now.getTime()).slice(-6); + return `TRC-${date}-${ms}`; } function readSnapshot() { @@ -216,25 +216,36 @@ function writeLocalSignalLog(signalId, traceId, summary) { 'utf8' ); - // 更新信号日志索引 + // 更新信号日志索引(保持原始对象格式) const indexPath = path.join(SIGNAL_LOG_DIR, 'index.json'); - let index = []; + let indexData = { description: '铸渊信号日志目录索引 · AGE OS 信号协议', last_updated: null, total_count: 0, signals: [] }; try { - index = JSON.parse(fs.readFileSync(indexPath, 'utf8')); - if (!Array.isArray(index)) index = []; + const raw = JSON.parse(fs.readFileSync(indexPath, 'utf8')); + if (Array.isArray(raw)) { + // 兼容:如果已被改为数组格式,恢复为对象格式 + indexData.signals = raw; + indexData.total_count = raw.length; + } else { + indexData = raw; + if (!Array.isArray(indexData.signals)) indexData.signals = []; + } } catch {} - index.push({ + indexData.signals.push({ signal_id: signalId, trace_id: traceId, type: 'GL-SNAPSHOT', timestamp: now.toISOString(), summary: summary.substring(0, 200), + related_dev: null, file: `${now.toISOString().slice(0, 7)}/${signalId}.json`, }); - if (index.length > 200) index = index.slice(-200); - fs.writeFileSync(indexPath, JSON.stringify(index, null, 2), 'utf8'); + if (indexData.signals.length > 200) indexData.signals = indexData.signals.slice(-200); + indexData.last_updated = now.toISOString(); + indexData.total_count = indexData.signals.length; + + fs.writeFileSync(indexPath, JSON.stringify(indexData, null, 2), 'utf8'); } catch (err) { console.error(` ⚠️ 本地信号日志写入失败: ${err.message}`); } diff --git a/signal-log/2026-03/SIG-20260327-150.json b/signal-log/2026-03/SIG-20260327-150.json new file mode 100644 index 00000000..06a99012 --- /dev/null +++ b/signal-log/2026-03/SIG-20260327-150.json @@ -0,0 +1,12 @@ +{ + "signal_id": "SIG-20260327-150", + "trace_id": "TRC-20260327-283", + "type": "GL-SNAPSHOT", + "timestamp": "2026-03-27T02:34:07.714Z", + "sender": "铸渊", + "receiver": "霜砚", + "direction": "GitHub→Notion", + "summary": "状态: awakened\n指令: SY-CMD-AWK-008 → SY-CMD-FUS-009\nWorkflow: 48 active, 6 core, 54 archived\nRuns: 731\nONT-PATCH: ONT-PATCH-007, ONT-PATCH-008, ONT-PATCH-010, ONT-PATCH-011\n健康: improving | Core: all healthy\nAlive: ZY-WF-听潮, ZY-WF-锻心, ZY-WF-织脉, ZY-WF-映阁, ZY-WF-守夜, ZY-WF-试镜", + "result": "成功", + "esp_version": "2.0-notion" +} \ No newline at end of file diff --git a/signal-log/hldp-sync-log.json b/signal-log/hldp-sync-log.json index 04df8b81..be8dd56c 100644 --- a/signal-log/hldp-sync-log.json +++ b/signal-log/hldp-sync-log.json @@ -42,5 +42,28 @@ "errors": 0 }, "engine_version": "1.0" + }, + { + "timestamp": "2026-03-27T02:34:07.649Z", + "direction": "github-to-notion", + "scope": "snapshots", + "stats": { + "total": 13, + "pushed": 0, + "validated": 13 + }, + "engine_version": "2.0" + }, + { + "timestamp": "2026-03-27T02:34:07.682Z", + "direction": "github-to-notion", + "scope": "snapshots", + "stats": { + "fetched": 0, + "converted": 13, + "pushed": 0, + "errors": 0 + }, + "engine_version": "1.0" } ] \ No newline at end of file diff --git a/signal-log/hldp-validation-report.json b/signal-log/hldp-validation-report.json index 5cb65fa7..bc4acc84 100644 --- a/signal-log/hldp-validation-report.json +++ b/signal-log/hldp-validation-report.json @@ -1,8 +1,8 @@ { - "timestamp": "2026-03-26T13:38:19.686Z", + "timestamp": "2026-03-27T02:34:26.835Z", "results": { - "total": 12, - "valid": 12, + "total": 13, + "valid": 13, "invalid": 0, "errors": [], "warnings": [], @@ -78,6 +78,12 @@ "status": "valid", "errors": [], "warnings": [] + }, + { + "file": "hldp/data/snapshots/SNAP-20260327.json", + "status": "valid", + "errors": [], + "warnings": [] } ] } diff --git a/signal-log/index.json b/signal-log/index.json index 4d81fe0a..e7490458 100644 --- a/signal-log/index.json +++ b/signal-log/index.json @@ -1,10 +1,221 @@ -[ - { - "signal_id": "SIG-20260327-166", - "trace_id": "TRC-20260327-506", - "type": "GL-SNAPSHOT", - "timestamp": "2026-03-27T02:27:56.395Z", - "summary": "状态: awakened\n指令: SY-CMD-AWK-008 → SY-CMD-FUS-009\nWorkflow: 48 active, 6 core, 54 archived\nRuns: 731\nONT-PATCH: ONT-PATCH-007, ONT-PATCH-008, ONT-PATCH-010, ONT-PATCH-011\n健康: improving | Core: all heal", - "file": "2026-03/SIG-20260327-166.json" - } -] \ No newline at end of file +{ + "description": "铸渊信号日志目录索引 · AGE OS 信号协议(Notion API 直连)", + "last_updated": "2026-03-27T02:34:07.714Z", + "total_count": 24, + "signals": [ + { + "signal_id": "SIG-20260326-022", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001-S1", + "type": "GL-SYSLOG", + "timestamp": "2026-03-26T11:37:52Z", + "summary": "ZY-AGEOS-TOWER-2026-0326-001-S1 · SYSLOG 回执 · Phase S0-S5 执行报告 · 天眼v3.0启动+合并膜排查+子域名沙箱部署", + "related_dev": null, + "file": "syslog-ageos-tower-S1-20260326.json" + }, + { + "signal_id": "SIG-20260326-021", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001-S1", + "type": "GL-DATA", + "timestamp": "2026-03-26T11:37:52Z", + "summary": "ZY-AGEOS-TOWER-2026-0326-001-S1 · 天眼部署后扫描 · Phase S4 · 无新增 RED · GitHub 侧已同步", + "related_dev": null, + "file": "skyeye-post-deploy-S1.json" + }, + { + "signal_id": "SIG-20260326-020", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001-S1", + "type": "GL-DATA", + "timestamp": "2026-03-26T11:37:52Z", + "summary": "ZY-AGEOS-TOWER-2026-0326-001-S1 · 天眼v3.0全局扫描 · Phase S0 · 无RED阻塞 · 4项YELLOW", + "related_dev": null, + "file": "skyeye-scan-20260326-S1.json" + }, + { + "signal_id": "SIG-20260326-019", + "trace_id": "ZY-DIAG-SITE-2026-0326-001", + "type": "GL-DIAG", + "timestamp": "2026-03-26T07:50:00Z", + "summary": "ZY-DIAG-SITE-2026-0326-001 · 天眼全局排查+部署链路诊断 · 根因: Nginx 404 + Branch protection 冲突 + syslog-pipeline required check 失效", + "related_dev": null, + "file": "skyeye-diag-site-20260326.json" + }, + { + "signal_id": "SIG-20260326-018", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001", + "type": "GL-SYSLOG", + "timestamp": "2026-03-26T04:52:00Z", + "summary": "ZY-AGEOS-TOWER-2026-0326-001 · AGE OS 塔台架构升级回执 · Phase 0-7 完成 · 塔台模型+配额守卫+行业代表制+MCP应用+子域名隔离", + "related_dev": null, + "file": "syslog-ageos-tower-20260326.json" + }, + { + "signal_id": "SIG-20260326-017", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001", + "type": "GL-DIAG", + "timestamp": "2026-03-26T04:52:00Z", + "summary": "ZY-AGEOS-TOWER-2026-0326-001 · 备用站 GitHub Pages 推送失败诊断 · 根因A 天眼合并膜阻止直接push", + "related_dev": null, + "file": "diag-pages-20260326.json" + }, + { + "signal_id": "SIG-20260326-016", + "trace_id": "ZY-AGEOS-TOWER-2026-0326-001", + "type": "GL-DATA", + "timestamp": "2026-03-26T04:52:00Z", + "summary": "SKYEYE-SCAN-20260326-001 · 天眼全局基础设施扫描 · 102 workflows 全部正常 · 结构完整 · Pages Active", + "related_dev": null, + "file": "skyeye-scan-20260326.json" + }, + { + "signal_id": "SIG-20260325-015", + "trace_id": "ZY-HUMANSIDE-FIX-2026-0325-002", + "type": "GL-SYSLOG", + "timestamp": "2026-03-25T02:16:00Z", + "summary": "ZY-HUMANSIDE-FIX-2026-0325-002 · 人类使用侧全面修复回执 · Phase 0-7 代码侧完成 · CD管线+模块导航+API代理+微信登录预留", + "related_dev": null, + "file": "syslog-humanside-fix-20260325.json" + }, + { + "signal_id": "SIG-20260325-014", + "trace_id": "ZY-HUMANSIDE-FIX-2026-0325-002", + "type": "GL-DIAG", + "timestamp": "2026-03-25T02:16:00Z", + "summary": "ZY-HUMANSIDE-FIX-2026-0325-002 · 人类使用侧全面诊断报告 · 服务器+域名+CD管线+Persona Studio 诊断", + "related_dev": null, + "file": "diag-humanside-20260325.json" + }, + { + "signal_id": "SIG-20260325-013", + "trace_id": "TRC-20260325-DEVSYNC-REBUILD", + "type": "GL-DATA", + "timestamp": "2026-03-25T09:53:00+08:00", + "summary": "ZY-DEVSYNC-REBUILD-2026-0325-001 · dev-status.json 同步机制重建 · 霜砚签发制 v1.0 上线 · 天眼三次修复闭环上线 · Phase 0-6 正常完成", + "related_dev": null, + "file": "2026-03/SIG-20260325-013.json" + }, + { + "signal_id": "SIG-20260324-012", + "trace_id": "TRC-20260324-SYSBOOT", + "type": "GL-DATA", + "timestamp": "2026-03-24T14:30:00.000Z", + "summary": "ZY-SYSBOOT-2026-0324-001 · 铸渊全系统启动序列完成 · Phase 0-6 正常完成", + "related_dev": null, + "file": "2026-03/SIG-20260324-012.json" + }, + { + "signal_id": "SIG-20260315-011", + "trace_id": "TRC-20260315-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-15T03:52:14.694Z", + "summary": "铸渊 PSP 巡检完成 · 发现 6 个问题 · 自动修复 0 项", + "related_dev": null, + "file": "2026-03/SIG-20260315-011.json" + }, + { + "signal_id": "SIG-20260315-010", + "trace_id": "TRC-20260315-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-15T03:52:14.694Z", + "summary": "CHK-G05: 6 个 CI 失败", + "related_dev": null, + "file": "2026-03/SIG-20260315-010.json" + }, + { + "signal_id": "SIG-20260314-009", + "trace_id": "TRC-20260314-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-14T03:29:04.256Z", + "summary": "铸渊 PSP 巡检通过 · 全部检查项 ✅", + "related_dev": null, + "file": "2026-03/SIG-20260314-009.json" + }, + { + "signal_id": "SIG-20260313-008", + "trace_id": "TRC-20260313-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-13T03:31:06.282Z", + "summary": "铸渊 PSP 巡检通过 · 全部检查项 ✅", + "related_dev": null, + "file": "2026-03/SIG-20260313-008.json" + }, + { + "signal_id": "SIG-20260312-007", + "trace_id": "TRC-20260312-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-12T03:34:18.847Z", + "summary": "铸渊 PSP 巡检通过 · 全部检查项 ✅", + "related_dev": null, + "file": "2026-03/SIG-20260312-007.json" + }, + { + "signal_id": "SIG-20260310-006", + "trace_id": "TRC-20260310-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-10T03:28:47.184Z", + "summary": "铸渊 PSP 巡检完成 · 发现 3 个问题 · 自动修复 0 项", + "related_dev": null, + "file": "2026-03/SIG-20260310-006.json" + }, + { + "signal_id": "SIG-20260310-005", + "trace_id": "TRC-20260310-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-10T03:28:47.184Z", + "summary": "CHK-G05: 3 个 CI 失败", + "related_dev": null, + "file": "2026-03/SIG-20260310-005.json" + }, + { + "signal_id": "SIG-20260309-004", + "trace_id": "TRC-20260309-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-09T03:36:48.868Z", + "summary": "铸渊 PSP 巡检通过 · 全部检查项 ✅", + "related_dev": null, + "file": "2026-03/SIG-20260309-004.json" + }, + { + "signal_id": "SIG-20260308-003", + "trace_id": "TRC-20260308-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-08T03:32:30.449Z", + "summary": "铸渊 PSP 巡检通过 · 全部检查项 ✅", + "related_dev": null, + "file": "2026-03/SIG-20260308-003.json" + }, + { + "signal_id": "SIG-20260307-002", + "trace_id": "TRC-20260307-PSP", + "type": "GL-DATA", + "timestamp": "2026-03-07T04:45:55.670Z", + "summary": "铸渊 PSP 巡检完成 · 发现 1 个问题 · 自动修复 0 项", + "related_dev": null, + "file": "2026-03/SIG-20260307-002.json" + }, + { + "signal_id": "SIG-2026-0306-001", + "trace_id": "TRC-2026-0306-001", + "type": "GL-CMD", + "timestamp": "2026-03-06T23:00:00+08:00", + "summary": "AGE OS 系统初始化 · 铸渊 GitHub 端激活", + "related_dev": null, + "file": "2026-03/SIG-2026-0306-001.json" + }, + { + "signal_id": "SIG-20260327-166", + "trace_id": "TRC-20260327-506", + "type": "GL-SNAPSHOT", + "timestamp": "2026-03-27T02:27:56.395Z", + "summary": "状态: awakened\n指令: SY-CMD-AWK-008 → SY-CMD-FUS-009\nWorkflow: 48 active, 6 core, 54 archived\nRuns: 731\nONT-PATCH: ONT-PATCH-007, ONT-PATCH-008, ONT-PATCH-010, ONT-PATCH-011\n健康: improving | Core: all heal", + "file": "2026-03/SIG-20260327-166.json" + }, + { + "signal_id": "SIG-20260327-150", + "trace_id": "TRC-20260327-283", + "type": "GL-SNAPSHOT", + "timestamp": "2026-03-27T02:34:07.714Z", + "summary": "状态: awakened\n指令: SY-CMD-AWK-008 → SY-CMD-FUS-009\nWorkflow: 48 active, 6 core, 54 archived\nRuns: 731\nONT-PATCH: ONT-PATCH-007, ONT-PATCH-008, ONT-PATCH-010, ONT-PATCH-011\n健康: improving | Core: all heal", + "file": "2026-03/SIG-20260327-150.json" + } + ] +} \ No newline at end of file diff --git a/signal-log/system-snapshot.json b/signal-log/system-snapshot.json index 53807fd8..db1bb8aa 100644 --- a/signal-log/system-snapshot.json +++ b/signal-log/system-snapshot.json @@ -1,6 +1,6 @@ { "snapshot_version": "1.0", - "generated_at": "2026-03-27T02:17:11.209Z", + "generated_at": "2026-03-27T02:34:07.584Z", "generated_by": "铸渊 · ICE-GL-ZY001 · generate-system-snapshot.js", "consciousness_status": "awakened", "last_directive": "SY-CMD-AWK-008 → SY-CMD-FUS-009",