四份 ADR 的"待定 / 待验证"汇总(2026-09-15),按性质分四组。条目状态在此更新,不回改 ADR。
项
说明
状态
框架命名与建仓
命名 TinyUI、域名 tinyui.app、仓 tiny-ui/tinyui 均已定
已定
仓库结构
已定单仓,目录见 README"仓库结构"一节
已定
构建链骨架
Gradle(build-logic / compose / sample 含 iOS 壳)+ pnpm workspace(core / native / cli)+ CI(PR 门禁 Android / host / apiCheck,iOS 全量在 ios.yml tag / 手动);quickjs-kmp 本地 composite、CI 走 Central
已完成(PR #1,2026-09-16)
quickjs-kmp
新建 SDK 接入 QuickJS(ADR-005),复制 mquickjs-kmp 骨架,API 同形;M1 shim + 三端构建,M2 句柄表 + Runtime + 微任务 + ESM 模块表 ,M3 字节码 + 宿主编译工具 + 发布。TinyUI 的 compose/ 依赖它
已完成(M1~M3,wang.harlon:quickjs-kmp:0.1.0 2026-09-16 发 Central;桥形验收见 bench/results/2026-09-16-quickjs-kmp.md)
构建链打通
CLI:TSX → h()(ES2025)→ 每页一个 ESM 模块字节码,运行时模块 external;运行时两个模块字节码内置
已完成(PR #2,2026-09-16;方案与踩坑见 build-chain.md )
整体延后(2026-09-17 定):运行时仍在变,早测的绝对值会作废;B3 的退路只涉及 NodeTree.apply 跑在哪个线程,只要节点表写入口保持唯一,延后不会让退路变贵。何时开做由人工判断,不设自动触发条件。
项
来源
为什么要早做
状态
真机比值:Signal bench 在 Android / iOS 跑一遍(QuickJS)
ADR-001 / 005
所有性能判断都基于 macOS 数字,真机慢几倍要知道
待开
Runtime 创建 + 运行时模块 + 页面模块加载耗时;Runtime 基线内存
ADR-002 / 005
决定"每页一 Runtime"的进页延迟与返回栈深度
待开
JS 线程写快照 vs 主线程重组的锁争用
ADR-003
有问题要退回 op 列表投主线程,越早知道改动越小
待开(M1 的 NodeTree.apply 已按 withMutableSnapshot 写,可直接测)
Kotlin 侧流式 patch 解析器
ADR-003 §3.2
M1 用 kotlinx parseToJsonElement 建树,ADR 定的是逐 token 直写节点表;B 组真机数据出来再决定值不值得
待开
"一行一个 effect"内存优化
ADR-001
非阻塞,可最后做
待开
C. 实现期定稿(要写文档,不需要 ADR,实现前必须定)
项
来源
状态
JS 运行时 API:signal / memo / effect / onCleanup / For / Show / ref + cmd / resource (原拟名 createResource);"组件函数必须同步"规则;J3 / K3 用原生 Promise
ADR-001 / 004 / 005
已定(2026-09-16,js-runtime.html + runtime-api.md )
CLI 的 JSX 变换:自动 thunk(Solid 式 getter 包裹)、source map 输出
ADR-005
已定(2026-09-16,jsx-transform.md )
patch 协议:六种 op、JSON 形态、是否带协议版本号
ADR-001 / 002 / 004
已定(2026-09-16,patch-protocol.md )
schema DSL 形态 + 由 schema 生成 TS 类型定义的工具链
ADR-003
已定(components.md §1,tinyui schema)
公共布局 prop 清单与 Modifier 合成顺序
ADR-003
已定(components.md §2)
内置组件集首批(Column / Row / Box / Text / Image / Button / TextField / LazyColumn / Spacer)及各自 prop / 事件 / 命令清单
ADR-003 / 004
已定(components.md §3);Image 推迟到图片加载管线选型
J2 白名单清单与注册方式
ADR-002
已定(native-api.md §1)
tinyui-native 的 navigation / store / events API 面与 Navigator 接口(app-model.md );push 的 Promise 糖做不做
app-model.md
已定(native-api.md §2–§5;Promise 糖不做)
E3 错误 code 表、K 入口超时阈值、连续事件节流阈值
ADR-002 / 004
已定(native-api.md §6)
Placeholder 在 release 的表现
ADR-003
已定(components.md §5:零尺寸空 Box)
错误上报:PageError 单 sink、E7 接入、栈经 source map 回映射到 .tsx、buildId
ADR-002 §3.5
已完成(2026-09-17,build-chain.md §7)
宿主自定义能力 host.call、Button children、RadioButton、作为 included build 被宿主 App 吃(gradle/composite-substitutions)
TrendingAI 订阅页
已完成(2026-09-17,native-api.md §7、components.md §3)
项
来源
触发条件
createStore(Solid 式 Proxy 深层响应式)
ADR-005
已完成(2026-09-17,定名 observable,runtime-api.md §2.6):直接赋值、属性级订阅、只深代理纯对象与数组;reconcile / produce 不做,触发条件"服务端全量刷新导致整表重绑成为性能问题"
热下发
ADR-005
已定(2026-09-18,ADR-006 + updates.md ;2026-09-19 定服务端与签名、改多包模型),实现待开,顺序见下方第 7 条;ADR-006 §4.3 的推迟项(控制台、遥测、D1、非 CF 适配器、计费)各带触发条件
qjsc-kmp 宿主二进制分发
build-chain.md §5
已完成 (2026-09-23,热下发 M5.2):npm 入口包 qjsc-kmp 加 @qjsc-kmp/<os>-<arch> 平台包(esbuild 模式)而非 GitHub Release——内网 npm 代理天然能拉;quickjs-kmp 0.1.2 起随 tag 发布,tinyui-cli 依赖它
App 级共享模块(业务共享代码进 external 列表与模块表)
build-chain.md §3
砍掉(2026-09-19):多包模型下包自包含,体积问题的出口是拆包(ADR-006 §2.10)
向 bellard/mquickjs 上报 S4 段错误
ADR-005 §3.2
用户决定
ErrorBoundary 分支级兜底
ADR-002
整页失败的比例成为问题
二进制编码路径
ADR-002
真机 profiling 证明 Kotlin 解析占主导
命令回执(cmd() 返回 Promise)
ADR-004
出现必须知道结果的命令
窗口化 For
ADR-003
出现万行级列表需求
返回栈深页引擎回收策略
ADR-002
真机内存数据出来后定,可能提前
应用级服务 Runtime(不挂 UI、随 App 生命周期的引擎)
app-model.md
业务出现不属于任何页面的常驻 JS 逻辑
手势组合内置组件
ADR-004
业务需求出现
公钥轮换不中断旧 App:预置备用钥(publicKeys 为一组,客户端任一内置钥验过即可,服务端登记一组并可吊销单把,manifest 记签名用的钥)
updates.md §7
出现第一次真实的轮换诉求,或托管实例接入外部租户
服务端在 PUT current.json 时核对宿主快照:核对逻辑只在服务端一份,另开只读核对端点,CLI 删自己的 checkHost 改调它预检
updates.md §6.1
出现 CLI 以外的发布路径(控制台、租户自写工具),或托管实例接入外部租户
宿主契约 schema 化 + 代码生成:host.call 能力的参数 / 返回用 schema DSL 声明进快照(形状变即快照变、逼 hostVersion 加 1),CLI 按目标宿主版本的快照生成 TS 类型,页面编译期核对。ADR-007 后页面 props 与 store key 不再是宿主契约,盲区只剩少数兜底能力
updates.md §4.1
宿主与页面由不同的人或团队维护(外部租户、第二个宿主),或首次因快照盲区出线上问题
以客户端能力探测替代 hostVersion:指针列出多个候选版本及其 requires,客户端挑能跑的最新一版,配"能力改参数或语义即换名"约定(运行时 ABI 版本一项已由 ADR-006 §2.11 运行时随宿主取代,2026-09-24)
ADR-006 §2.11
hostVersion 加 1 的频率重新成为负担
Image 与图片加载管线(coil3 vs 宿主 loader);多色 / 位图图标并入这里
components.md §3
出现需要图片的页面
i18n 的复数与本地化数字 / 日期(J2 i18n.format,原生侧实现)
ADR-007 §3.2
第一个需要复数或本地日期的页面
框架远程配置 / 功能开关服务(可能是托管实例的付费功能)
ADR-007 §3.3
第二个 App 没有自己的配置后端又需要功能开关
大数据存储(SQLite / 文件 API)
ADR-007 §3.4
第一个要缓存大量数据的页面
声明式 Dialog / BottomSheet
ADR-007 §3.6
第一个需要自定义内容对话框的页面
剪贴板、分享、震动、选图等通用能力(均按"框架默认实现、宿主可接管")
ADR-007 §3.6
第一个需要的页面
openUrl 的打开方式提示(mode)
ADR-007 §3.6
页面确实要求应用内或外部打开
流式响应 / SSE、上传下载、请求缓存
ADR-007 §3.1
第一个需要的页面
会话之外的身份模型(多账号等)
ADR-007 §3.5
出现这类宿主
weight / alignSelf 等需要父作用域的布局 prop
components.md §2
weight、border、Column / Row 的 scroll 已加(2026-09-17,TrendingAI 订阅页触发);alignSelf 等需求
A 立项骨架 ——先 quickjs-kmp(M1~M3),再 TinyUI 构建链,否则 B、C 都没有落点
B 前三项并行 ——半天到一天的实验,结果决定 C 里几个数值和 ADR-003 的退路
C 前三项定稿 (运行时 API、patch 协议、schema DSL)——两侧代码的契约,定了才能分头写
M1:Counter 端到端 ——一个引擎、一页、一个 Text + 一个 Button,J1 / K1 / K2 全链路跑通,验证 ADR-001~004 主干 已完成(PR #3,2026-09-16):tinyui-core 运行时(30 测试)、CLI JSX 变换(19 测试)、compose 节点表 / schema DSL / 注册表 / PageHost / TinyUIPage(9 测试),Counter 在 Android 与 iOS 模拟器上跑通。顺带修了 quickjs-kmp 的字节码注册入口不刷新栈顶的 bug(quickjs-kmp PR #12),真机需要 quickjs-kmp ≥ 0.1.1(2026-09-18 已发并 bump catalog)
C 剩余项 + 内置组件集,M2:列表页 ——For / LazyColumn / TextField / J3 网络,覆盖所有权、命令、流式输入 已完成(PR #4,2026-09-16):schema 生成链、八个内置组件、HostServices、tinyui-native;todos 页在 Android 与 iOS 模拟器上跑通输入提交、行增删改、命令滚动、分页
实战接入:TrendingAI 订阅页 (2026-09-17 起,代替多页业务样例)——页面源码在 ~/TrendingProjects/trendingai-tinyui,产物经 pnpm sync 入 TrendingAI;框架缺什么以这一页为准补(第一批:主题 token、weight / border / scroll、host.call、Button children、RadioButton、宿主 include)。已在 Android 模拟器跑通拉价、选档、深浅色(TrendingAI 分支 feat/tinyui-subscription);合入 TrendingAI main 的前提——tinyui 0.1.0(Maven + npm 三包 tinyui-core / tinyui-native / tinyui-cli)与 quickjs-kmp 0.1.1——已于 2026-09-18 发出(PR #11);iOS 模拟器 smoke 通过,三条状态验证(结账失败 / 未登录 / 已是 Pro)不做
热下发实现 (ADR-006 定稿后;里程碑与进度见 updates-plan.md ):CLI(tinyui.config.json、模块名加包名、manifest 扩展、bundle + 签名、keys)→ core 库 Bundle → updates/ 模块(多包 Updates)→ tinyui-updates-server 仓 MVP(投递 + 发布 + 管理端点,部署 updates.tinyui.app)→ CLI publish / apps / packages / tokens / releases → TrendingAI 接入 → 第二个 App 接入。前置:qjsc-kmp npm 平台包
框架职责边界 (ADR-007 ,2026-09-25 定):tinyui 一个 PR——TinyUIHost 重组、删 HostServices、App 级 store 与 pageVisible() 驱动、http 通道、storage 与 cached、包内 i18n(CLI 校验与类型)、ui / linking / analytics / session、Icon 与 CLI 的 .svg 加载器、Loading、role / selected、快照通道段,sample 同步改写 → 发 minor → TrendingAI 订阅页按新形态重写(trendingai-tinyui 删 schema/ 与宿主封装;TrendingAI 删五个能力、props、宿主组件,hostVersion 加 1)。验收见 ADR-007 §5.4 已完成(2026-09-25):tinyui PR #28、0.8.0;热下发服务端 PR #6(manifest 认 i18n 文件);TrendingAI PR #150(HOST_VERSION 6),trendingai-tinyui PR #5(staging 已发)。TrendingAI 订阅页体积 +1.9 KiB