+type PanelState = PersonaRuntimeProjection | RepositoryGateState | { phase: 'checking' }
function stateTranslationKey(state: string): TranslationKey {
if (state.startsWith('DORMANT')) return 'hololake.personaRuntime.state.dormant'
@@ -100,10 +105,25 @@ export function PersonaRuntimeProjectionPanel({
useEffect(() => {
let active = true
- void loadPersonaRuntimeProjection({
- personaId,
- repositoryPaths: repositorySignature ? repositorySignature.split('\u0000') : [],
- }).then((projection) => {
+ const load = async () => {
+ const bindingResolution = await resolvePersonaRepositoryBinding({
+ personaId,
+ repositoryPaths: repositorySignature ? repositorySignature.split('\u0000') : [],
+ })
+ if (!active) return
+ if (bindingResolution.phase !== 'bound') {
+ setState(bindingResolution)
+ trackEvent('persona_runtime_projection_gated', {
+ failure_count: bindingResolution.failures.length,
+ inspected_repository_count: bindingResolution.inspectedRepositoryCount,
+ phase: bindingResolution.phase,
+ })
+ return
+ }
+ const projection = await loadPersonaRuntimeProjection({
+ personaId,
+ repositoryPaths: [bindingResolution.binding.repositoryPath],
+ })
if (!active) return
setState(projection)
trackEvent('persona_runtime_projection_loaded', {
@@ -112,7 +132,8 @@ export function PersonaRuntimeProjectionPanel({
phase: projection.phase,
session_count: projection.sessions.length,
})
- })
+ }
+ void load()
return () => {
active = false
}
@@ -143,10 +164,26 @@ export function PersonaRuntimeProjectionPanel({
) : null}
+ {state.phase === 'unbound' ? (
+
+
{translate(locale, 'hololake.personaRepository.unbound')}
+
{translate(locale, 'hololake.personaRepository.unboundDescription')}
+
+
+ ) : null}
+
+ {state.phase === 'ambiguous' ? (
+
+
{translate(locale, 'hololake.personaRepository.ambiguous')}
+
{translate(locale, 'hololake.personaRepository.ambiguousDescription')}
+
+
+ ) : null}
+
{state.phase === 'error' ? (
{translate(locale, 'hololake.personaRuntime.error')}
- {state.errors[0]?.code}
+ {'code' in state ? state.code : state.errors[0]?.code}
) : null}
diff --git a/routing/hololake-current-architecture.json b/routing/hololake-current-architecture.json
index 642d032..e6cc962 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.5",
+ "version": "2026-08-12.6",
"state": "CURRENT_CANONICAL",
"product": {
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
@@ -113,6 +113,7 @@
"persona_repository_binding_discovery_source_implemented": true,
"persona_language_wake_binding_compiler_source_implemented": true,
"persona_repository_binding_read_only_ui_source_integrated": true,
+ "persona_runtime_projection_repository_gate_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",