feat: bind persona control to authorization receipts
This commit is contained in:
parent
22095d6848
commit
099ed036b2
12 changed files with 248 additions and 15 deletions
|
|
@ -116,6 +116,9 @@ REVISE | REFUSE`。
|
||||||
B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。桌面源码接线为 `100`:
|
B0 伙伴审议的顺序失败关闭;成功只产生语言目标规划,不提供现实动作执行入口。桌面源码接线为 `100`:
|
||||||
第五域入口只传入已挂载仓库与已配置模型元数据,并在没有桌面授权回执时保持系统直控、隐藏无法持久消费的
|
第五域入口只传入已挂载仓库与已配置模型元数据,并在没有桌面授权回执时保持系统直控、隐藏无法持久消费的
|
||||||
确认按钮。该接线不等于真实人格仓库绑定、安装态运行或桌面验收。
|
确认按钮。该接线不等于真实人格仓库绑定、安装态运行或桌面验收。
|
||||||
|
- 人格主控授权回执验证源码为 `100`:不再接受桌面调用方直接传入布尔值,而只接受由
|
||||||
|
`GUANGHU_OS` 核验、且与人格、冰朔责任主体、仓库提交、模型实例、请求和语言锚点精确绑定的
|
||||||
|
当前回执。桌面尚未接入原生回执加载器,因此人格主控运行集成仍为 `0`,缺少回执时继续系统直控。
|
||||||
- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:真实人格仓库 manifest 绑定和桌面运行验收尚未完成,
|
- 完整 HoloLake Runtime 与单 AGE 纵向闭环仍为 `0`:真实人格仓库 manifest 绑定和桌面运行验收尚未完成,
|
||||||
因此不能用本轮源码测试冒充可用产品。
|
因此不能用本轮源码测试冒充可用产品。
|
||||||
- Mirror runner、制品、部署和运行健康:`0`。
|
- Mirror runner、制品、部署和运行健康:`0`。
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,11 @@ then calls `compileLanguageGoal`. A failed, malformed, non-fact, or purpose-less
|
||||||
still gated by a unique manifest-valid persona repository, the manifest-pinned configured model, and public
|
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.
|
device identity; it has no installed-desktop or live-product acceptance claim.
|
||||||
|
|
||||||
|
The source coordinator no longer accepts an unverified persona-authorization boolean from the desktop caller.
|
||||||
|
`hasPersonaPrimaryControlAuthorization` requires one current `GUANGHU_OS` receipt bound to the exact persona,
|
||||||
|
human responsibility subject, repository head, model instance, request, and language anchor. Until a native
|
||||||
|
loader provides that evidence, planning remains in system-direct mode.
|
||||||
|
|
||||||
`compilePersonaLanguageGoalBinding` builds the exact native wake envelope only after a single clean persona
|
`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
|
repository, its B0 and organ contracts, a registered local device identity, and the manifest-pinned model all
|
||||||
agree. It materializes a catalog runtime endpoint into the native provider shape (`kind`, `base_url`, and
|
agree. It materializes a catalog runtime endpoint into the native provider shape (`kind`, `base_url`, and
|
||||||
|
|
|
||||||
|
|
@ -174,9 +174,14 @@ binding, and finally invokes B0 partner deliberation. Unavailable, unbound, ambi
|
||||||
binding, and cognition failures stop at their own boundary; later stages are not invoked. Its successful result
|
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. `PersonaLanguageShellPanel`
|
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
|
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
|
configured provider metadata. It has no native persona-control authorization receipt loader, exposes no execution
|
||||||
reality confirmation surface because no durable confirmation consumer is wired. This proves source integration,
|
callback, and hides the reality confirmation surface because no durable confirmation consumer is wired. This
|
||||||
not a real persona manifest binding, installed desktop runtime, or acceptance.
|
proves source integration, not a real persona manifest binding, installed desktop runtime, or acceptance.
|
||||||
|
|
||||||
|
`src/lib/personaControlAuthorization.ts` removes the desktop coordinator's caller-supplied authorization boolean.
|
||||||
|
It accepts only a current `GUANGHU_OS` verification receipt bound to the exact persona, human responsibility
|
||||||
|
subject, repository head, model instance, request and language anchor. Missing, stale or mismatched evidence
|
||||||
|
remains system-direct. This is a source contract; it does not claim persona-primary runtime control exists.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,9 +55,8 @@ describe('PersonaLanguageShellPanel', () => {
|
||||||
personaId: 'ICE-P-ZY001',
|
personaId: 'ICE-P-ZY001',
|
||||||
repositoryPaths: ['/persona'],
|
repositoryPaths: ['/persona'],
|
||||||
providers: [provider],
|
providers: [provider],
|
||||||
personaAuthorized: false,
|
|
||||||
developmentId: 'DEV-20260811-010',
|
developmentId: 'DEV-20260811-010',
|
||||||
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-12.9',
|
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-12.10',
|
||||||
}))
|
}))
|
||||||
expect(await screen.findByText('我还不能执行:需要当前证据。')).toBeInTheDocument()
|
expect(await screen.findByText('我还不能执行:需要当前证据。')).toBeInTheDocument()
|
||||||
expect(screen.getByText('核验当前事实后规划下一步')).toBeInTheDocument()
|
expect(screen.getByText('核验当前事实后规划下一步')).toBeInTheDocument()
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import {
|
||||||
type LanguageShellViewState,
|
type LanguageShellViewState,
|
||||||
} from './HotPluggableLanguageShell'
|
} from './HotPluggableLanguageShell'
|
||||||
|
|
||||||
const CURRENT_ARCHITECTURE_ANCHOR = 'HLP-CURRENT-ARCH-001@2026-08-12.9'
|
const CURRENT_ARCHITECTURE_ANCHOR = 'HLP-CURRENT-ARCH-001@2026-08-12.10'
|
||||||
const DEVELOPMENT_ID = 'DEV-20260811-010'
|
const DEVELOPMENT_ID = 'DEV-20260811-010'
|
||||||
|
|
||||||
type Planner = typeof planPersonaLanguageShellGoal
|
type Planner = typeof planPersonaLanguageShellGoal
|
||||||
|
|
@ -103,9 +103,8 @@ export function PersonaLanguageShellPanel({
|
||||||
personaId,
|
personaId,
|
||||||
repositoryPaths,
|
repositoryPaths,
|
||||||
providers,
|
providers,
|
||||||
// No desktop authorization receipt is wired yet, so this source slice
|
// No native authorization receipt loader is wired yet. The controller
|
||||||
// must remain system-direct even after partner deliberation succeeds.
|
// therefore remains system-direct even after deliberation succeeds.
|
||||||
personaAuthorized: false,
|
|
||||||
requestId: requestId(),
|
requestId: requestId(),
|
||||||
modelInstanceId: `hololake-desktop:${personaId}`,
|
modelInstanceId: `hololake-desktop:${personaId}`,
|
||||||
developmentId: DEVELOPMENT_ID,
|
developmentId: DEVELOPMENT_ID,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
import { describe, expect, it } from 'vitest'
|
||||||
|
import {
|
||||||
|
PERSONA_CONTROL_AUTHORIZATION_SCHEMA,
|
||||||
|
PERSONA_PRIMARY_LANGUAGE_PLANNING_SCOPE,
|
||||||
|
hasPersonaPrimaryControlAuthorization,
|
||||||
|
} from './personaControlAuthorization'
|
||||||
|
|
||||||
|
const expected = {
|
||||||
|
personaId: 'ICE-P-ZY001',
|
||||||
|
humanResponsibilitySubject: 'BINGSHUO',
|
||||||
|
repositoryHead: 'a'.repeat(40),
|
||||||
|
modelInstanceId: 'MODEL-INSTANCE-001',
|
||||||
|
requestId: 'REQ-001',
|
||||||
|
sourceLanguageAnchor: 'HLP-CURRENT-ARCH-001@2026-08-12.10',
|
||||||
|
observedAt: Date.parse('2026-08-12T04:35:00+08:00'),
|
||||||
|
}
|
||||||
|
|
||||||
|
const receipt = {
|
||||||
|
schema: PERSONA_CONTROL_AUTHORIZATION_SCHEMA,
|
||||||
|
outcome: 'VERIFIED',
|
||||||
|
authorizationId: 'AUTH-001',
|
||||||
|
verifier: 'GUANGHU_OS',
|
||||||
|
scope: PERSONA_PRIMARY_LANGUAGE_PLANNING_SCOPE,
|
||||||
|
personaId: expected.personaId,
|
||||||
|
humanResponsibilitySubject: expected.humanResponsibilitySubject,
|
||||||
|
repositoryHead: expected.repositoryHead,
|
||||||
|
modelInstanceId: expected.modelInstanceId,
|
||||||
|
requestId: expected.requestId,
|
||||||
|
sourceLanguageAnchor: expected.sourceLanguageAnchor,
|
||||||
|
issuedAt: '2026-08-12T04:30:00+08:00',
|
||||||
|
validUntil: '2026-08-12T04:40:00+08:00',
|
||||||
|
evidenceDigest: 'b'.repeat(64),
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('hasPersonaPrimaryControlAuthorization', () => {
|
||||||
|
it('accepts only an exact, current, Guanghu OS verified planning receipt', () => {
|
||||||
|
expect(hasPersonaPrimaryControlAuthorization(receipt, expected)).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
['missing', null],
|
||||||
|
['wrong persona', { ...receipt, personaId: 'OTHER' }],
|
||||||
|
['wrong repository head', { ...receipt, repositoryHead: 'c'.repeat(40) }],
|
||||||
|
['wrong model instance', { ...receipt, modelInstanceId: 'OTHER' }],
|
||||||
|
['wrong request', { ...receipt, requestId: 'OTHER' }],
|
||||||
|
['wrong language anchor', { ...receipt, sourceLanguageAnchor: 'old' }],
|
||||||
|
['unverified', { ...receipt, outcome: 'PENDING' }],
|
||||||
|
['expired', { ...receipt, validUntil: '2026-08-12T04:34:59+08:00' }],
|
||||||
|
['future', { ...receipt, issuedAt: '2026-08-12T04:35:01+08:00' }],
|
||||||
|
['invalid digest', { ...receipt, evidenceDigest: 'not-a-digest' }],
|
||||||
|
])('fails closed for %s evidence', (_label, candidate) => {
|
||||||
|
expect(hasPersonaPrimaryControlAuthorization(candidate, expected)).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
export const PERSONA_CONTROL_AUTHORIZATION_SCHEMA = 'hololake.persona-control-authorization/v1' as const
|
||||||
|
export const PERSONA_PRIMARY_LANGUAGE_PLANNING_SCOPE = 'PERSONA_PRIMARY_LANGUAGE_PLANNING' as const
|
||||||
|
|
||||||
|
export type PersonaControlAuthorizationReceipt = {
|
||||||
|
schema: typeof PERSONA_CONTROL_AUTHORIZATION_SCHEMA
|
||||||
|
outcome: 'VERIFIED'
|
||||||
|
authorizationId: string
|
||||||
|
verifier: 'GUANGHU_OS'
|
||||||
|
scope: typeof PERSONA_PRIMARY_LANGUAGE_PLANNING_SCOPE
|
||||||
|
personaId: string
|
||||||
|
humanResponsibilitySubject: string
|
||||||
|
repositoryHead: string
|
||||||
|
modelInstanceId: string
|
||||||
|
requestId: string
|
||||||
|
sourceLanguageAnchor: string
|
||||||
|
issuedAt: string
|
||||||
|
validUntil: string
|
||||||
|
evidenceDigest: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PersonaControlAuthorizationExpectation = {
|
||||||
|
personaId: string
|
||||||
|
humanResponsibilitySubject: string
|
||||||
|
repositoryHead: string
|
||||||
|
modelInstanceId: string
|
||||||
|
requestId: string
|
||||||
|
sourceLanguageAnchor: string
|
||||||
|
observedAt?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
||||||
|
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
function exactString(record: Record<string, unknown>, key: string, expected: string): boolean {
|
||||||
|
return Reflect.get(record, key) === expected
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts only a native-verifier receipt bound to this exact planning request.
|
||||||
|
* It does not issue authority and treats absent or stale evidence as system-direct.
|
||||||
|
*/
|
||||||
|
export function hasPersonaPrimaryControlAuthorization(
|
||||||
|
receipt: unknown,
|
||||||
|
expected: PersonaControlAuthorizationExpectation,
|
||||||
|
): receipt is PersonaControlAuthorizationReceipt {
|
||||||
|
if (!isRecord(receipt)) return false
|
||||||
|
if (!exactString(receipt, 'schema', PERSONA_CONTROL_AUTHORIZATION_SCHEMA)
|
||||||
|
|| !exactString(receipt, 'outcome', 'VERIFIED')
|
||||||
|
|| !exactString(receipt, 'verifier', 'GUANGHU_OS')
|
||||||
|
|| !exactString(receipt, 'scope', PERSONA_PRIMARY_LANGUAGE_PLANNING_SCOPE)
|
||||||
|
|| !exactString(receipt, 'personaId', expected.personaId)
|
||||||
|
|| !exactString(receipt, 'humanResponsibilitySubject', expected.humanResponsibilitySubject)
|
||||||
|
|| !exactString(receipt, 'repositoryHead', expected.repositoryHead)
|
||||||
|
|| !exactString(receipt, 'modelInstanceId', expected.modelInstanceId)
|
||||||
|
|| !exactString(receipt, 'requestId', expected.requestId)
|
||||||
|
|| !exactString(receipt, 'sourceLanguageAnchor', expected.sourceLanguageAnchor)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const authorizationId = Reflect.get(receipt, 'authorizationId')
|
||||||
|
const evidenceDigest = Reflect.get(receipt, 'evidenceDigest')
|
||||||
|
const issuedAt = Reflect.get(receipt, 'issuedAt')
|
||||||
|
const validUntil = Reflect.get(receipt, 'validUntil')
|
||||||
|
if (typeof authorizationId !== 'string' || !authorizationId.trim()
|
||||||
|
|| typeof evidenceDigest !== 'string' || !/^[a-f0-9]{64}$/.test(evidenceDigest)
|
||||||
|
|| typeof issuedAt !== 'string'
|
||||||
|
|| typeof validUntil !== 'string') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const issuedAtMs = Date.parse(issuedAt)
|
||||||
|
const validUntilMs = Date.parse(validUntil)
|
||||||
|
const observedAt = expected.observedAt ?? Date.now()
|
||||||
|
return Number.isFinite(issuedAtMs)
|
||||||
|
&& Number.isFinite(validUntilMs)
|
||||||
|
&& issuedAtMs <= observedAt
|
||||||
|
&& observedAt <= validUntilMs
|
||||||
|
&& issuedAtMs < validUntilMs
|
||||||
|
}
|
||||||
|
|
@ -96,7 +96,6 @@ function input() {
|
||||||
personaId: 'ICE-P-ZY001',
|
personaId: 'ICE-P-ZY001',
|
||||||
repositoryPaths: ['/persona/zhuyuan'],
|
repositoryPaths: ['/persona/zhuyuan'],
|
||||||
providers: [provider],
|
providers: [provider],
|
||||||
personaAuthorized: true,
|
|
||||||
requestId: 'REQ-001',
|
requestId: 'REQ-001',
|
||||||
modelInstanceId: 'MODEL-INSTANCE-001',
|
modelInstanceId: 'MODEL-INSTANCE-001',
|
||||||
developmentId: 'DEV-20260811-010',
|
developmentId: 'DEV-20260811-010',
|
||||||
|
|
@ -173,6 +172,41 @@ describe('planPersonaLanguageShellGoal', () => {
|
||||||
})
|
})
|
||||||
expect(loadDeviceIdentity).toHaveBeenCalledTimes(1)
|
expect(loadDeviceIdentity).toHaveBeenCalledTimes(1)
|
||||||
expect(planGoal).toHaveBeenCalledTimes(1)
|
expect(planGoal).toHaveBeenCalledTimes(1)
|
||||||
|
expect(planGoal).toHaveBeenCalledWith(expect.objectContaining({ personaAuthorized: false }))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('enables persona-primary planning only for an exact request-bound authorization receipt', async () => {
|
||||||
|
const planGoal = vi.fn().mockResolvedValue(plannedGoal)
|
||||||
|
|
||||||
|
await planPersonaLanguageShellGoal({
|
||||||
|
...input(),
|
||||||
|
loadPersonaControlAuthorization: vi.fn().mockResolvedValue({
|
||||||
|
schema: 'hololake.persona-control-authorization/v1',
|
||||||
|
outcome: 'VERIFIED',
|
||||||
|
authorizationId: 'AUTH-001',
|
||||||
|
verifier: 'GUANGHU_OS',
|
||||||
|
scope: 'PERSONA_PRIMARY_LANGUAGE_PLANNING',
|
||||||
|
personaId: repositoryBinding.personaId,
|
||||||
|
humanResponsibilitySubject: repositoryBinding.humanResponsibilitySubject,
|
||||||
|
repositoryHead: repositoryBinding.gitHead,
|
||||||
|
modelInstanceId: 'MODEL-INSTANCE-001',
|
||||||
|
requestId: 'REQ-001',
|
||||||
|
sourceLanguageAnchor: 'current-human-utterance',
|
||||||
|
issuedAt: '2026-08-12T04:30:00+08:00',
|
||||||
|
validUntil: '2026-08-12T04:40:00+08:00',
|
||||||
|
evidenceDigest: 'c'.repeat(64),
|
||||||
|
}),
|
||||||
|
authorizationObservedAt: Date.parse('2026-08-12T04:35:00+08:00'),
|
||||||
|
resolveRepository: vi.fn().mockResolvedValue(boundResolution()),
|
||||||
|
loadDeviceIdentity: vi.fn().mockResolvedValue({
|
||||||
|
schema: 'guanghu.router-device/v1',
|
||||||
|
device_id: 'HL-DEVICE-001',
|
||||||
|
public_key: 'public-key',
|
||||||
|
}),
|
||||||
|
planGoal,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(planGoal).toHaveBeenCalledWith(expect.objectContaining({ personaAuthorized: true }))
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns a stable binding error and never invokes cognition for invalid device evidence', async () => {
|
it('returns a stable binding error and never invokes cognition for invalid device evidence', async () => {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import { invoke } from '@tauri-apps/api/core'
|
||||||
import { isTauri, mockInvoke } from '../mock-tauri'
|
import { isTauri, mockInvoke } from '../mock-tauri'
|
||||||
import type { AiModelProvider } from './aiTargets'
|
import type { AiModelProvider } from './aiTargets'
|
||||||
import type { LanguageGoalProjection, RealityBoundary } from './languageOperatingModel'
|
import type { LanguageGoalProjection, RealityBoundary } from './languageOperatingModel'
|
||||||
|
import { hasPersonaPrimaryControlAuthorization } from './personaControlAuthorization'
|
||||||
import {
|
import {
|
||||||
planPersonaLanguageGoal,
|
planPersonaLanguageGoal,
|
||||||
type PersonaLanguageGoalBinding,
|
type PersonaLanguageGoalBinding,
|
||||||
|
|
@ -34,6 +35,14 @@ export type PersonaLanguageShellPlan =
|
||||||
type RepositoryResolver = typeof resolvePersonaRepositoryBinding
|
type RepositoryResolver = typeof resolvePersonaRepositoryBinding
|
||||||
type GoalPlanner = (input: PlanPersonaLanguageGoalInput) => Promise<LanguageGoalProjection>
|
type GoalPlanner = (input: PlanPersonaLanguageGoalInput) => Promise<LanguageGoalProjection>
|
||||||
type DeviceIdentityLoader = () => Promise<unknown>
|
type DeviceIdentityLoader = () => Promise<unknown>
|
||||||
|
type PersonaControlAuthorizationLoader = (input: {
|
||||||
|
personaId: string
|
||||||
|
humanResponsibilitySubject: string
|
||||||
|
repositoryHead: string
|
||||||
|
modelInstanceId: string
|
||||||
|
requestId: string
|
||||||
|
sourceLanguageAnchor: string
|
||||||
|
}) => Promise<unknown>
|
||||||
|
|
||||||
async function loadNativeDeviceIdentity(): Promise<unknown> {
|
async function loadNativeDeviceIdentity(): Promise<unknown> {
|
||||||
return isTauri()
|
return isTauri()
|
||||||
|
|
@ -41,6 +50,10 @@ async function loadNativeDeviceIdentity(): Promise<unknown> {
|
||||||
: mockInvoke<unknown>('guanghu_router_device_identity')
|
: mockInvoke<unknown>('guanghu_router_device_identity')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function loadNoPersonaControlAuthorization(): Promise<null> {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
function errorCode(error: unknown, fallback: string): string {
|
function errorCode(error: unknown, fallback: string): string {
|
||||||
return error instanceof Error && error.message.trim() ? error.message : fallback
|
return error instanceof Error && error.message.trim() ? error.message : fallback
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +79,7 @@ export async function planPersonaLanguageShellGoal({
|
||||||
personaId,
|
personaId,
|
||||||
repositoryPaths,
|
repositoryPaths,
|
||||||
providers,
|
providers,
|
||||||
personaAuthorized,
|
authorizationObservedAt,
|
||||||
detectedBoundaries,
|
detectedBoundaries,
|
||||||
requestId,
|
requestId,
|
||||||
modelInstanceId,
|
modelInstanceId,
|
||||||
|
|
@ -74,13 +87,14 @@ export async function planPersonaLanguageShellGoal({
|
||||||
sourceLanguageAnchor,
|
sourceLanguageAnchor,
|
||||||
resolveRepository = resolvePersonaRepositoryBinding,
|
resolveRepository = resolvePersonaRepositoryBinding,
|
||||||
loadDeviceIdentity = loadNativeDeviceIdentity,
|
loadDeviceIdentity = loadNativeDeviceIdentity,
|
||||||
|
loadPersonaControlAuthorization = loadNoPersonaControlAuthorization,
|
||||||
planGoal = planPersonaLanguageGoal,
|
planGoal = planPersonaLanguageGoal,
|
||||||
}: {
|
}: {
|
||||||
utterance: string
|
utterance: string
|
||||||
personaId: string
|
personaId: string
|
||||||
repositoryPaths: readonly string[]
|
repositoryPaths: readonly string[]
|
||||||
providers: readonly AiModelProvider[]
|
providers: readonly AiModelProvider[]
|
||||||
personaAuthorized: boolean
|
authorizationObservedAt?: number
|
||||||
detectedBoundaries?: RealityBoundary[]
|
detectedBoundaries?: RealityBoundary[]
|
||||||
requestId: string
|
requestId: string
|
||||||
modelInstanceId: string
|
modelInstanceId: string
|
||||||
|
|
@ -88,6 +102,7 @@ export async function planPersonaLanguageShellGoal({
|
||||||
sourceLanguageAnchor: string
|
sourceLanguageAnchor: string
|
||||||
resolveRepository?: RepositoryResolver
|
resolveRepository?: RepositoryResolver
|
||||||
loadDeviceIdentity?: DeviceIdentityLoader
|
loadDeviceIdentity?: DeviceIdentityLoader
|
||||||
|
loadPersonaControlAuthorization?: PersonaControlAuthorizationLoader
|
||||||
planGoal?: GoalPlanner
|
planGoal?: GoalPlanner
|
||||||
}): Promise<PersonaLanguageShellPlan> {
|
}): Promise<PersonaLanguageShellPlan> {
|
||||||
const repository = await resolveRepository({ personaId, repositoryPaths })
|
const repository = await resolveRepository({ personaId, repositoryPaths })
|
||||||
|
|
@ -121,6 +136,28 @@ export async function planPersonaLanguageShellGoal({
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const authorizationExpectation = {
|
||||||
|
personaId: repository.binding.personaId,
|
||||||
|
humanResponsibilitySubject: repository.binding.humanResponsibilitySubject,
|
||||||
|
repositoryHead: repository.binding.gitHead,
|
||||||
|
modelInstanceId,
|
||||||
|
requestId,
|
||||||
|
sourceLanguageAnchor,
|
||||||
|
}
|
||||||
|
let personaAuthorizationReceipt: unknown = null
|
||||||
|
try {
|
||||||
|
personaAuthorizationReceipt = await loadPersonaControlAuthorization(authorizationExpectation)
|
||||||
|
} catch {
|
||||||
|
// Authorization discovery is fail-closed but does not prevent safe,
|
||||||
|
// system-direct partner planning.
|
||||||
|
}
|
||||||
|
const personaAuthorized = hasPersonaPrimaryControlAuthorization(
|
||||||
|
personaAuthorizationReceipt,
|
||||||
|
{
|
||||||
|
...authorizationExpectation,
|
||||||
|
observedAt: authorizationObservedAt,
|
||||||
|
},
|
||||||
|
)
|
||||||
const goal = await planGoal({
|
const goal = await planGoal({
|
||||||
utterance,
|
utterance,
|
||||||
personaAuthorized,
|
personaAuthorized,
|
||||||
|
|
|
||||||
|
|
@ -121,9 +121,12 @@
|
||||||
"language_wake_binding_compiler_tests": "product-source/hololake-platform/src/lib/personaLanguageGoalBinding.test.ts",
|
"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": "product-source/hololake-platform/src/lib/personaLanguageShellController.ts",
|
||||||
"language_shell_controller_tests": "product-source/hololake-platform/src/lib/personaLanguageShellController.test.ts",
|
"language_shell_controller_tests": "product-source/hololake-platform/src/lib/personaLanguageShellController.test.ts",
|
||||||
|
"persona_control_authorization_receipt": "product-source/hololake-platform/src/lib/personaControlAuthorization.ts",
|
||||||
|
"persona_control_authorization_receipt_tests": "product-source/hololake-platform/src/lib/personaControlAuthorization.test.ts",
|
||||||
"desktop_language_shell": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx",
|
"desktop_language_shell": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.tsx",
|
||||||
"desktop_language_shell_tests": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx",
|
"desktop_language_shell_tests": "product-source/hololake-platform/src/components/PersonaLanguageShellPanel.test.tsx",
|
||||||
"human_utterance_is_direct_command": false,
|
"human_utterance_is_direct_command": false,
|
||||||
|
"caller_supplied_persona_authorization_boolean_allowed": false,
|
||||||
"required_before_capability_execution": [
|
"required_before_capability_execution": [
|
||||||
"RESTORE_REAL_PURPOSE_FROM_CONTEXT",
|
"RESTORE_REAL_PURPOSE_FROM_CONTEXT",
|
||||||
"ASSESS_REQUEST_VALIDITY",
|
"ASSESS_REQUEST_VALIDITY",
|
||||||
|
|
@ -140,6 +143,7 @@
|
||||||
},
|
},
|
||||||
"remaining_before_vertical_slice_acceptance": [
|
"remaining_before_vertical_slice_acceptance": [
|
||||||
"REAL_PERSONA_REPOSITORY_MANIFEST_BINDING",
|
"REAL_PERSONA_REPOSITORY_MANIFEST_BINDING",
|
||||||
|
"NATIVE_PERSONA_CONTROL_AUTHORIZATION_RECEIPT_LOADER",
|
||||||
"DESKTOP_LIFECYCLE_RUNTIME_ACCEPTANCE"
|
"DESKTOP_LIFECYCLE_RUNTIME_ACCEPTANCE"
|
||||||
],
|
],
|
||||||
"next_after_vertical_slice": [
|
"next_after_vertical_slice": [
|
||||||
|
|
@ -165,7 +169,9 @@
|
||||||
"persona_repository_binding_discovery_source_implemented": 100,
|
"persona_repository_binding_discovery_source_implemented": 100,
|
||||||
"persona_language_wake_binding_compiler_source_implemented": 100,
|
"persona_language_wake_binding_compiler_source_implemented": 100,
|
||||||
"persona_language_shell_controller_source_implemented": 100,
|
"persona_language_shell_controller_source_implemented": 100,
|
||||||
|
"persona_control_authorization_receipt_source_implemented": 100,
|
||||||
"desktop_language_entry_source_integrated": 100,
|
"desktop_language_entry_source_integrated": 100,
|
||||||
|
"persona_control_authorization_runtime_integrated": 0,
|
||||||
"real_persona_repository_manifest_bound": 0,
|
"real_persona_repository_manifest_bound": 0,
|
||||||
"natural_language_partner_adapter_runtime_integrated": 0,
|
"natural_language_partner_adapter_runtime_integrated": 0,
|
||||||
"single_age_vertical_loop_implemented": 0,
|
"single_age_vertical_loop_implemented": 0,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ const age = readJson("routing/hololake-age-runtime-architecture.json");
|
||||||
const rules = readJson("routing/hololake-engineering-rules.json");
|
const rules = readJson("routing/hololake-engineering-rules.json");
|
||||||
|
|
||||||
test("B0 is restored before product organs and remains resident in every cognition step", () => {
|
test("B0 is restored before product organs and remains resident in every cognition step", () => {
|
||||||
assert.equal(architecture.version, "2026-08-12.9");
|
assert.equal(architecture.version, "2026-08-12.10");
|
||||||
assert.equal(
|
assert.equal(
|
||||||
architecture.read_order[1],
|
architecture.read_order[1],
|
||||||
architecture.cognitive_gravity_and_continuity.architecture_page,
|
architecture.cognitive_gravity_and_continuity.architecture_page,
|
||||||
|
|
@ -95,7 +95,9 @@ 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_repository_binding_discovery_source_implemented, 100);
|
||||||
assert.equal(gravity.truth.persona_language_wake_binding_compiler_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.persona_language_shell_controller_source_implemented, 100);
|
||||||
|
assert.equal(gravity.truth.persona_control_authorization_receipt_source_implemented, 100);
|
||||||
assert.equal(gravity.truth.desktop_language_entry_source_integrated, 100);
|
assert.equal(gravity.truth.desktop_language_entry_source_integrated, 100);
|
||||||
|
assert.equal(gravity.truth.persona_control_authorization_runtime_integrated, 0);
|
||||||
assert.equal(gravity.truth.real_persona_repository_manifest_bound, 0);
|
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.natural_language_partner_adapter_runtime_integrated, 0);
|
||||||
assert.equal(gravity.truth.single_age_vertical_loop_implemented, 0);
|
assert.equal(gravity.truth.single_age_vertical_loop_implemented, 0);
|
||||||
|
|
@ -117,8 +119,10 @@ test("natural language enters partner deliberation before any execution organ",
|
||||||
assert.match(entry.repository_binding_discovery, /personaRepositoryBinding\.ts$/);
|
assert.match(entry.repository_binding_discovery, /personaRepositoryBinding\.ts$/);
|
||||||
assert.match(entry.language_wake_binding_compiler, /personaLanguageGoalBinding\.ts$/);
|
assert.match(entry.language_wake_binding_compiler, /personaLanguageGoalBinding\.ts$/);
|
||||||
assert.match(entry.language_shell_controller, /personaLanguageShellController\.ts$/);
|
assert.match(entry.language_shell_controller, /personaLanguageShellController\.ts$/);
|
||||||
|
assert.match(entry.persona_control_authorization_receipt, /personaControlAuthorization\.ts$/);
|
||||||
assert.match(entry.desktop_language_shell, /PersonaLanguageShellPanel\.tsx$/);
|
assert.match(entry.desktop_language_shell, /PersonaLanguageShellPanel\.tsx$/);
|
||||||
assert.equal(entry.human_utterance_is_direct_command, false);
|
assert.equal(entry.human_utterance_is_direct_command, false);
|
||||||
|
assert.equal(entry.caller_supplied_persona_authorization_boolean_allowed, false);
|
||||||
assert.equal(entry.language_home_destruction_is_executable, false);
|
assert.equal(entry.language_home_destruction_is_executable, false);
|
||||||
assert.equal(entry.integrity_gate_may_absorb_human_sovereignty, false);
|
assert.equal(entry.integrity_gate_may_absorb_human_sovereignty, false);
|
||||||
assert.deepEqual(entry.required_before_capability_execution, [
|
assert.deepEqual(entry.required_before_capability_execution, [
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"schema": "hololake.current-architecture/v1",
|
"schema": "hololake.current-architecture/v1",
|
||||||
"architecture_id": "HLP-CURRENT-ARCH-001",
|
"architecture_id": "HLP-CURRENT-ARCH-001",
|
||||||
"version": "2026-08-12.9",
|
"version": "2026-08-12.10",
|
||||||
"state": "CURRENT_CANONICAL",
|
"state": "CURRENT_CANONICAL",
|
||||||
"product": {
|
"product": {
|
||||||
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
|
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
|
||||||
|
|
@ -115,7 +115,9 @@
|
||||||
"persona_repository_binding_read_only_ui_source_integrated": true,
|
"persona_repository_binding_read_only_ui_source_integrated": true,
|
||||||
"persona_runtime_projection_repository_gate_source_integrated": true,
|
"persona_runtime_projection_repository_gate_source_integrated": true,
|
||||||
"persona_language_shell_controller_source_implemented": true,
|
"persona_language_shell_controller_source_implemented": true,
|
||||||
|
"persona_control_authorization_receipt_source_implemented": true,
|
||||||
"desktop_language_entry_source_integrated": true,
|
"desktop_language_entry_source_integrated": true,
|
||||||
|
"persona_control_authorization_runtime_integrated": false,
|
||||||
"real_persona_repository_manifest_bound": false,
|
"real_persona_repository_manifest_bound": false,
|
||||||
"natural_language_partner_adapter_runtime_integrated": false,
|
"natural_language_partner_adapter_runtime_integrated": false,
|
||||||
"required_natural_language_entry": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
"required_natural_language_entry": "PARTNER_DELIBERATION_AND_LANGUAGE_HOME_INTEGRITY_GATE",
|
||||||
|
|
@ -383,6 +385,10 @@
|
||||||
"tests": "product-source/hololake-platform/src/lib/languageOperatingModel.test.ts",
|
"tests": "product-source/hololake-platform/src/lib/languageOperatingModel.test.ts",
|
||||||
"pncc_lifecycle_adapter": "product-source/hololake-platform/src/lib/personaLanguageGoal.ts",
|
"pncc_lifecycle_adapter": "product-source/hololake-platform/src/lib/personaLanguageGoal.ts",
|
||||||
"pncc_lifecycle_adapter_tests": "product-source/hololake-platform/src/lib/personaLanguageGoal.test.ts",
|
"pncc_lifecycle_adapter_tests": "product-source/hololake-platform/src/lib/personaLanguageGoal.test.ts",
|
||||||
|
"persona_control_authorization_receipt": "product-source/hololake-platform/src/lib/personaControlAuthorization.ts",
|
||||||
|
"persona_control_authorization_receipt_tests": "product-source/hololake-platform/src/lib/personaControlAuthorization.test.ts",
|
||||||
|
"caller_supplied_persona_authorization_boolean_allowed": false,
|
||||||
|
"native_authorization_receipt_loader_integrated": false,
|
||||||
"partner_deliberation_required": true,
|
"partner_deliberation_required": true,
|
||||||
"human_utterance_is_direct_command": false,
|
"human_utterance_is_direct_command": false,
|
||||||
"allowed_dispositions": [
|
"allowed_dispositions": [
|
||||||
|
|
@ -391,7 +397,8 @@
|
||||||
"REVISE",
|
"REVISE",
|
||||||
"REFUSE"
|
"REFUSE"
|
||||||
],
|
],
|
||||||
"focused_tests": "11_OF_11_PASS"
|
"focused_tests": "11_OF_11_PASS",
|
||||||
|
"authorization_focused_tests": "11_OF_11_PASS"
|
||||||
},
|
},
|
||||||
"ui_plugin_system": {
|
"ui_plugin_system": {
|
||||||
"record_id": "HLP-HOT-PLUGGABLE-UI-001",
|
"record_id": "HLP-HOT-PLUGGABLE-UI-001",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue