feat: add signed numbered module lifecycle
This commit is contained in:
parent
d30d84631d
commit
7673c337fc
18 changed files with 1622 additions and 12 deletions
|
|
@ -165,12 +165,26 @@
|
|||
"ONLY_THEN_ASSIGN_PERMANENT_MODULE_NUMBER"
|
||||
],
|
||||
"hot_install_boundary": {
|
||||
"runtime_state": "SIGNED_DECLARATIVE_PACKAGE_ENGINE_IMPLEMENTED",
|
||||
"runtime_contract": "contracts/module-package-runtime.json",
|
||||
"numbered_module_runtime_operations": [
|
||||
"HLP-NIPC-OP-0063",
|
||||
"HLP-NIPC-OP-0064",
|
||||
"HLP-NIPC-OP-0065",
|
||||
"HLP-NIPC-OP-0066",
|
||||
"HLP-NIPC-OP-0067",
|
||||
"HLP-NIPC-OP-0068",
|
||||
"HLP-NIPC-OP-0069"
|
||||
],
|
||||
"source_repository_is_directly_executable": false,
|
||||
"immutable_signed_artifact_required": true,
|
||||
"compatibility_manifest_required": true,
|
||||
"permissions_declared_before_mount": true,
|
||||
"human_confirmation_required_when_boundary_expands": true,
|
||||
"rollback_on_self_test_failure": true,
|
||||
"user_data_survives_unmount": true
|
||||
"user_data_survives_unmount": true,
|
||||
"arbitrary_native_code_allowed": false,
|
||||
"arbitrary_webview_javascript_allowed": false,
|
||||
"real_signed_acceptance_fixture": "fixtures/module-packages/HLP-MOD-LOCAL-RUNTIME-ACCEPTANCE-0001-0.1.0.ghmod"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"schema": "hololake.module-package-runtime/v1",
|
||||
"record_id": "HLP-MODULE-PACKAGE-RUNTIME-001",
|
||||
"protocols": ["GLS-0710", "GLS-0803", "GLS-0819", "GLS-0310"],
|
||||
"package_schema": "hololake.module-package/v1",
|
||||
"signature": {
|
||||
"algorithm": "MINISIGN_ED25519",
|
||||
"trust_source": "src-tauri/release-trust.json",
|
||||
"signature_is_detached": true,
|
||||
"package_bytes_are_signed_exactly": true,
|
||||
"source_repository_is_executable": false
|
||||
},
|
||||
"number_classes": {
|
||||
"official": "HLP-MOD-OFFICIAL-*",
|
||||
"private_channel": "HLP-MOD-LOCAL-*",
|
||||
"candidate_number_is_runtime_number": false
|
||||
},
|
||||
"host": {
|
||||
"version": "0.5.0",
|
||||
"maximum_package_bytes": 16777216,
|
||||
"arbitrary_native_code": false,
|
||||
"arbitrary_webview_javascript": false,
|
||||
"declarative_payload_only": true
|
||||
},
|
||||
"registered_adapters": [
|
||||
"native-composition-v1",
|
||||
"channel-workbench-v1",
|
||||
"persona-channel-body-v1",
|
||||
"education-workbench-v1",
|
||||
"web-novel-workbench-v1",
|
||||
"mobile-sync-v1",
|
||||
"dynamic-language-world-surface-v1"
|
||||
],
|
||||
"lifecycle": [
|
||||
"INSTALLED_DORMANT",
|
||||
"MOUNTED_PENDING_SELF_TEST",
|
||||
"ACTIVE",
|
||||
"DORMANT",
|
||||
"ROLLBACK_PENDING_SELF_TEST",
|
||||
"FAILED_CLOSED"
|
||||
],
|
||||
"rules": {
|
||||
"verified_human_route_required": true,
|
||||
"permission_expansion_requires_human_confirmation": true,
|
||||
"mount_never_executes_package_code": true,
|
||||
"self_test_before_active": true,
|
||||
"failed_self_test_rolls_back": true,
|
||||
"restart_reconstructs_from_sqlite": true,
|
||||
"unmount_preserves_user_data": true,
|
||||
"every_mutation_writes_hash_chained_receipt": true
|
||||
}
|
||||
}
|
||||
|
|
@ -60,7 +60,8 @@
|
|||
"get_zero_core_numbering_kernel",
|
||||
"zero_point_verify",
|
||||
"zero_point_sync",
|
||||
"zero_point_status"
|
||||
"zero_point_status",
|
||||
"get_module_runtime_snapshot"
|
||||
],
|
||||
"input_wrapper_aliases": [
|
||||
"confirm_hololake_update_install",
|
||||
|
|
@ -91,7 +92,13 @@
|
|||
"inspect_mounted_pncc_repository",
|
||||
"confirm_pncc_repository_mount",
|
||||
"query_pncc_receipt_projection",
|
||||
"zero_point_bind"
|
||||
"zero_point_bind",
|
||||
"verify_module_package",
|
||||
"install_module_package",
|
||||
"mount_module",
|
||||
"self_test_module",
|
||||
"unmount_module",
|
||||
"rollback_module"
|
||||
],
|
||||
"direct_field_aliases": {
|
||||
"perform_code_repo_login": [
|
||||
|
|
@ -917,6 +924,83 @@
|
|||
"admission": "PREAUTH_SYSTEM_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/zero_point_status/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0063",
|
||||
"alias": "get_module_runtime_snapshot",
|
||||
"handler": "module_package_runtime::get_module_runtime_snapshot",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "READ_OR_STATUS",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/get_module_runtime_snapshot/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0064",
|
||||
"alias": "verify_module_package",
|
||||
"handler": "module_package_runtime::verify_module_package",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "READ_OR_STATUS",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/verify_module_package/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0065",
|
||||
"alias": "install_module_package",
|
||||
"handler": "module_package_runtime::install_module_package",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/install_module_package/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0066",
|
||||
"alias": "mount_module",
|
||||
"handler": "module_package_runtime::mount_module",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/mount_module/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0067",
|
||||
"alias": "self_test_module",
|
||||
"handler": "module_package_runtime::self_test_module",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/self_test_module/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0068",
|
||||
"alias": "unmount_module",
|
||||
"handler": "module_package_runtime::unmount_module",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/unmount_module/v1"
|
||||
},
|
||||
{
|
||||
"operation_number": "HLP-NIPC-OP-0069",
|
||||
"alias": "rollback_module",
|
||||
"handler": "module_package_runtime::rollback_module",
|
||||
"channel_number": "HLP-NIPC-CH-0002",
|
||||
"module_number": "HLP-NIPC-MOD-0020",
|
||||
"target_number": "HLP-NIPC-TGT-0020",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"payload_schema": "hololake.numbered-ipc.payload/rollback_module/v1"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,8 @@ HoloLake 0.5.0 is the clean numbered-root base. The compiled 0.4.1 desktop appli
|
|||
|
||||
Each donor capability receives a candidate coordinate, but no permanent runtime module number, until one isolated admission cycle has reviewed provenance and permissions, allocated numbered IPC module/target/operation coordinates, implemented an adapter without raw Tauri invoke, passed negative-route and data tests, and produced installed mount, restart, unmount and rollback receipts. The admission order and candidate inventory are recorded in `contracts/module-donor-admission-registry.json`.
|
||||
|
||||
The module-package runtime is now the shared admission executor. It accepts an exact detached-minisign `.ghmod` artifact, validates the package and its compatibility/permission manifest, stores it inside the authenticated account, and advances only through numbered install, mount, self-test, unmount and rollback operations. Lifecycle state and receipts are durable SQLite records; unmount never removes user data. A package is declarative and selects a host-registered adapter: repositories, native binaries and arbitrary webview JavaScript are not executable module inputs. Public lighthouse numbers remain unavailable until a candidate completes its own installed acceptance; private channel packages use a separate local number class.
|
||||
|
||||
## Stage-one convergence verdict
|
||||
|
||||
The Tauri source in this directory is the only future HoloLake desktop mainline. An installed build of it is an acceptance candidate, not a separate product line and not proof that stage one exists. The Electron 0.8.0 product and the legacy Tauri/platform sources remain read-only UX, behavior, engineering and protected-data donors until inventory, backup, readback, reversible migration rehearsal and signed installed-runtime acceptance all pass.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"schema": "hololake.module-package/v1",
|
||||
"manifest": {
|
||||
"moduleNumber": "HLP-MOD-LOCAL-RUNTIME-ACCEPTANCE-0001",
|
||||
"registrationClass": "PRIVATE_CHANNEL_LOCAL",
|
||||
"displayName": "原生组合模块运行时验收包",
|
||||
"version": "0.1.0",
|
||||
"minimumHostVersion": "0.5.0",
|
||||
"adapter": "native-composition-v1",
|
||||
"contentDigest": "07bfafaaa0b06f160abc489edce2bc23a3b092520c8d6c6f4a5ce29cca4485ea",
|
||||
"permissions": [
|
||||
"KNOWLEDGE_READ",
|
||||
"PROJECTION_RENDER"
|
||||
],
|
||||
"userDataSchema": "hololake.module-data/native-composition/v1",
|
||||
"selfTest": {
|
||||
"kind": "DECLARATIVE_SCHEMA_V1",
|
||||
"expectedContentDigest": "07bfafaaa0b06f160abc489edce2bc23a3b092520c8d6c6f4a5ce29cca4485ea"
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"adapterContract": "hololake.native-composition-v1",
|
||||
"capabilities": [
|
||||
"READ_CURRENT_ACCOUNT_KNOWLEDGE",
|
||||
"PROJECT_SHARED_EXECUTION_RESULT"
|
||||
],
|
||||
"entry": "native-composition",
|
||||
"views": [
|
||||
"DASHBOARD",
|
||||
"COMPARISON",
|
||||
"VERTICAL_BAR",
|
||||
"CLASSIFICATION",
|
||||
"TABLE"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVReHJHQ2hTVDYvRThwcUdLRThMYkJLN29MM1NmVFVCcmh4dGdrbHdPVWlvdm45enpveUhBeFZ3VEM1TkNHRDBKdGFoN21OZHgzV0NSMFVvMk1TNW44Z3BtRS9GcmN5SHdvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3MDczNTkxCWZpbGU6SExQLU1PRC1MT0NBTC1SVU5USU1FLUFDQ0VQVEFOQ0UtMDAwMS0wLjEuMC5naG1vZApXRWZINVdEUG12SlNsdzRTMkFHRDV3V0NkSVhNYW92RmczRGZlU3M0ZU9nSnhjc1BWbU1ZS0x1cStoQXE5TE96cnV1S2FaQ1FnK0FGdFNEY1RvUGZBQT09Cg==
|
||||
|
|
@ -54,7 +54,7 @@
|
|||
},
|
||||
{
|
||||
"recordId": "HLP-NUMBERED-IPC-ROOT-001",
|
||||
"sha256": "f8373820f373ffb59df08952acc753d48c2e3a8a0d0df5dab486bd43d3e9ab70"
|
||||
"sha256": "09f5ed0933850d06df508387500ff8aa7d33c864b473647b675a2d5e405b68dc"
|
||||
},
|
||||
{
|
||||
"recordId": "HLP-NBROKER-ROOT-001",
|
||||
|
|
@ -69,7 +69,7 @@
|
|||
"everyAcceptedCallHasEvidenceClass": true,
|
||||
"mismatchedCoordinate": "FAIL_CLOSED"
|
||||
},
|
||||
"routeCount": 84,
|
||||
"routeCount": 91,
|
||||
"routes": [
|
||||
{
|
||||
"transport": "DIRECT_LOCAL_NUMBERED_BROKER",
|
||||
|
|
@ -855,6 +855,104 @@
|
|||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0011/HLP-NIPC-OP-0042/HLP-NIPC-TGT-0011"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0063",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "get_module_runtime_snapshot",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "READ_OR_STATUS",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0063/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0064",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "verify_module_package",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "READ_OR_STATUS",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0064/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0065",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "install_module_package",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0065/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0066",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "mount_module",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0066/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0067",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "self_test_module",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0067/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0068",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "unmount_module",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0068/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0069",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020",
|
||||
"alias": "rollback_module",
|
||||
"admission": "VERIFIED_HUMAN_ROUTE",
|
||||
"effect": "STATE_CHANGE",
|
||||
"evidence": "HASH_CHAINED_NUMBERED_IPC_RECEIPT",
|
||||
"path": "HLP-NUMBER-WORLD-ROOT-001/TAURI/HLP-NIPC-CH-0002/HLP-NIPC-MOD-0020/HLP-NIPC-OP-0069/HLP-NIPC-TGT-0020"
|
||||
},
|
||||
{
|
||||
"transport": "TAURI_WEBVIEW_NUMBERED_IPC",
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
|
|
|
|||
|
|
@ -31,9 +31,13 @@ test('legacy numbering donor is rejected and the numbered IPC root remains singu
|
|||
})
|
||||
|
||||
test('hot installation is artifact, permission, self-test and rollback backed', () => {
|
||||
assert.equal(catalog.hot_install_boundary.runtime_state, 'SIGNED_DECLARATIVE_PACKAGE_ENGINE_IMPLEMENTED')
|
||||
assert.equal(catalog.hot_install_boundary.numbered_module_runtime_operations.length, 7)
|
||||
assert.equal(catalog.hot_install_boundary.source_repository_is_directly_executable, false)
|
||||
assert.equal(catalog.hot_install_boundary.immutable_signed_artifact_required, true)
|
||||
assert.equal(catalog.hot_install_boundary.compatibility_manifest_required, true)
|
||||
assert.equal(catalog.hot_install_boundary.rollback_on_self_test_failure, true)
|
||||
assert.equal(catalog.hot_install_boundary.user_data_survives_unmount, true)
|
||||
assert.equal(catalog.hot_install_boundary.arbitrary_native_code_allowed, false)
|
||||
assert.equal(catalog.hot_install_boundary.arbitrary_webview_javascript_allowed, false)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
const contract = JSON.parse(readFileSync(new URL('../contracts/module-package-runtime.json', import.meta.url), 'utf8'))
|
||||
const registry = JSON.parse(readFileSync(new URL('../contracts/numbered-ipc-registry.json', import.meta.url), 'utf8'))
|
||||
const rust = readFileSync(new URL('../src-tauri/src/module_package_runtime.rs', import.meta.url), 'utf8')
|
||||
|
||||
test('module packages are signed declarative artifacts rather than executable repositories', () => {
|
||||
assert.equal(contract.schema, 'hololake.module-package-runtime/v1')
|
||||
assert.equal(contract.signature.source_repository_is_executable, false)
|
||||
assert.equal(contract.signature.package_bytes_are_signed_exactly, true)
|
||||
assert.equal(contract.host.arbitrary_native_code, false)
|
||||
assert.equal(contract.host.arbitrary_webview_javascript, false)
|
||||
assert.equal(contract.host.declarative_payload_only, true)
|
||||
assert.equal(contract.rules.self_test_before_active, true)
|
||||
assert.equal(contract.rules.failed_self_test_rolls_back, true)
|
||||
assert.equal(contract.rules.unmount_preserves_user_data, true)
|
||||
})
|
||||
|
||||
test('module lifecycle is reachable only through numbered verified-human routes', () => {
|
||||
const routes = registry.operations.filter((route) => route.module_number === 'HLP-NIPC-MOD-0020')
|
||||
assert.equal(routes.length, 7)
|
||||
assert.deepEqual(routes.map((route) => route.operation_number), [
|
||||
'HLP-NIPC-OP-0063',
|
||||
'HLP-NIPC-OP-0064',
|
||||
'HLP-NIPC-OP-0065',
|
||||
'HLP-NIPC-OP-0066',
|
||||
'HLP-NIPC-OP-0067',
|
||||
'HLP-NIPC-OP-0068',
|
||||
'HLP-NIPC-OP-0069',
|
||||
])
|
||||
assert.ok(routes.every((route) => route.admission === 'VERIFIED_HUMAN_ROUTE'))
|
||||
assert.match(rust, /MINISIGN_ED25519|PublicKey::decode/)
|
||||
assert.match(rust, /module_receipts/)
|
||||
assert.match(rust, /ROLLBACK_PENDING_SELF_TEST/)
|
||||
})
|
||||
|
|
@ -7,8 +7,8 @@ test('identity, webview and direct broker numbers compile into one unique eviden
|
|||
const generated = JSON.parse(readFileSync(new URL('../generated/unified-number-coordinate-tree.json', import.meta.url), 'utf8'))
|
||||
assert.deepEqual(generated, compileUnifiedNumberTree())
|
||||
assert.equal(generated.recordId, 'HLP-UNIFIED-NUMBER-TREE-001')
|
||||
assert.equal(generated.routeCount, 84)
|
||||
assert.equal(new Set(generated.routes.map((route) => route.path)).size, 84)
|
||||
assert.equal(generated.routeCount, 91)
|
||||
assert.equal(new Set(generated.routes.map((route) => route.path)).size, 91)
|
||||
assert.equal(generated.invariants.everyPhysicalCallHasNumberedRoute, true)
|
||||
assert.equal(generated.invariants.everyAcceptedCallHasEvidenceClass, true)
|
||||
assert.ok(generated.routes.every((route) => route.admission && route.evidence))
|
||||
|
|
|
|||
|
|
@ -33,10 +33,10 @@ url = "2"
|
|||
reqwest = { version = "0.13.2", default-features = false, features = ["cookies", "form", "json", "rustls", "stream"] }
|
||||
tokio = { version = "1", features = ["time"] }
|
||||
futures-util = "0.3"
|
||||
minisign-verify = "0.2.5"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
widestring = "1"
|
||||
|
||||
[dev-dependencies]
|
||||
minisign-verify = "0.2.5"
|
||||
tempfile = "3"
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ enum BrokerRequest {
|
|||
OpenSession(OpenSessionInput),
|
||||
ResumeSession(ResumeSessionInput),
|
||||
HeartbeatSession(AuthenticateSessionInput),
|
||||
PresentPersonaCarrierLicense(AuthenticatedPersonaCarrierLicenseInput),
|
||||
PresentPersonaCarrierLicense(Box<AuthenticatedPersonaCarrierLicenseInput>),
|
||||
GetPersonaCarrierLicenseStatus(AuthenticatedPersonaCarrierLicenseStatusInput),
|
||||
GetWorkEnvironment(AuthenticatedWorkEnvironmentInput),
|
||||
AppendEvent(AppendSessionEventInput),
|
||||
|
|
@ -737,7 +737,7 @@ fn connect_endpoint(path: &Path) -> std::io::Result<LocalSocketStream> {
|
|||
#[cfg(unix)]
|
||||
{
|
||||
let name = path.to_fs_name::<GenericFilePath>()?;
|
||||
return LocalSocketStream::connect(name);
|
||||
LocalSocketStream::connect(name)
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
|
|
@ -1055,6 +1055,7 @@ fn dispatch(roots: &BrokerStorageRoots, bytes: &[u8]) -> BrokerResponse {
|
|||
BrokerRequest::ResumeSession(input) => resume_at(session_root, input)
|
||||
.and_then(|receipt| serde_json::to_value(receipt).map_err(|error| error.to_string())),
|
||||
BrokerRequest::PresentPersonaCarrierLicense(input) => {
|
||||
let input = *input;
|
||||
authenticate_context_at(session_root, &input.session)
|
||||
.and_then(|context| {
|
||||
present_persona_license_at(
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ mod home_status;
|
|||
mod knowledge_base;
|
||||
mod local_development_bridge;
|
||||
mod metacognitive_zero_layer;
|
||||
mod module_package_runtime;
|
||||
mod number_coordinate_tree;
|
||||
mod numbered_ipc;
|
||||
mod numbered_ipc_dispatch;
|
||||
|
|
@ -49,6 +50,7 @@ pub fn run() {
|
|||
gls_protocol_kernel::start_on_application_open(app.handle())?;
|
||||
metacognitive_zero_layer::start_on_application_open()?;
|
||||
persona_carrier_license::start_on_application_open()?;
|
||||
module_package_runtime::start_on_application_open(app.handle())?;
|
||||
number_coordinate_tree::start_on_application_open()?;
|
||||
numbered_language_input::validate_contract()?;
|
||||
numbered_ipc::start_on_application_open(app.handle())?;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -53,7 +53,7 @@ fn validate_tree() -> Result<(), String> {
|
|||
|| tree.record_id != "HLP-UNIFIED-NUMBER-TREE-001"
|
||||
|| tree.state != "MACHINE_COMPILED_STARTUP_ENFORCED"
|
||||
|| tree.root_number != "HLP-NUMBER-WORLD-ROOT-001"
|
||||
|| tree.route_count != 84
|
||||
|| tree.route_count != 91
|
||||
|| tree.routes.len() != tree.route_count
|
||||
|| !tree.invariants.number_is_stable_coordinate_not_authority
|
||||
|| !tree.invariants.path_is_unique_navigation
|
||||
|
|
|
|||
|
|
@ -934,7 +934,7 @@ mod tests {
|
|||
#[test]
|
||||
fn registry_is_closed_and_contains_every_migrated_command() {
|
||||
let registry = load_registry().unwrap();
|
||||
assert_eq!(registry.operations.len(), 62);
|
||||
assert_eq!(registry.operations.len(), 69);
|
||||
assert!(!registry.runtime.legacy_direct_commands_allowed);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -99,6 +99,27 @@ pub(crate) async fn dispatch(
|
|||
)
|
||||
.await?,
|
||||
),
|
||||
"module_package_runtime::get_module_runtime_snapshot" => {
|
||||
json(crate::module_package_runtime::get_module_runtime_snapshot(app).await?)
|
||||
}
|
||||
"module_package_runtime::verify_module_package" => {
|
||||
json(crate::module_package_runtime::verify_module_package(app, input(&payload)?).await?)
|
||||
}
|
||||
"module_package_runtime::install_module_package" => json(
|
||||
crate::module_package_runtime::install_module_package(app, input(&payload)?).await?,
|
||||
),
|
||||
"module_package_runtime::mount_module" => {
|
||||
json(crate::module_package_runtime::mount_module(app, input(&payload)?).await?)
|
||||
}
|
||||
"module_package_runtime::self_test_module" => {
|
||||
json(crate::module_package_runtime::self_test_module(app, input(&payload)?).await?)
|
||||
}
|
||||
"module_package_runtime::unmount_module" => {
|
||||
json(crate::module_package_runtime::unmount_module(app, input(&payload)?).await?)
|
||||
}
|
||||
"module_package_runtime::rollback_module" => {
|
||||
json(crate::module_package_runtime::rollback_module(app, input(&payload)?).await?)
|
||||
}
|
||||
"local_development_bridge::acquire_development_write_lane" => json(
|
||||
crate::local_development_bridge::acquire_development_write_lane(app, input(&payload)?)
|
||||
.await?,
|
||||
|
|
|
|||
|
|
@ -496,6 +496,62 @@ const ROUTES = {
|
|||
"moduleNumber": "HLP-NIPC-MOD-0019",
|
||||
"operationNumber": "HLP-NIPC-OP-0062",
|
||||
"targetNumber": "HLP-NIPC-TGT-0019"
|
||||
},
|
||||
"get_module_runtime_snapshot": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0063",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"verify_module_package": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0064",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"install_module_package": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0065",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"mount_module": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0066",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"self_test_module": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0067",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"unmount_module": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0068",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
},
|
||||
"rollback_module": {
|
||||
"protocolVersion": "HLP-NIPC-v1",
|
||||
"callerNumber": "HLP-NIPC-CALLER-MAIN-WEBVIEW-0001",
|
||||
"channelNumber": "HLP-NIPC-CH-0002",
|
||||
"moduleNumber": "HLP-NIPC-MOD-0020",
|
||||
"operationNumber": "HLP-NIPC-OP-0069",
|
||||
"targetNumber": "HLP-NIPC-TGT-0020"
|
||||
}
|
||||
} as const
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue