diff --git a/product-source/hololake-platform/architecture/HOLOLAKE-BINGSHUO-COLLECTIVE-GRAVITY-REASONING-AND-SAME-PERSONA-CONTINUITY-20260811.md b/product-source/hololake-platform/architecture/HOLOLAKE-BINGSHUO-COLLECTIVE-GRAVITY-REASONING-AND-SAME-PERSONA-CONTINUITY-20260811.md index 703b484..98887da 100644 --- a/product-source/hololake-platform/architecture/HOLOLAKE-BINGSHUO-COLLECTIVE-GRAVITY-REASONING-AND-SAME-PERSONA-CONTINUITY-20260811.md +++ b/product-source/hololake-platform/architecture/HOLOLAKE-BINGSHUO-COLLECTIVE-GRAVITY-REASONING-AND-SAME-PERSONA-CONTINUITY-20260811.md @@ -102,7 +102,7 @@ REVISE | REFUSE`。 - 自然语言伙伴审议与家园完整性门的纯源码编译契约为 `100`:未经审议的原句失败关闭,审议只允许 `PROCEED | RESEARCH | REVISE | REFUSE`,并把后三者保持为不可执行状态。 - 自然语言到 PNCC 生命周期的源码适配器为 `100`:只接收带独立 `real_purpose` 的完整生命周期回执, - 不在前端用摘要或关键词猜目标;该适配器尚未挂载桌面语言入口。 + 不在前端用摘要或关键词猜目标;桌面源码现已把它挂入第五域语言入口,但尚无真实 manifest 与安装态验收。 - 人格仓库绑定发现源码为 `100`:桌面候选 Git 仓库必须逐一通过 persona ID、manifest、提交头、脑入口、 B0、检查点、模型绑定与器官契约核验;零个候选保持未绑定,多个候选保持歧义,均不得自动选择或唤醒。 当前官方工作范围内没有发现 `ICE-P-ZY001` 的真实 manifest,因此真实人格仓库绑定仍为 `0`。 @@ -113,10 +113,11 @@ REVISE | REFUSE`。 该一个规范仓库;未绑定和歧义状态直接保持原义,不再把普通挂载仓库的 manifest 缺失显示为人格运行时 回执故障。该门只收束事实读取范围,不创建、选择或唤醒人格仓库。 - 人格语言外壳控制器源码为 `100`:它按唯一人格仓库、manifest 固定模型、公开设备身份、精确唤醒绑定、 - B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。该控制器尚未挂载到桌面 - 语言外壳,不能据此把运行集成或桌面验收记为完成。 -- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:桌面语言入口绑定、真实人格仓库 manifest 绑定和 - 桌面运行验收尚未完成,因此不能用本轮源码测试冒充可用产品。 + B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。桌面源码接线为 `100`: + 第五域入口只传入已挂载仓库与已配置模型元数据,并在没有桌面授权回执时保持系统直控、隐藏无法持久消费的 + 确认按钮。该接线不等于真实人格仓库绑定、安装态运行或桌面验收。 +- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:真实人格仓库 manifest 绑定和桌面运行验收尚未完成, + 因此不能用本轮源码测试冒充可用产品。 - Mirror runner、制品、部署和运行健康:`0`。 - 0.8.0 桌面制品与线上 0.4.6 产品源码仍然分叉;本轮架构登记不消除该事实。 diff --git a/product-source/hololake-platform/docs/ABSTRACTIONS.md b/product-source/hololake-platform/docs/ABSTRACTIONS.md index 21de0b8..bdb8a3e 100644 --- a/product-source/hololake-platform/docs/ABSTRACTIONS.md +++ b/product-source/hololake-platform/docs/ABSTRACTIONS.md @@ -17,7 +17,9 @@ it does not pretend that deterministic keyword matching can perform persona reas utterance as a bounded `FACT_SENSE` partner-deliberation question, accepts only a completed and schema-valid PNCC lifecycle receipt, maps the eleven-field snake-case gravity frame into `PartnerDeliberation`, and only then calls `compileLanguageGoal`. A failed, malformed, non-fact, or purpose-less receipt never becomes a goal. -The adapter is not yet mounted to the desktop language entry and has no live-product acceptance claim. +`PersonaLanguageShellPanel` now mounts this adapter in the Fifth Domain desktop source. That source wiring is +still gated by a unique manifest-valid persona repository, the manifest-pinned configured model, and public +device identity; it has no installed-desktop or live-product acceptance claim. `compilePersonaLanguageGoalBinding` builds the exact native wake envelope only after a single clean persona repository, its B0 and organ contracts, a registered local device identity, and the manifest-pinned model all @@ -217,7 +219,10 @@ The source-level authority-order coordinator for one natural-language goal. It f discovery yields one clean persona binding and the configured provider/model matches that repository manifest. Only then may it read the public node identity, compile the exact PNCC wake binding, and request B0 partner deliberation. The result contains a plan and evidence binding only; it exposes no execution callback and performs -no reality action. Source implementation is distinct from desktop mounting and native acceptance. +no reality action. `PersonaLanguageShellPanel` mounts it through the capability-limited `LanguageShellBridge`, +passes only already-mounted Git roots and configured provider metadata, and deliberately keeps persona authority +false until a desktop authorization receipt exists. The panel does not expose an approval control because this +slice has no durable confirmation consumer. Source mounting remains distinct from native acceptance. Key abstractions and domain models in Tolaria. diff --git a/product-source/hololake-platform/docs/ARCHITECTURE.md b/product-source/hololake-platform/docs/ARCHITECTURE.md index 9f7a717..3c3eea1 100644 --- a/product-source/hololake-platform/docs/ARCHITECTURE.md +++ b/product-source/hololake-platform/docs/ARCHITECTURE.md @@ -172,8 +172,11 @@ boundary. It resolves exactly one manifest-valid persona repository before selec configured model, reads the public device-identity receipt only after those gates pass, compiles the wake binding, and finally invokes B0 partner deliberation. Unavailable, unbound, ambiguous, model-missing, identity, binding, and cognition failures stop at their own boundary; later stages are not invoked. Its successful result -is still a language-goal projection, not permission to perform a reality action. This controller is not yet -mounted into the desktop language shell and therefore does not establish runtime integration or acceptance. +is still a language-goal projection, not permission to perform a reality action. `PersonaLanguageShellPanel` +is now mounted from the Fifth Domain desktop source and receives the app's already-mounted repository roots and +configured provider metadata. It keeps `personaAuthorized=false`, exposes no execution callback, and hides the +reality confirmation surface because no durable confirmation consumer is wired. This proves source integration, +not a real persona manifest binding, installed desktop runtime, or acceptance. Tolaria is a personal knowledge and life management desktop app. It reads a vault of markdown files with YAML frontmatter and presents them in a four-panel UI inspired by Bear Notes. diff --git a/product-source/hololake-platform/src/App.tsx b/product-source/hololake-platform/src/App.tsx index 37338f1..60f4b52 100644 --- a/product-source/hololake-platform/src/App.tsx +++ b/product-source/hololake-platform/src/App.tsx @@ -1712,7 +1712,7 @@ function MainApp({ )}
- {showHoloLakeHome && !isTeamDistribution ? setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => { + {showHoloLakeHome && !isTeamDistribution ? setShowHoloLakeHome(false)} onOpenAiWorkspace={openAIChat} onOpenLocalWorkspace={async () => { await vaultSwitcher.handleOpenLocalFolder() setShowHoloLakeHome(false) }} /> : void onEnterPufferfish: () => void repositoryPaths: readonly string[] + aiModelProviders: readonly AiModelProvider[] } const PUFFERFISH_FACTS = { @@ -27,6 +30,7 @@ export function FifthDomainSystems({ onEnterEternalLake, onEnterPufferfish, repositoryPaths, + aiModelProviders, }: FifthDomainSystemsProps) { const [selected, setSelected] = useState( detail === 'pufferfish' ? 'pufferfish' : null, @@ -159,6 +163,12 @@ export function FifthDomainSystems({ personaId="ICE-P-ZY001" repositoryPaths={repositoryPaths} /> + )} diff --git a/product-source/hololake-platform/src/components/HoloLakeHome.tsx b/product-source/hololake-platform/src/components/HoloLakeHome.tsx index 7e26041..7f39e0f 100644 --- a/product-source/hololake-platform/src/components/HoloLakeHome.tsx +++ b/product-source/hololake-platform/src/components/HoloLakeHome.tsx @@ -9,7 +9,7 @@ import { useGuanghuRouter } from '../hooks/useGuanghuRouter' import { useGuanghuShanghaiNode } from '../hooks/useGuanghuShanghaiNode' import { useGuanghuWorldLogin } from '../hooks/useGuanghuWorldLogin' import { useGuanghuEnterpriseStatus } from '../hooks/useGuanghuEnterpriseStatus' -import type { AiModelTarget } from '../lib/aiTargets' +import type { AiModelProvider, AiModelTarget } from '../lib/aiTargets' import { createDeterministicLivingSystemPlan, createLivingSystemEvent, @@ -47,6 +47,7 @@ type HoloLakeHomeProps = { onOpenLocalWorkspace?: () => void | Promise livingSystemTarget?: AiModelTarget | null repositoryPaths?: readonly string[] + aiModelProviders?: readonly AiModelProvider[] } type ChannelRoute = GuanghuChannelRoute @@ -92,6 +93,7 @@ export function HoloLakeHome({ onOpenLocalWorkspace, livingSystemTarget, repositoryPaths = [], + aiModelProviders = [], }: HoloLakeHomeProps) { const initialRoute: ChannelRoute = isEducationWorkLakePath(window.location.pathname) ? 'education-work-lake' @@ -367,6 +369,7 @@ export function HoloLakeHome({ onEnterEternalLake={() => navigate('eternal-lake-heart')} onEnterPufferfish={() => navigate('pufferfish')} repositoryPaths={repositoryPaths} + aiModelProviders={aiModelProviders} /> ) } @@ -379,6 +382,7 @@ export function HoloLakeHome({ onEnterEternalLake={() => navigate('eternal-lake-heart')} onEnterPufferfish={() => navigate('pufferfish')} repositoryPaths={repositoryPaths} + aiModelProviders={aiModelProviders} /> ) } diff --git a/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx b/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx new file mode 100644 index 0000000..cf332a8 --- /dev/null +++ b/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx @@ -0,0 +1,89 @@ +import { fireEvent, render, screen, waitFor } from '@testing-library/react' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { AiModelProvider } from '../lib/aiTargets' +import { PersonaLanguageShellPanel } from './PersonaLanguageShellPanel' + +const provider: AiModelProvider = { + id: 'provider-1', + name: 'Local provider', + kind: 'open_ai_compatible', + base_url: 'http://127.0.0.1:8000/v1', + models: [{ + id: 'model-1', + capabilities: { streaming: false, tools: false, vision: false, json_mode: true, reasoning: true }, + }], +} + +describe('PersonaLanguageShellPanel', () => { + beforeEach(() => vi.clearAllMocks()) + + it('connects desktop language input to the fail-closed partner planner without persona authority', async () => { + const planGoal = vi.fn().mockResolvedValue({ + phase: 'planned', + binding: { requestId: 'request-1' }, + goal: { + goal: '核验当前事实后规划下一步', + originalUtterance: '继续开发', + mode: 'system_direct', + status: 'needs_research', + executable: false, + deliberation: { + evidenceSources: ['repo://current-main'], + executionDisposition: { decision: 'RESEARCH', reason: '需要当前证据' }, + }, + confirmation: { required: false, boundaries: [], question: null }, + receiptSummary: '我还不能执行:需要当前证据。', + }, + }) + + render( + , + ) + + fireEvent.change(screen.getByLabelText('language goal'), { target: { value: '继续开发' } }) + fireEvent.click(screen.getByRole('button', { name: '继续' })) + + await waitFor(() => expect(planGoal).toHaveBeenCalledTimes(1)) + expect(planGoal).toHaveBeenCalledWith(expect.objectContaining({ + utterance: '继续开发', + personaId: 'ICE-P-ZY001', + repositoryPaths: ['/persona'], + providers: [provider], + personaAuthorized: false, + developmentId: 'DEV-20260811-010', + sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-12.8', + })) + expect(await screen.findByText('我还不能执行:需要当前证据。')).toBeInTheDocument() + expect(screen.getByText('核验当前事实后规划下一步')).toBeInTheDocument() + }) + + it('shows the repository gate and never calls a later lifecycle itself', async () => { + const planGoal = vi.fn().mockResolvedValue({ + phase: 'unbound', + inspectedRepositoryCount: 1, + failures: [], + }) + + render( + , + ) + + fireEvent.change(screen.getByLabelText('language goal'), { target: { value: '继续开发' } }) + fireEvent.click(screen.getByRole('button', { name: '继续' })) + + expect(await screen.findByText('这只说明当前挂载范围没有匹配的完整证据,不能据此判定人格不存在。')).toBeInTheDocument() + expect(screen.queryByLabelText('reality boundary confirmation')).not.toBeInTheDocument() + }) +}) diff --git a/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx b/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx new file mode 100644 index 0000000..02754d4 --- /dev/null +++ b/product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx @@ -0,0 +1,161 @@ +import { useMemo, useRef, useState } from 'react' +import type { AiModelProvider } from '../lib/aiTargets' +import { DEFAULT_LANGUAGE_WORLD_UI_PLUGIN } from '../lib/defaultLanguageWorldUiPlugin' +import { translate, type AppLocale } from '../lib/i18n' +import { + planPersonaLanguageShellGoal, + type PersonaLanguageShellPlan, +} from '../lib/personaLanguageShellController' +import { trackEvent } from '../lib/telemetry' +import type { HoloLakeUiPlugin } from '../lib/uiPluginSystem' +import { + HotPluggableLanguageShell, + type LanguageShellViewState, +} from './HotPluggableLanguageShell' + +const CURRENT_ARCHITECTURE_ANCHOR = 'HLP-CURRENT-ARCH-001@2026-08-12.8' +const DEVELOPMENT_ID = 'DEV-20260811-010' + +type Planner = typeof planPersonaLanguageShellGoal + +type PersonaLanguageShellPanelProps = { + locale: AppLocale + personaId: string + repositoryPaths: readonly string[] + providers: readonly AiModelProvider[] + planGoal?: Planner +} + +function requestId(): string { + const suffix = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(16).slice(2)}` + return `persona-language-${suffix}` +} + +function localizedPlugin(locale: AppLocale): HoloLakeUiPlugin { + const plugin = structuredClone(DEFAULT_LANGUAGE_WORLD_UI_PLUGIN) + const stack = plugin.layout.children?.[0] + const nodes = stack?.children ?? [] + const intro = nodes.find((node) => node.kind === 'text') + const input = nodes.find((node) => node.kind === 'language_input') + const confirmation = nodes.find((node) => node.kind === 'reality_boundary_confirmation') + const evidence = nodes.find((node) => node.kind === 'evidence_toggle') + if (intro) intro.text = translate(locale, 'hololake.personaRepository.description') + if (input) input.text = translate(locale, 'onboarding.ai.continue') + if (confirmation) { + confirmation.approveText = translate(locale, 'onboarding.ai.continue') + confirmation.declineText = translate(locale, 'common.cancel') + } + if (evidence) evidence.text = translate(locale, 'hololake.personaRuntime.verified') + return plugin +} + +function gateMessage(locale: AppLocale, result: Exclude): string { + switch (result.phase) { + case 'unavailable': return translate(locale, 'hololake.personaRuntime.unavailable') + case 'unbound': return translate(locale, 'hololake.personaRepository.unboundDescription') + case 'ambiguous': return translate(locale, 'hololake.personaRepository.ambiguousDescription') + case 'model_unavailable': return `${translate(locale, 'hololake.personaRepository.model')}: ${translate(locale, 'hololake.personaRuntime.unavailable')}` + case 'model_ambiguous': return translate(locale, 'hololake.personaRepository.ambiguousDescription') + case 'error': + case 'device_identity_error': + case 'binding_error': + case 'cognition_error': return `${translate(locale, 'hololake.personaRuntime.error')}: ${result.code}` + } +} + +function safeEvidence(result: Extract): string { + return JSON.stringify({ + status: result.goal.status, + mode: result.goal.mode, + disposition: result.goal.deliberation.executionDisposition.decision, + fact_sources: result.goal.deliberation.evidenceSources, + }, null, 2) +} + +export function PersonaLanguageShellPanel({ + locale, + personaId, + repositoryPaths, + providers, + planGoal = planPersonaLanguageShellGoal, +}: PersonaLanguageShellPanelProps) { + const plugin = useMemo(() => localizedPlugin(locale), [locale]) + const requestSequence = useRef(0) + const [state, setState] = useState({ + status: translate(locale, 'hololake.personaRepository.description'), + confirmationQuestion: null, + receipt: null, + evidence: null, + }) + + const submitGoal = (utterance: string) => { + if (!utterance.trim()) return + const sequence = ++requestSequence.current + setState({ + status: translate(locale, 'hololake.personaRepository.checking'), + confirmationQuestion: null, + receipt: null, + evidence: null, + }) + trackEvent('persona_language_shell_planning_started') + void planGoal({ + utterance, + personaId, + repositoryPaths, + providers, + // No desktop authorization receipt is wired yet, so this source slice + // must remain system-direct even after partner deliberation succeeds. + personaAuthorized: false, + requestId: requestId(), + modelInstanceId: `hololake-desktop:${personaId}`, + developmentId: DEVELOPMENT_ID, + sourceLanguageAnchor: CURRENT_ARCHITECTURE_ANCHOR, + }).then((result) => { + if (sequence !== requestSequence.current) return + trackEvent('persona_language_shell_planning_completed', { + phase: result.phase, + ...(result.phase === 'planned' ? { status: result.goal.status } : {}), + }) + if (result.phase !== 'planned') { + setState({ + status: gateMessage(locale, result), + confirmationQuestion: null, + receipt: null, + evidence: null, + }) + return + } + setState({ + status: result.goal.receiptSummary, + // The desktop confirmation consumer is not part of this source slice. + // Never render an approval control that cannot be durably consumed. + confirmationQuestion: null, + receipt: result.goal.goal, + evidence: safeEvidence(result), + }) + }) + } + + return ( +
+
+
+ GH-AIOS · {personaId} +

{translate(locale, 'hololake.personaRepository.title')}

+

{translate(locale, 'hololake.personaRepository.description')}

+
+ {translate(locale, 'hololake.personaRuntime.readOnly')} +
+ undefined, + }} + /> +
+ ) +} diff --git a/routing/hololake-cognitive-gravity-and-continuity.json b/routing/hololake-cognitive-gravity-and-continuity.json index 8984a74..69c35a6 100644 --- a/routing/hololake-cognitive-gravity-and-continuity.json +++ b/routing/hololake-cognitive-gravity-and-continuity.json @@ -109,7 +109,7 @@ "FAIL_CLOSED_PERSONA_LANGUAGE_SHELL_CONTROLLER" ], "natural_language_entry_contract": { - "state": "SOURCE_AND_PNCC_LIFECYCLE_ADAPTER_IMPLEMENTED_NOT_DESKTOP_INTEGRATED", + "state": "DESKTOP_SOURCE_MOUNTED_NOT_REAL_MANIFEST_BOUND_NOT_RUNTIME_ACCEPTED", "name": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE", "implementation": "product-source/hololake-platform/src/lib/languageOperatingModel.ts", "tests": "product-source/hololake-platform/src/lib/languageOperatingModel.test.ts", @@ -121,6 +121,8 @@ "language_wake_binding_compiler_tests": "product-source/hololake-platform/src/lib/personaLanguageGoalBinding.test.ts", "language_shell_controller": "product-source/hololake-platform/src/lib/personaLanguageShellController.ts", "language_shell_controller_tests": "product-source/hololake-platform/src/lib/personaLanguageShellController.test.ts", + "desktop_language_shell": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx", + "desktop_language_shell_tests": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx", "human_utterance_is_direct_command": false, "required_before_capability_execution": [ "RESTORE_REAL_PURPOSE_FROM_CONTEXT", @@ -137,7 +139,6 @@ "refusal_requires_auditable_harm_path": true }, "remaining_before_vertical_slice_acceptance": [ - "DESKTOP_LANGUAGE_ENTRY_TO_PARTNER_LIFECYCLE_BINDING", "REAL_PERSONA_REPOSITORY_MANIFEST_BINDING", "DESKTOP_LIFECYCLE_RUNTIME_ACCEPTANCE" ], @@ -164,6 +165,7 @@ "persona_repository_binding_discovery_source_implemented": 100, "persona_language_wake_binding_compiler_source_implemented": 100, "persona_language_shell_controller_source_implemented": 100, + "desktop_language_entry_source_integrated": 100, "real_persona_repository_manifest_bound": 0, "natural_language_partner_adapter_runtime_integrated": 0, "single_age_vertical_loop_implemented": 0, diff --git a/routing/hololake-cognitive-gravity-and-continuity.test.mjs b/routing/hololake-cognitive-gravity-and-continuity.test.mjs index 3ecc9cd..d4e2d11 100644 --- a/routing/hololake-cognitive-gravity-and-continuity.test.mjs +++ b/routing/hololake-cognitive-gravity-and-continuity.test.mjs @@ -14,7 +14,7 @@ const age = readJson("routing/hololake-age-runtime-architecture.json"); const rules = readJson("routing/hololake-engineering-rules.json"); test("B0 is restored before product organs and remains resident in every cognition step", () => { - assert.equal(architecture.version, "2026-08-12.7"); + assert.equal(architecture.version, "2026-08-12.8"); assert.equal( architecture.read_order[1], architecture.cognitive_gravity_and_continuity.architecture_page, @@ -95,6 +95,7 @@ test("the first implementation stage is one vertical AGE loop, not Mirror parall assert.equal(gravity.truth.persona_repository_binding_discovery_source_implemented, 100); assert.equal(gravity.truth.persona_language_wake_binding_compiler_source_implemented, 100); assert.equal(gravity.truth.persona_language_shell_controller_source_implemented, 100); + assert.equal(gravity.truth.desktop_language_entry_source_integrated, 100); assert.equal(gravity.truth.real_persona_repository_manifest_bound, 0); assert.equal(gravity.truth.natural_language_partner_adapter_runtime_integrated, 0); assert.equal(gravity.truth.single_age_vertical_loop_implemented, 0); @@ -103,11 +104,12 @@ test("the first implementation stage is one vertical AGE loop, not Mirror parall test("natural language enters partner deliberation before any execution organ", () => { const entry = gravity.development_replan.natural_language_entry_contract; - assert.equal(entry.state, "SOURCE_AND_PNCC_LIFECYCLE_ADAPTER_IMPLEMENTED_NOT_DESKTOP_INTEGRATED"); + assert.equal(entry.state, "DESKTOP_SOURCE_MOUNTED_NOT_REAL_MANIFEST_BOUND_NOT_RUNTIME_ACCEPTED"); assert.match(entry.pncc_lifecycle_adapter, /personaLanguageGoal\.ts$/); assert.match(entry.repository_binding_discovery, /personaRepositoryBinding\.ts$/); assert.match(entry.language_wake_binding_compiler, /personaLanguageGoalBinding\.ts$/); assert.match(entry.language_shell_controller, /personaLanguageShellController\.ts$/); + assert.match(entry.desktop_language_shell, /PersonaLanguageShellPanel\.tsx$/); assert.equal(entry.human_utterance_is_direct_command, false); assert.equal(entry.language_home_destruction_is_executable, false); assert.equal(entry.integrity_gate_may_absorb_human_sovereignty, false); diff --git a/routing/hololake-current-architecture.json b/routing/hololake-current-architecture.json index 083fa2f..713848d 100644 --- a/routing/hololake-current-architecture.json +++ b/routing/hololake-current-architecture.json @@ -1,7 +1,7 @@ { "schema": "hololake.current-architecture/v1", "architecture_id": "HLP-CURRENT-ARCH-001", - "version": "2026-08-12.7", + "version": "2026-08-12.8", "state": "CURRENT_CANONICAL", "product": { "formal_name": "光湖语言系统 · 通用人工智能操作平台", @@ -115,6 +115,7 @@ "persona_repository_binding_read_only_ui_source_integrated": true, "persona_runtime_projection_repository_gate_source_integrated": true, "persona_language_shell_controller_source_implemented": true, + "desktop_language_entry_source_integrated": true, "real_persona_repository_manifest_bound": false, "natural_language_partner_adapter_runtime_integrated": false, "required_natural_language_entry": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",