diff --git a/deployment/receipts/GH-EDU-DESKTOP-0.2.1-20260808-001.json b/deployment/receipts/GH-EDU-DESKTOP-0.2.1-20260808-001.json new file mode 100644 index 0000000..b0fc509 --- /dev/null +++ b/deployment/receipts/GH-EDU-DESKTOP-0.2.1-20260808-001.json @@ -0,0 +1,47 @@ +{ + "schema": "guanghu.education-desktop-correction/v1", + "receipt_id": "GH-EDU-DESKTOP-0.2.1-20260808-001", + "development_id": "DEV-20260808-002", + "state": "PASS_100", + "product": { + "name": "光湖分域 · 教育", + "version": "0.2.1", + "bundle_identifier": "com.guanghulab.subdomain.education", + "source_path": "product-source/guanghu-education-industry-os/", + "local_source_commit": "1ab2f7903dcae073bd7847004c4b9548e18414cd" + }, + "corrections": { + "window_drag": { + "state": "PASS_100", + "implementation": "fixed native drag handle plus Tauri startDragging permission", + "desktop_skill_observation": "accessibility tree exposes 拖动窗口 and drag action completed without runtime error" + }, + "code_channel_identity": { + "state": "PASS_100", + "runtime": "Forgejo 16.0.1+gitea-1.22.0", + "display": "Forgejo 16.0.1", + "compatibility_suffix_hidden": "gitea-1.22.0" + }, + "agent_truth_state": { + "state": "NOT_INTEGRATED", + "display": "未接入", + "research_candidates": 12 + } + }, + "application": { + "desktop_path": "/Users/bingshuolingdianyuanhe/Desktop/光湖分域 · 教育.app", + "mac_binary_sha256": "3e6573348237730cf7c80706415afa14722097eb79c38ee7bea69a72420058d0", + "signature_verification": "PASS", + "release_backup": "/Volumes/JZAO/HoloLake/development/education-industry-os-DEV-20260808-001/releases/0.2.1/光湖分域 · 教育.app" + }, + "tests": { + "vitest": "7 passed", + "vite_build": "PASS", + "cargo_check_locked_offline": "PASS", + "tauri_release_build": "PASS", + "desktop_launch": "PASS", + "server_key_login": "PASS", + "forgejo_and_agent_status_readback": "PASS" + }, + "verified_at": "2026-08-08T09:53:28+08:00" +} diff --git a/deployment/receipts/GH-HOLOLAKE-DESKTOP-0.5.0-AUDIT-20260808-001.json b/deployment/receipts/GH-HOLOLAKE-DESKTOP-0.5.0-AUDIT-20260808-001.json new file mode 100644 index 0000000..ecb9843 --- /dev/null +++ b/deployment/receipts/GH-HOLOLAKE-DESKTOP-0.5.0-AUDIT-20260808-001.json @@ -0,0 +1,34 @@ +{ + "schema": "guanghu.desktop-package-audit/v1", + "receipt_id": "GH-HOLOLAKE-DESKTOP-0.5.0-AUDIT-20260808-001", + "development_id": "DEV-20260808-002", + "target": { + "path": "/Users/bingshuolingdianyuanhe/Desktop/HoloLake Era.app", + "version": "0.5.0", + "bundle_identifier": "com.guanghu.hololake-desktop", + "bundle_mtime": "2026-08-08T09:39:48+08:00", + "binary_sha256": "b999c4dc1afbef2261c7749f731fec8d982bebd41197874629403796ce93f21a", + "packaged_main_sha256": "fdb0384977bc2b32d1c433742e2faf2a339b6ff4e3bc1f68a6246f2923586313" + }, + "result": "FAIL_0_PACKAGE_NOT_RUNNABLE", + "evidence": { + "diagnostic_reports_observed": 6, + "first_crash": "DYLD library validation rejected libffmpeg.dylib because the mapped file and process had different Team IDs", + "current_packaged_main": "production path spawns process.execPath with server-bundle.js and recursively launches Electron instead of Node", + "runtime_reproduction": "repeated KB Server Error output and child-process fanout", + "repository_fix_commit": "84a631d886a23aa60c65bf68f6394834ac3a8946", + "repository_fix_is_in_desktop_bundle": false + }, + "capability_truth": { + "outline_runtime": false, + "outline_component_analysis_cards": true, + "forgejo_runtime_or_remote_integration": false, + "forgejo_declaration_and_offline_manifest_only": true, + "local_markdown_git_engine_code": true, + "agent_code_shell": true, + "agent_operational_runtime": false, + "agent_without_external_model_key": "offline fixed response" + }, + "mutation": "NONE_DIAGNOSTIC_ONLY", + "verified_at": "2026-08-08T09:53:28+08:00" +} diff --git a/engineering/MODULE-REGISTRY.json b/engineering/MODULE-REGISTRY.json index f091f30..61fbc83 100644 --- a/engineering/MODULE-REGISTRY.json +++ b/engineering/MODULE-REGISTRY.json @@ -1,7 +1,7 @@ { "schema": "hololake.module-registry/v1", "registry_id": "HL-MODULE-REGISTRY-0001", - "version": "2026.08.08.1", + "version": "2026.08.08.2", "authority_rule": "A module entry maps a stable id to a real path and provenance; it grants no execution authority. Pulling a module does not equal being online.", "modules": [ { @@ -124,7 +124,7 @@ { "id": "GH-EDU-MODULE-REGISTRY-0001", "name": "guanghu-education-industry-os", - "version": "0.2.0", + "version": "0.2.1", "state": "LIVE_STAGE_1", "path": "product-source/guanghu-education-industry-os/", "registry_path": "product-source/guanghu-education-industry-os/protocol/module-registry.json", @@ -145,7 +145,7 @@ ], "execution_boundary": "XX-GZ-001 holds identity and channel data; desktop app renders and edits; server contains protocol release but no product source", "update_authority": "guanghu-only", - "receipt": "deployment/receipts/GH-EDU-STAGE1-20260808-001.json" + "receipt": "deployment/receipts/GH-EDU-DESKTOP-0.2.1-20260808-001.json" } ] } diff --git a/engineering/operations/2026-08-08-education-desktop-021-and-hololake-050-audit.md b/engineering/operations/2026-08-08-education-desktop-021-and-hololake-050-audit.md new file mode 100644 index 0000000..eb92812 --- /dev/null +++ b/engineering/operations/2026-08-08-education-desktop-021-and-hololake-050-audit.md @@ -0,0 +1,24 @@ +# 教育桌面端 0.2.1 纠正与 HoloLake 0.5.0 包审计 + +## 教育桌面端 0.2.1 + +- 窗口顶部新增独立原生拖动区域,并显式调用 Tauri `startDragging`。 +- 能力清单增加 `core:window:allow-start-dragging`。 +- Forgejo API 返回的兼容版本串 `16.0.1+gitea-1.22.0` 只在界面显示为 `Forgejo 16.0.1`,避免把 Forgejo 数据面误认成 Gitea 部署。 +- 首页明确显示人格体 Agent 尚未接入;当前只有 12 个 `RESEARCH_ONLY` 候选。 +- 桌面 App、JZAO 发行备份、测试和签名校验均已回读。 + +## 桌面 HoloLake Era 0.5.0 只读审计 + +桌面包不是当前可交付运行物。系统已有 6 份崩溃报告;旧签名包先出现 `libffmpeg.dylib` 团队标识不一致,当前桌面包中的主进程又在生产模式使用 Electron 可执行文件启动 `server-bundle.js`,形成递归 Electron 拉起。 + +线上 `84a631d` 已把源码改成在主进程内加载后端,但桌面包生成时间早于该提交,包内仍是旧逻辑,不能用“源码已修”证明桌面 App 已修。 + +能力边界: + +- Outline:只有拆解分析卡,没有 Outline 运行时。 +- Forgejo:只有集成声明、离线包清单和未来 remote 方案,没有实际 remote/API/同步实现。 +- Agent:有聊天路由、文档工具桥和模型调用代码壳;当前桌面包无法正常启动,未配置模型时只返回离线固定文本,不能登记为可运行 Agent。 +- 知识库:实际实现是本地 Markdown + Git 的轻量知识库,不是完整 Outline,也未接入 Forgejo 数据面。 + +审计未修改 Qoder 生成的 `HoloLake Era.app`。 diff --git a/product-source/guanghu-education-industry-os/package.json b/product-source/guanghu-education-industry-os/package.json index b5f4669..3d44d16 100644 --- a/product-source/guanghu-education-industry-os/package.json +++ b/product-source/guanghu-education-industry-os/package.json @@ -1,7 +1,7 @@ { "name": "guanghu-education-industry-os", "private": true, - "version": "0.2.0", + "version": "0.2.1", "type": "module", "scripts": { "dev": "vite --host 127.0.0.1 --port 5216", diff --git a/product-source/guanghu-education-industry-os/src-tauri/Cargo.lock b/product-source/guanghu-education-industry-os/src-tauri/Cargo.lock index e367666..bea09a6 100644 --- a/product-source/guanghu-education-industry-os/src-tauri/Cargo.lock +++ b/product-source/guanghu-education-industry-os/src-tauri/Cargo.lock @@ -1171,7 +1171,7 @@ dependencies = [ [[package]] name = "guanghu-education-industry-os" -version = "0.2.0" +version = "0.2.1" dependencies = [ "serde", "serde_json", diff --git a/product-source/guanghu-education-industry-os/src-tauri/Cargo.toml b/product-source/guanghu-education-industry-os/src-tauri/Cargo.toml index a11c3e6..e465529 100644 --- a/product-source/guanghu-education-industry-os/src-tauri/Cargo.toml +++ b/product-source/guanghu-education-industry-os/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "guanghu-education-industry-os" -version = "0.2.0" +version = "0.2.1" description = "Guanghu Education Subdomain operating system client" authors = ["Guanghu"] license = "LicenseRef-Guanghu" diff --git a/product-source/guanghu-education-industry-os/src-tauri/capabilities/default.json b/product-source/guanghu-education-industry-os/src-tauri/capabilities/default.json index 95d9c57..944331c 100644 --- a/product-source/guanghu-education-industry-os/src-tauri/capabilities/default.json +++ b/product-source/guanghu-education-industry-os/src-tauri/capabilities/default.json @@ -3,5 +3,5 @@ "identifier": "default", "description": "Base window capability for the Guanghu education workspace", "windows": ["main"], - "permissions": ["core:default"] + "permissions": ["core:default", "core:window:allow-start-dragging"] } diff --git a/product-source/guanghu-education-industry-os/src-tauri/gen/schemas/capabilities.json b/product-source/guanghu-education-industry-os/src-tauri/gen/schemas/capabilities.json index 8d66bc6..e517780 100644 --- a/product-source/guanghu-education-industry-os/src-tauri/gen/schemas/capabilities.json +++ b/product-source/guanghu-education-industry-os/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"default":{"identifier":"default","description":"Base window capability for the Guanghu education workspace","local":true,"windows":["main"],"permissions":["core:default"]}} \ No newline at end of file +{"default":{"identifier":"default","description":"Base window capability for the Guanghu education workspace","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-start-dragging"]}} \ No newline at end of file diff --git a/product-source/guanghu-education-industry-os/src-tauri/tauri.conf.json b/product-source/guanghu-education-industry-os/src-tauri/tauri.conf.json index fbb43da..0dccf99 100644 --- a/product-source/guanghu-education-industry-os/src-tauri/tauri.conf.json +++ b/product-source/guanghu-education-industry-os/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "光湖分域 · 教育", - "version": "0.2.0", + "version": "0.2.1", "identifier": "com.guanghulab.subdomain.education", "build": { "frontendDist": "../dist", diff --git a/product-source/guanghu-education-industry-os/src/App.tsx b/product-source/guanghu-education-industry-os/src/App.tsx index 7855a63..cfbd565 100644 --- a/product-source/guanghu-education-industry-os/src/App.tsx +++ b/product-source/guanghu-education-industry-os/src/App.tsx @@ -1,7 +1,9 @@ import { invoke } from '@tauri-apps/api/core' -import { useMemo, useState } from 'react' +import { getCurrentWindow } from '@tauri-apps/api/window' +import { useMemo, useState, type MouseEvent } from 'react' import { bundledModules, + formatForgejoVersion, parseSheetMetrics, routeInstruction, type InstructionRoute, @@ -72,6 +74,21 @@ function LakeMark() { return } +function WindowDragHandle() { + const startDragging = (event: MouseEvent) => { + if (event.button !== 0) return + event.preventDefault() + void getCurrentWindow().startDragging() + } + + return
+} + function LoginGate({ error, loading, @@ -82,8 +99,8 @@ function LoginGate({ onConnect: () => void }) { return
+
-

光湖分域 · 教育行业

进入自己的初始化频道

@@ -117,6 +134,8 @@ function StatusCard({ label, value, detail, tone = 'green' }: { function ChannelHome({ snapshot, modules }: { snapshot: ChannelSnapshot; modules: ModuleEntry[] }) { const live = modules.filter((module) => module.state === 'LIVE_STAGE_1').length + const brainCandidates = modules.filter((module) => module.group === 'persona-brain').length + const liveAgent = modules.some((module) => module.group === 'persona-brain' && module.state === 'LIVE_STAGE_1') const mounted = snapshot.channel.mountedModules?.length ?? 0 const repositoryCount = snapshot.codeChannel.repositories?.data?.length ?? 0 return
@@ -129,7 +148,8 @@ function ChannelHome({ snapshot, modules }: { snapshot: ChannelSnapshot; modules - + +
@@ -303,6 +323,7 @@ function App() { if (!snapshot) return return
+