architecture: converge HoloLake stage-one desktop mainline

This commit is contained in:
冰朔 2026-08-14 21:57:16 +08:00
commit 874bcf1b8f
8 changed files with 371 additions and 14 deletions

View file

@ -0,0 +1,72 @@
{
"schema": "hololake.stage-one-desktop-convergence/v1",
"record_id": "HLP-STAGE-ONE-DESKTOP-CONVERGENCE-001",
"version": "2026-08-14.1",
"state": "CURRENT_LOCAL_CONVERGENCE_CONTRACT_SOURCE_NOT_YET_PUBLISHED",
"development_id": "DEV-20260814-003",
"architecture_page": "product-source/hololake-platform/architecture/HOLOLAKE-STAGE-ONE-DESKTOP-CONVERGENCE-AND-CAPABILITY-AUDIT-20260814.md",
"language_runtime_product_boundary": "product-source/hololake-native-desktop/contracts/language-runtime-product-update-boundary.json",
"installed_capability_audit": "product-source/hololake-native-desktop/audit/stage-one-installed-product-capability-audit.json",
"canonical_mainline": {
"source": "product-source/hololake-native-desktop",
"technology": "TAURI_V2_RUST_REACT",
"parallel_product_lines_allowed": false,
"installed_candidate_role": "LOCAL_ACCEPTANCE_CANDIDATE_NOT_SEPARATE_PRODUCT_LINE",
"formal_stage_one_product_complete": false
},
"donors": [
{
"source": "product-source/hololake-platform",
"role": "READ_ONLY_ENGINEERING_CONTRACT_TEST_AND_NATIVE_BOUNDARY_DONOR"
},
{
"source": "product-source/hololake-desktop",
"role": "READ_ONLY_KNOWLEDGE_UX_AND_BEHAVIOR_DONOR"
},
{
"source": "product-source/guanghu-knowledge-base",
"role": "READ_ONLY_KNOWLEDGE_UX_BEHAVIOR_AND_PROTECTED_DATA_DONOR"
}
],
"keep_foundation": [
"SIGNED_NATIVE_SHELL",
"LOCAL_BROKER_AND_RESUMABLE_SESSION",
"PNCC_READ_ONLY_PROJECTION",
"HUMAN_CONFIRMED_REPOSITORY_MOUNT",
"RECEIPTS",
"FAIL_CLOSED_UPDATE_AND_ROLLBACK"
],
"under_lake_foundation_not_product_completion": [
"DYNAMIC_CAPABILITY_ROUTING",
"RELEASE_BROADCAST",
"RELEASE_ACTIVATION_OPERATOR",
"UPDATE_SERVER_FOUNDATION"
],
"stage_one_implementation_order": [
"PERSONAL_CHANNEL_IDENTITY_TASK_EVENT_RECEIPT_KERNEL",
"KNOWLEDGE_TREE_PAGE_SEARCH_AND_LOCAL_PERSISTENCE",
"HUMAN_APPROVAL_CENTER_AND_GIT_EVIDENCE_READBACK",
"LAKE_LAMP_CROSS_SESSION_CONTINUITY_PROJECTION",
"SIGNED_INSTALL_UPDATE_ROLLBACK_AND_REVERSIBLE_DATA_MIGRATION"
],
"donor_exit_requires": [
"PHYSICAL_USER_DATA_INVENTORY",
"RECOVERABLE_BACKUP",
"FILE_BY_FILE_HASH_READBACK",
"REVERSIBLE_DATA_MIGRATION_REHEARSAL",
"NEW_TAURI_REGRESSION_TESTS",
"SIGNED_INSTALLED_RUNTIME_ACCEPTANCE",
"HUMAN_VISIBLE_CLEANUP_SCOPE_CONFIRMATION",
"RECOVERABLE_ARCHIVE_RECEIPT"
],
"actions": {
"application_deletion": "NOT_AUTHORIZED_NOT_EXECUTED",
"application_replacement": "NOT_AUTHORIZED_NOT_EXECUTED",
"user_data_migration": "NOT_EXECUTED",
"repository_publication": "NOT_YET_PUBLISHED",
"desktop_artifact_build": "NOT_EXECUTED_FOR_THIS_CONTRACT",
"desktop_installation": "NOT_EXECUTED_FOR_THIS_CONTRACT",
"server_deployment": "NOT_EXECUTED_FOR_THIS_CONTRACT"
},
"truth_policy": "ARCHITECTURE_SOURCE_ARTIFACT_SIGNATURE_INSTALLATION_DATA_MIGRATION_DEPLOYMENT_AND_HEALTH_REQUIRE_SEPARATE_RECEIPTS"
}

View file

@ -0,0 +1,75 @@
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import test from "node:test";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const readJson = (relative) =>
JSON.parse(fs.readFileSync(path.join(root, relative), "utf8"));
const convergence = readJson("routing/hololake-stage-one-desktop-convergence.json");
const foundation = readJson("product-source/hololake-native-desktop/foundation.json");
const boundary = readJson(
"product-source/hololake-native-desktop/contracts/language-runtime-product-update-boundary.json",
);
const audit = readJson(
"product-source/hololake-native-desktop/audit/stage-one-installed-product-capability-audit.json",
);
test("one Tauri mainline absorbs the candidate without creating a third product line", () => {
assert.equal(convergence.canonical_mainline.source, "product-source/hololake-native-desktop");
assert.equal(convergence.canonical_mainline.technology, "TAURI_V2_RUST_REACT");
assert.equal(convergence.canonical_mainline.parallel_product_lines_allowed, false);
assert.equal(convergence.canonical_mainline.formal_stage_one_product_complete, false);
assert.equal(foundation.parallel_product_line_created, false);
assert.equal(foundation.stage_one_visible_body_state, "NOT_IMPLEMENTED");
});
test("Electron and legacy sources remain protected donors until reversible migration passes", () => {
assert.ok(
convergence.donors.some(
(donor) => donor.source === "product-source/hololake-desktop" && donor.role.includes("READ_ONLY"),
),
);
assert.ok(convergence.donor_exit_requires.includes("FILE_BY_FILE_HASH_READBACK"));
assert.ok(convergence.donor_exit_requires.includes("REVERSIBLE_DATA_MIGRATION_REHEARSAL"));
assert.equal(audit.deletion_allowed, false);
assert.equal(audit.replacement_allowed, false);
assert.equal(audit.data_migration_executed, false);
});
test("stage-one visible body precedes routing and release infrastructure", () => {
assert.equal(
convergence.stage_one_implementation_order[0],
"PERSONAL_CHANNEL_IDENTITY_TASK_EVENT_RECEIPT_KERNEL",
);
assert.equal(
convergence.stage_one_implementation_order[1],
"KNOWLEDGE_TREE_PAGE_SEARCH_AND_LOCAL_PERSISTENCE",
);
assert.ok(
convergence.under_lake_foundation_not_product_completion.includes(
"DYNAMIC_CAPABILITY_ROUTING",
),
);
assert.equal(foundation.supporting_infrastructure_role, "UNDER_LAKE_FOUNDATION_NOT_PRODUCT_COMPLETION");
});
test("language runtime and product engineering stay separate without sharing a formed private persona", () => {
assert.equal(boundary.upstream.protocol, "GLS-0263");
assert.equal(boundary.language_runtime_channel.private_formed_persona_shared, false);
assert.equal(boundary.product_engineering_channel.may_rewrite_zero_core, false);
assert.equal(boundary.product_engineering_channel.may_read_or_publish_private_persona_memory, false);
assert.equal(boundary.human_impact_gate.visible_confirmable_rejectable_reversible_receipted, true);
assert.equal(boundary.automatic_authority_granted, false);
});
test("public contracts contain no machine-private absolute paths or personal content", () => {
for (const value of [convergence, foundation, boundary, audit]) {
const serialized = JSON.stringify(value);
assert.equal(serialized.includes("/Users/"), false);
assert.equal(serialized.includes("/Volumes/"), false);
assert.equal(serialized.includes("bingshuolingdianyuanhe"), false);
}
});