{
  "schema": "hsimc.t736.engineering-lessons.v1",
  "edition": "C0-012",
  "evidence_window": "2026-10-10/2026-10-12",
  "scope": "Cumulative engineering guide. Status belongs to the named board, work package and acceptance method.",
  "lessons": [
    {
      "id": "T736-L01",
      "category": "display",
      "title_zh": "HDMI 黑屏，先确定失败在哪一层",
      "title_en": "Locate the failing display layer",
      "symptom_zh": "有 HDMI 接口、驱动节点或测试彩条，仍没有正常桌面。",
      "symptom_en": "A connector, driver node or test pattern exists, but the normal desktop is absent.",
      "finding_zh": "D0-001 到 D0-003 分别查到运行设备树中的显示路由问题，以及路由恢复后独立存在的 Xorg 崩溃。内部测试图案只证明相应输出路径。",
      "finding_en": "D0-001 through D0-003 separated the live device-tree route from a later Xorg crash. An internal pattern proves only its own output path.",
      "practice_zh": "依次核对板卡身份、运行 DT、HPD/EDID、DRM connector、Xorg/LightDM、实际窗口与键鼠。每层保留独立结果。",
      "practice_en": "Check board identity, live DT, HPD/EDID, DRM connector, Xorg/LightDM, visible windows and physical input in order; retain a result for each layer.",
      "status": "CASE_DIAGNOSIS_VERIFIED",
      "source": "data/desktop-and-recovery.json"
    },
    {
      "id": "T736-L02",
      "category": "display",
      "title_zh": "Xorg 兼容层的真实范围，要以源码为准",
      "title_en": "Describe the actual Xorg filter scope",
      "symptom_zh": "Xorg 在 modesetting 的 RandR 属性初始化阶段 SIGSEGV。",
      "symptom_en": "Xorg crashes during modesetting RandR property initialization.",
      "finding_zh": "GDB 查到空属性指针。自写兼容层按 DRM_MODE_PROP_BITMASK 类型过滤 connector 属性；现场记录的属性为 pixelformat_support 和 dynamicrange_support。代码不是按这两个名称做白名单。",
      "finding_en": "GDB identified a null property pointer. The HSIMC filter excludes connector properties by DRM_MODE_PROP_BITMASK type. The two observed names were pixelformat_support and dynamicrange_support; the implementation is not a two-name allowlist.",
      "practice_zh": "复用前对照源码、Xorg/libdrm 版本和完整属性列表。把它限定在已验收的 Xorg 进程启动范围内，另行验证其他板卡。",
      "practice_en": "Review the source, Xorg/libdrm versions and complete property list before reuse. Preserve the tested Xorg-process scope and validate other boards separately.",
      "status": "SOURCE_SCOPE_CORRECTION",
      "source": "materials/desktop/README.md"
    },
    {
      "id": "T736-L03",
      "category": "display",
      "title_zh": "2K 已显示，不等于热插拔恢复已完善",
      "title_en": "A working 2K desktop does not close hot-plug recovery",
      "symptom_zh": "换显示器后 2560×1440 可用，但现场仍报告偶发插拔或断电后无画面。",
      "symptom_en": "2560×1440 works on the tested monitor, while the operator reports occasional recovery failures.",
      "finding_zh": "D0-004 有 2K @ 60 Hz 模式与现场显示确认；D0-005 尚无足够失败时窗、复现次数和恢复耗时，未建立自动恢复 PASS。",
      "finding_en": "D0-004 has 2K at 60 Hz mode evidence and operator confirmation. D0-005 lacks a captured failure window, reproduction count and recovery timing; automatic recovery is not accepted.",
      "practice_zh": "按显示器/EDID、同一 Boot、插拔时刻和恢复时间组织复现。把 1080p、2K、重启、热插拔分别验收。",
      "practice_en": "Record monitor/EDID, boot context, unplug/replug timestamps and recovery time. Accept 1080p, 2K, reboot and hot-plug behavior separately.",
      "status": "2K_VERIFIED_HOTPLUG_OPEN",
      "source": "data/desktop-and-recovery.json"
    },
    {
      "id": "T736-L04",
      "category": "desktop",
      "title_zh": "退出码 0，也可能根本没打开窗口",
      "title_en": "Exit code zero can still mean no window",
      "symptom_zh": "Files 图标似乎响应，却没有文件管理器窗口。",
      "symptom_en": "The Files launcher appears to respond, but no file-manager window opens.",
      "finding_zh": "本机 Thunar 的 --home 参数无效：退出码为 0，同时 stderr 写出 Unknown option --home。改为传入实际用户目录后，才验到 IsViewable 的真实窗口。",
      "finding_en": "This Thunar build rejected --home with Unknown option --home on stderr while returning zero. Passing the actual home directory produced a real IsViewable window.",
      "practice_zh": "检查 .desktop 的 Exec、stderr、目标进程、窗口映射与屏幕位置；再由现场点击确认。desktop-file-validate 只证明文件语法。",
      "practice_en": "Inspect Exec, stderr, process, mapped window and screen position, then confirm a physical click. desktop-file-validate checks syntax only.",
      "status": "FILES_FIXED_WINDOW_VERIFIED",
      "source": "data/desktop-and-recovery.json"
    },
    {
      "id": "T736-L05",
      "category": "desktop",
      "title_zh": "把图标、桌面会话和浏览器故障分开查",
      "title_en": "Separate launchers, the desktop session and the browser",
      "symptom_zh": "怀疑多显示器、桌面权限或浏览器未设为默认，导致图标无效。",
      "symptom_en": "An unresponsive icon suggests another display, launcher trust or browser defaults.",
      "finding_zh": "C005 回查时是单 HDMI-1、一个工作区；Terminal 窗口可见且后续得到现场确认。GNOME Web 启动则走到了独立的 namespace 错误。",
      "finding_en": "C005 observed one HDMI-1 output and one workspace. Terminal became visible and received later operator confirmation. GNOME Web reached a separate namespace failure.",
      "practice_zh": "先用已有会话环境和已知可用应用分离问题，再追浏览器日志。保留机器窗口证据与人手点击证据各自的边界。",
      "practice_en": "Use the existing session and a known working application to isolate the fault before tracing browser logs. Keep machine window checks and human click evidence distinct.",
      "status": "SESSION_LAYER_ISOLATED",
      "source": "data/desktop-and-recovery.json"
    },
    {
      "id": "T736-L06",
      "category": "browser",
      "title_zh": "浏览器包装好了，内核能力仍可能不足",
      "title_en": "Installed browser packages still depend on kernel capabilities",
      "symptom_zh": "GNOME Web 已安装，出现 bwrap: Creating new namespace failed，随后 dbus-proxy 启动失败。",
      "symptom_en": "GNOME Web is installed, but bwrap reports Creating new namespace failed, followed by a dbus-proxy launch failure.",
      "finding_zh": "当前完整内核配置与供应商原始 dragonboard_defconfig 一致；CONFIG_USER_NS、CONFIG_PID_NS、CONFIG_UTS_NS 三项均未启用。",
      "finding_en": "The complete running configuration matches the vendor dragonboard_defconfig. CONFIG_USER_NS, CONFIG_PID_NS and CONFIG_UTS_NS are disabled.",
      "practice_zh": "沿匹配的 BSP/Kconfig 准备候选内核，记录派生配置与启动回退，再验收正常沙箱下的实际浏览器窗口。三行片段尚未构建，EGL 等后续问题仍需实测。",
      "practice_en": "Prepare a candidate with the matched BSP/Kconfig, record derived configuration and recovery inputs, then test a real browser with its normal sandbox. The three-line fragment is not built; later EGL issues still require testing.",
      "status": "BROWSER_BLOCKED_KERNEL_CANDIDATE_NOT_BUILT",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L07",
      "category": "bsp",
      "title_zh": "Android 命名的大包，也可能是 Ubuntu 的源码入口",
      "title_en": "The Android-named archive also contains the Ubuntu build route",
      "symptom_zh": "常见源码目录没找到文件，准备向供应商再次索取 BSP。",
      "symptom_en": "A search of common source locations fails, suggesting another BSP request to the supplier.",
      "finding_zh": "C006 先回查已交付资料，找回 longan 内核、BSP、构建系统及 T736 配置。用户手册 PDF 45–48 页说明 Ubuntu 路线，第 70 页给出 Linux 配置路径。",
      "finding_en": "C006 recovered the longan kernel, BSP, build system and T736 configuration from existing materials. Manual PDF pages 45–48 document Ubuntu; page 70 identifies its Linux configuration.",
      "practice_zh": "先读小索引和手册，再定位已有 Git 对象与历史构建目录。只有具体缺项留下时，才带文件名、版本和哈希集中询问供应商。",
      "practice_en": "Start with the small index and manuals, then locate preserved Git objects and historical builds. Escalate only specific remaining gaps with filenames, versions and hashes.",
      "status": "SOURCE_LOCATED_PRIOR_CONCLUSION_CORRECTED",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L08",
      "category": "bsp",
      "title_zh": "版本号相同，还要对应完整配置与来源",
      "title_en": "Match the complete configuration and its origin",
      "symptom_zh": "找到 Linux 5.15.119，就想直接接着编译。",
      "symptom_en": "Finding Linux 5.15.119 appears sufficient to resume a build.",
      "finding_zh": "本次将供方固定提交、已提取配置、旧 UVC 输入和现机配置对应为同一份 159,754 字节内容，SHA256 为 2fd95877…43d6361d3。",
      "finding_en": "The vendor commit, extracted configuration, preserved UVC inputs and running configuration matched as the same 159,754 bytes, SHA256 2fd95877…43d6361d3.",
      "practice_zh": "从完整固定配置产生候选，保留完整 SHA256 和全部 diff。相同 Module.symvers 或版本标签不能独立证明新内核和所有模块兼容。",
      "practice_en": "Derive the candidate from the pinned complete configuration, preserving full hashes and diffs. A matching Module.symvers or version label alone does not establish compatibility of a new kernel and all modules.",
      "status": "CONFIG_IDENTITY_VERIFIED",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L09",
      "category": "bsp",
      "title_zh": "原内核工具链、板端 GCC 和 Qt 工具链用途不同",
      "title_en": "Distinguish kernel, on-board and Qt toolchains",
      "symptom_zh": "资料中有 GCC 13.3 / Qt 6.6.3，板端也有 GCC，于是认为内核构建输入已经齐全。",
      "symptom_en": "GCC 13.3 / Qt 6.6.3 and an on-board compiler appear to complete the kernel build environment.",
      "finding_zh": "现机原内核记录为 GCC 10.3.1；mkcmd.sh 对 Linux 5.15 ARM64 指定 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz。编译器二进制和实际执行环境还没有核验。",
      "finding_en": "The running kernel records GCC 10.3.1. mkcmd.sh maps Linux 5.15 ARM64 to gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz. The binary and usable host environment are still unverified.",
      "practice_zh": "先核对 host 架构、target triple、版本及工具链来源。旧 UVC 脚本只构建媒体模块，不能直接当完整内核安装器。",
      "practice_en": "Verify host architecture, target triple, version and provenance first. The old UVC module build scripts are not complete-kernel installers.",
      "status": "TOOLCHAIN_MAPPING_FOUND_BINARY_OPEN",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L10",
      "category": "bsp",
      "title_zh": "Git 提交不同，源码树可能相同",
      "title_en": "Different commits can identify the same source tree",
      "symptom_zh": "小型缓存中缺供应商 head 对象，或 head 与 packed commit 不同，被误判为补丁丢失。",
      "symptom_en": "A missing head object in a selective cache, or a different packed commit, suggests lost patches.",
      "finding_zh": "完整 UVC Git 存储保留了所需对象；已比较的 kernel/BSP 旧提交与供方 head 的 tree ID 相同，路径差异为 0。",
      "finding_en": "The full preserved UVC Git store contains the objects. The compared kernel/BSP packed commits and vendor heads have identical tree IDs and zero path differences.",
      "practice_zh": "用 Manifest 连接 lichee 仓库名与 longan 工作树；分别记录 commit、tree 和实际文件哈希。关键 20 文件核对不等于全工作树内容审计。",
      "practice_en": "Use the manifest to connect lichee repository names with longan checkouts. Record commit, tree and file hashes separately. Twenty selected blob checks are not a full worktree content audit.",
      "status": "PINNED_OBJECTS_RECOVERED",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L11",
      "category": "recovery",
      "title_zh": "根分区空间与数据分区空间要分别看",
      "title_en": "Account for root and data storage separately",
      "symptom_zh": "根分区仅剩约 2.7 GB，就认为整个设备没有源码或构建空间。",
      "symptom_en": "About 2.7 GB free on root is mistaken for the device's total available storage.",
      "finding_zh": "C006 的 root 约 4.9 GB，而独立数据挂载约 54 GB、剩余约 47 GB；历史构建输入位于数据分区。两份约 29 GB 原包另在既有归档中。",
      "finding_en": "At C006, root was about 4.9 GB; a separate data mount was about 54 GB with 47 GB free and held historical build inputs. Two approximately 29 GB source archives were separately retained.",
      "practice_zh": "先清点现有索引、提取树、构建包和分区，再决定工作目录。此容量快照并不保证完整 BSP 构建空间足够。",
      "practice_en": "Inventory indexes, extracted trees, build inputs and mounts before selecting a work directory. This capacity snapshot does not establish sufficient space for a full BSP build.",
      "status": "STORAGE_INVENTORY_VERIFIED",
      "source": "materials/bsp/source-map.json"
    },
    {
      "id": "T736-L12",
      "category": "recovery",
      "title_zh": "SSH 回来了，不等于 NPU 业务恢复了",
      "title_en": "SSH recovery is not NPU service recovery",
      "symptom_zh": "系统重启后网络恢复，但 NPU 自动恢复单元提前失败。",
      "symptom_en": "Networking returns after boot while the NPU restore unit fails early.",
      "finding_zh": "AIS B 的 B0-009 记录了重启/SSH 可达与自动恢复失败并存。服务在约 6 秒启动，所需外部存储约 15 秒才出现；根因还需按具体前置条件核对。",
      "finding_en": "AIS B B0-009 records reachable SSH alongside failed automatic restoration. The unit started around six seconds; external storage appeared around fifteen seconds. Specific prerequisites still require diagnosis.",
      "practice_zh": "按同一个 boot 的时间线核对 mount、驱动、库、Golden 和真实 MCP 调用。参考节点的断电 PASS 不可自动转移到另一块板。",
      "practice_en": "Correlate mounts, driver, libraries, Golden output and real MCP calls within the same boot. A reference node's power-loss PASS does not transfer to another board.",
      "status": "AIS_B_AUTORESTORE_OPEN",
      "source": "data/desktop-and-recovery.json"
    },
    {
      "id": "T736-L13",
      "category": "contract",
      "title_zh": "声明文件、实际 MCP 服务和图形界面有各自验收",
      "title_en": "Descriptors, a real MCP server and GUI behavior have separate acceptance",
      "symptom_zh": "把合约 JSON 或网页镜像存在，当作完整合约部署完成。",
      "symptom_en": "A contract JSON file or mirrored page is treated as a complete deployment.",
      "finding_zh": "C001 是离线定义和比较原型；C002 才以官方 SDK 验到 SSH stdio 服务、1 个 tool、4 个 resource、1 个 resource template。浏览器在相同阶段仍未可用。",
      "finding_en": "C001 was an offline definition and comparison prototype. C002 used the official SDK to verify an SSH stdio server with one tool, four resources and one resource template. The browser remained unavailable.",
      "practice_zh": "分别保存 release 哈希、SDK 版本、discovery、调用和真实结果。公开参考源码采用新的示例绑定，不能继承原板的部署 PASS。",
      "practice_en": "Retain release hash, SDK version, discovery, calls and outcomes separately. Public example source uses new bindings and does not inherit the board's deployment PASS.",
      "status": "ORIGINAL_C002_SDK_ACCEPTED",
      "source": "materials/contract/LESSONS.json"
    },
    {
      "id": "T736-L14",
      "category": "contract",
      "title_zh": "首次并发提交与后来重放，是两种证据",
      "title_en": "Separate first-commit races from later replay",
      "symptom_zh": "重复验收 PASS、receipt_delta 为 0，被误读为又完成了一次新并发提交。",
      "symptom_en": "A repeat PASS with receipt_delta zero is reported as another new concurrent commit.",
      "finding_zh": "原始四客户端竞争产生 1 份新 receipt 和 3 次重放。用户后来复验时，全部返回旧结果；3 个 receipt/event 保持不变，delta 为 0。",
      "finding_en": "The original four-client race produced one new receipt and three replays. The later run returned existing results; three receipts/events remained, with delta zero.",
      "practice_zh": "记录操作是否预先存在、测试前后计数、提交数量和 replay 标志。receipt/event 必须在同一事务中提交，成功返回应位于提交之后。",
      "practice_en": "Record whether the operation already existed, before/after counts, commits and replay flags. Commit receipt/event in one transaction before returning success.",
      "status": "FIRST_COMMIT_AND_REPLAY_SEPARATELY_PROVEN",
      "source": "materials/contract/LESSONS.json"
    },
    {
      "id": "T736-L15",
      "category": "contract",
      "title_zh": "本地哈希链和资料上云，各有明确含义",
      "title_en": "State exactly what the local chain and cloud publication establish",
      "symptom_zh": "把 ETH-like、哈希链或资料同步到网站，理解为以太坊兼容、签名结算或业务数据库同步。",
      "symptom_en": "ETH-like, a hash chain or a website upload is read as Ethereum compatibility, signed settlement or business-data synchronization.",
      "finding_zh": "C002 已验的是固定 artifact 的本地观察与持久 receipt/event。EVM、共识、数字签名、完整 Azure WorkEnvelope 和云端 receipt 接收尚未实现。",
      "finding_en": "C002 verified bounded local artifact observation and durable receipts/events. EVM, consensus, signatures, the full Azure WorkEnvelope and a cloud receipt receiver are not implemented.",
      "practice_zh": "本次同步发布工程知识和源码；以后另用工作包验收真实 cloud registration、receipt readback 和数据冲突策略。",
      "practice_en": "This release publishes engineering knowledge and source. Verify actual cloud registration, receipt readback and data-conflict handling in separate work packages.",
      "status": "LOCAL_ENGINEERING_CONTRACT_SCOPE",
      "source": "materials/contract/LESSONS.json"
    },
    {
      "id": "T736-L16",
      "category": "method",
      "title_zh": "把纠正、失败和接续点一起留给后来的人",
      "title_en": "Preserve corrections, failures and the next continuation point",
      "symptom_zh": "新同事重复旧排查，或把不同节点、不同阶段的 PASS 拼成整机成功。",
      "symptom_en": "A new contributor repeats old diagnosis or combines unrelated PASS results into a system-wide claim.",
      "finding_zh": "本轮将分散工作目录、验收摘要、源码图谱与纠正条目放在同一入口；旧版本历史保留，当前状态另有日期明确的新版本。",
      "finding_en": "This release joins work-directory inventory, scoped acceptance, source maps and corrections. Historical versions remain; dated newer evidence states the current continuation point.",
      "practice_zh": "每次贡献至少写明对象、版本、症状、方法、结果、哈希、未验事项和下一工作包，并区分机器证据与人类确认。",
      "practice_en": "Every contribution records target, version, symptom, method, result, hashes, unverified items and next work package, with machine evidence separate from human confirmation.",
      "status": "REUSABLE_PUBLICATION_METHOD",
      "source": "data/contribution-template.json"
    }
  ],
  "artifact": "HRI-HSIMC-T736-ENGINEERING-FIELD-GUIDE-C0-012-20261012",
  "public_url": "https://hsimc.tech/rd/t736/ecosystem/evidence/engineering-field-guide-20261012/"
}
