docs(design): Define selective session restore - #8743
Conversation
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Pull request was converted to draft
|
📄 Docs-only change — the automatic review ran at
Reviewed head: 中文说明📄 纯文档变更 —— 自动评审以 |
Design ReviewI verified every code-level claim in this design doc against current
The streaming dispatch design (no catch-all Concerns1. Ordering: safety before performance (primary concern) The design proposes selective restore before transactional WebUI switching. But the user-visible symptom from the incident is "current conversation stopped" — that's directly fixed by transactional switching, which is a performance-independent safety guarantee. Selective restore reduces the probability of timeout, but when it still occurs (e.g. a 200 MiB transcript on a slow machine, or under memory pressure), the user still loses their session. Suggested ordering: 2. PR scope: consider splitting The design says "implement one end-to-end fix PR." The most obvious waste — the duplicate
3. File history: "unavoidable" cost may be deferrable The design states file-history payloads are an "explicit unavoidable selected-read cost" because prompt ids and batch validity live inside JSON. Consider deferring file-history restoration to first 4. 32 MiB transformed envelope: consider configurability A single source record can expand to many ACP updates (tool result projections, etc.). A hard 32 MiB failure means the entire restore fails for an edge case that incremental trimming could handle gracefully. Consider making the limit configurable via 5. Small-session regression For small sessions (< 1 MiB), the index build + selective read + dispatcher overhead may exceed a direct sequential full read. Consider a fast path that uses the current full read when the transcript is below a threshold (e.g. 4 MiB), so the new path only activates where it actually helps. Minor
SummaryThis is a high-quality design doc with accurate code analysis and sound technical decisions. The main disagreement is on implementation ordering — I'd prioritize transactional switching (safety) over selective restore (performance) — and on PR granularity. The file-history deferral and small-session fast-path suggestions are worth evaluating before the implementation PR. |
|
Thanks for the thorough review. I agree with the main ordering concern. Here is the proposed disposition:
On the minor points:
I’ll revise the design and implementation plan along these lines without expanding the feature scope. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Follow-up: the agreed design changes are now implemented in
The English and Chinese PR descriptions were updated to match. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Final implementation plan is now reflected in commit The update keeps the reviewed dependency order ( The remaining implementation decisions are now explicit: one full index scan plus bounded selected seeks; one-record peak aggregation; active-chain side-task/artifact semantics; non-clobbering cache admission; one-shot Config handoff; same-id preparation reservation; pre-publication provisional teardown; envelope validation before runtime file-history hydration; post-publication validation/autonomous work; exact v1 anchor, coalescing shape, 32 MiB/10,000-update boundaries; typed ACP/REST mapping; and targeted race/failure/benchmark acceptance tests. Both documents pass Prettier and |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Updated the finalized design in commit 0cb33ec after two clean broad-audit passes. This round closes three lifecycle gaps: pending Goal checkpoints receive a bounded evidence window from the single projection and activate only after publication; process-global attribution is applied only in the final no-await commit; and the complete ACP success response is built before the Session is published. The design and acceptance plan now also gate every autonomous or session-visible callback until publication and cover response-builder, attribution, checkpoint, and teardown failures. Validation: both design documents pass Prettier and git diff checks. Delivery prerequisites are unchanged: #8691 is still open with changes requested, and transactional WebUI switching has not landed. This PR remains docs-only and Draft; runtime implementation has not started. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Updated the docs-only Draft at c26a063 after the final audit. This revision makes Goal preparation and activation separately memoized with explicit early-activation and disposal terminal behavior; builds the complete ACP response before FileHistory hydration or provisional Session construction; validates final reservation ownership before commit-time attribution; documents the #8691 late-abandoned attribution limitation; and specifies receiver-first, producer-last post-publication activation with independent failure isolation. The design and plan now carry matching acceptance tests. Validation completed: Prettier check, git diff check, and two consecutive clean broad-audit passes. Runtime implementation remains intentionally blocked on #8691 and transactional WebUI switching and is not included in this PR. |
|
After rechecking the current design head ( 1. Reuse the existing child-side session-start reservationThe ACP agent already has Please update the design to reuse and, only if necessary, extend the existing reservation. The required invariant is that one child-side owner holds the id until success or complete provisional teardown; it does not require a second registry. 2. Keep publication changes targeted to side effects introduced by selective restoreThe proposed general A smaller safe boundary is sufficient for this PR:
Existing direct-child publication semantics are pre-existing lifecycle debt and should remain out of scope unless the selective path demonstrably worsens them. With #8824, the WebUI also retains the old session until the target restore returns, so user-visible switching safety does not depend on introducing a universal child-side atomic-publication framework here. 3. Make restore coalescing compare the exact normalized replay shapeThe bridge currently stores and compares Please normalize each request before admission to an exact discriminated shape such as These changes preserve the end-to-end selective-restore PR while removing a redundant state machine, avoiding an unrelated lifecycle refactor, and closing a concrete response-shape concurrency bug. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Thanks for the concrete recheck. I validated all three points against the current prerequisite code and updated the design accordingly.
The design, implementation checklist, and bilingual PR description are synchronized. Prettier and |
|
Review notes from checking this design against current In-scope for this phase: bounding event-loop blockage during the one full index scanThe design keeps "exactly one sequential full transcript index scan" on the ACP child and lists event-loop lag during the scan as benchmark evidence ("evidence, not a latency gate"). That measures the problem but does not bound it. The stream gives natural yield points at chunk boundaries, but parse/validate per chunk is unbounded CPU between I/O waits, and a single ~2 MiB record (present in the incident transcript) is one indivisible Forward requirements for the checkpoint follow-upThe non-goals defer the durable sidecar/checkpoint. When that design starts, these constraints fall out of the current code and this phase's infrastructure:
Already well covered (verified, no action)
|
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Thanks for the careful follow-up. I agree with the in-scope scheduling concern and updated the design in The selective reader now requires cooperative event-loop yielding in the shared full-scan primitive and in selected dispatch when cumulative selected work can also be transcript-proportional. It uses fixed internal source-byte and elapsed-processing budgets and yields with The limitation you identified is now explicit: cooperative yielding cannot preempt the synchronous parse/validation of the current physical record, so the approximately 2 MiB incident record remains one indivisible interval. Worker-thread parsing or a streaming JSON parser is intentionally out of scope for this slice. I also recorded the checkpoint points as forward constraints without expanding this PR into a checkpoint design. The follow-up owns the exact versioned schema, transcript-prefix validation, persisted-index/incremental format, active-leaf/tail-parent invariant, bounded write amplification, and atomic publication. Existing file identity plus snapshot size is documented as a useful minimum rather than a complete defense against same-inode in-place rewrites, and legacy/corrupt/missing checkpoint fallback must reuse the cooperative scan policy. The replay-kind/coalescing and Goal-bootstrap sections remain unchanged except for the already-agreed ingress/caller clarifications. The two design documents and bilingual PR description are synchronized; Prettier and |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
设计基线更新与审计结论已在 commit 关键结论:
审计过程中修正了两项问题:一是最初未限定 #8882 的 modern/legacy capability 边界;二是“rebase onto #8882”可能误导实现直接叠在活跃 PR 上。修正后重新开始 clean-pass 计数,完成两轮连续全面审计,覆盖架构边界、失败路径、兼容性、测试策略、维护性、范围膨胀和更简单替代方案,未发现新的可行动问题。 验证:
|
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Prerequisite update: #8882 has merged. The remaining restore request-shape correctness fix is now isolated in Draft PR #8933, covering exact WebUI mode/page intent identity, page snapshotting across queue/retry, ACP bridge page-aware cold coalescing, ingress validation, and focused real-daemon regression coverage. This PR remains docs-only and Draft. Commit 6e2446a updates the design, implementation plan, and bilingual PR description to mark #8882 complete, assign the shape fix to #8933, and keep projection mapping, limits, reader/cache, Goal/FileHistory/artifact, lifecycle, and validation work in the future selective implementation. Next gate: merge #8933, then create the selective implementation Draft from fresh |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
Final broad-audit follow-up: commits e11bd51 and 1d3163b close two implementation ambiguities found while checking the design against the current production Goal evidence and ACP lifecycle code. Pending-checkpoint recovery now uses a two-stage shared selector/accumulator: bounded active-chain hints reproduce the production catalog and its malformed-context/turn-reentry fail-closed errors, then only selected evidence UUIDs are materialized. This prevents an implementer from choosing all active payloads or introducing a second scan. The selective finalizer now explicitly catches both synchronous invocation failures and asynchronous rejections for Goal activation and FileHistory validation, so neither can become an unhandled rejection or suppress the other action. The design, plan, and bilingual PR body are synchronized; Prettier and diff checks pass. After these fixes, two independent broad audit passes found no further actionable issue. The PR remains docs-only and Draft. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
I've completed my review of this documentation-only PR. Here's my assessment: Review SummaryPR #8743 — Verdict: No blockers. This is a well-structured, comprehensive design document and implementation plan. As a docs-only draft, there's no runtime code to verify. What this PR doesAdds two new documentation files:
Strengths
Observations (non-blocking)
VerdictNo blockers. The design is thorough, boundaries are crisp, and the acceptance checklist provides a clear path to verifying the implementation when it arrives. |
|
Thanks for the thorough review. Agreed there are no blockers. I’m leaving the docs unchanged in this round: the opening Scope and Context sections already provide the short orientation, and this Draft has been through several review cycles, so a density-only rewrite would add churn without changing the contract. The maintainer gates are already explicit in the design goals and implementation acceptance checklist; the implementation PR will also call out the 256 MiB transcript cap and 32 MiB transformed-replay cap in its description and request explicit sign-off. |
|
Thanks for the PR! Template looks good ✓ Problem: grounded, not theoretical. This is the design/plan PR for the next slice of #8678, and the underlying problem — the daemon cold path materializing the full transcript (twice when recording + writer lease are both on) before Direction: aligned. Session restore cost is squarely inside the daemon/ACP core, and committing the design before the implementation is exactly what Size: not applicable — docs-only, 2084 lines across two new markdown files, zero production logic lines. No core paths touched. Approach: scope feels right for a plan PR — one design doc plus one implementation plan, implementation explicitly deferred to its own PR, no drive-by changes. One honest observation: the plan is exceptionally detailed, which is a strength for review now but means the implementation PR must be held to exactly these stated boundaries — the doc itself asks for that, including reporting its production-logic line count for maintainer scope review before proceeding. Risk: no elevated risk signals — only Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓ 问题:有依据,不是理论性的。这是 #8678 下一个切片的设计/计划 PR,其底层问题——daemon 冷路径在 方向:对齐。会话恢复成本完全在 daemon/ACP 核心范围内,而在实现前提交设计正是 规模:不适用——纯文档,两个新增 markdown 文件共 2084 行,生产逻辑行数为零,不触及核心路径。 方案:作为计划 PR 范围合理——一份设计文档加一份实施计划,实现明确推迟到单独 PR,无顺手改动。一点坦率观察:计划细致得非同寻常,这对当前审查是优点,但也意味着实现 PR 必须严格对照这些声明的边界——文档本身也这样要求,包括在推进前报告生产逻辑行数以供 maintainer 范围审查。 风险:无升级风险信号——仅 进入代码审查 🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code reviewFor a docs-only PR the review question is whether the design is sound and whether its claims about the current code are true. I spot-checked both. The approach matches what the problem asks for: push paging down into the reader (one sequential index scan plus selected-record seeks instead of materialize-then-slice), keep the wire surface compatible (omitted Claims about current code verified against
No critical blockers, no convention violations — the two files land in Test evidenceCI on the reviewed commit, fetched via API (this run never executes PR code): Final CI results for
One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。 The repo's CI classifier routes same-repo docs-only PRs to a Not verified: Prettier formatting of the two new markdown files. The Real-scenario testing: N/A — documentation-only, nothing user-visible, and unattended runs do not drive the product. 中文说明代码审查对纯文档 PR,审查重点是设计本身是否合理、以及它对现有代码的论断是否属实。两点都做了抽查。 方案与问题所需一致:把分页下推到读取层(一次顺序索引扫描加 selected-record seek,而不是先全量物化再切片),保持协议兼容(省略 对现有代码的论断已在
无关键阻塞项,无约定违规——两个文件落在 测试证据被审查提交上的 CI,通过 API 获取(本审查从不执行 PR 代码)——见上方英文表格。仓库 CI 分类器将同仓库纯文档 PR 路由到 未验证:两个新 markdown 文件的 Prettier 格式。 真实场景测试:N/A——纯文档,无用户可见变化,无人值守运行不驱动产品。 — Qwen Code · qwen3.8-max Reviewed at |
|
Confidence: 5/5 — clean across every stage; the design's claims verify against the code, and the only verification gap (prettier) is a property of the docs_only CI profile, not this PR. Stepping back: this is what a plan PR should look like. Before reading the diff, my own sketch for this problem was "push paging into the reader with one index scan plus selected seeks, keep the wire compatible, yield cooperatively at record boundaries, reuse the existing reservation lifecycle" — the design matches that on every point and then goes further than I would have in pinning down the ugly corners: the Goal pending-checkpoint evidence window, the legacy Goal migration write racing a later replay overflow, the process-global attribution singleton that cannot be rolled back safely, and the parent/child publication gap it explicitly declines to fix here. The alternatives-considered section rejects each simpler-sounding path for a stated reason, and each rejection holds up (post-load paging doesn't fix the cold path; defaulting every client to a recent page would silently change ACP semantics; a full-loader fallback would route the worst input through the least bounded path). Every specific claim I checked against If I had to maintain this in six months, I'd thank whoever wrote it before starting the implementation — the acceptance checklist alone is worth the merge. Approving, pinned to the reviewed commit. ✅ 中文说明置信度:5/5 —— 每个阶段都干净;设计对现有代码的论断均已核实,唯一的验证缺口(prettier)是 docs_only CI 档位的属性,不是本 PR 的问题。 退一步看:这是一份计划 PR 应有的样子。在读 diff 之前,我自己对这个问题的方案是"把分页下推到读取层,一次索引扫描加 selected seek,保持协议兼容,在记录边界协作式让出,复用现有 reservation 生命周期"——设计与我的方案在每一点上一致,并且在棘手角落上比我考虑得更深:Goal pending-checkpoint 证据窗口、legacy Goal 迁移写入与后续 replay 溢出的竞态、无法安全回滚的进程级 attribution 单例,以及它明确声明不在本切片修复的 parent/child 发布缺口。备选方案一节对每条看似更简的路径都给出了拒绝理由,且每条都站得住(load 之后分页修不了冷路径;默认所有客户端 recent 分页会悄悄改变 ACP 语义;回退全量 loader 会让最坏输入走最不设防的路径)。 我对照 如果六个月后我要维护它,我会在开始实现前感谢写下它的人——光是验收清单就值得这次合入。 批准,钉在被审查的提交上。✅ — Qwen Code · qwen3.8-max Reviewed at |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
yiliang114
left a comment
There was a problem hiding this comment.
Approved — docs-only design contract, verified against current main.
Consistency with the merged series (checked against code):
- Prerequisite claims hold: #8691, #8833, #8882 merged; #8933 merged as
962dc8eexactly as the doc states. - Every numeric limit cited matches main: 256 MiB
SESSION_TRANSCRIPT_MAX_INDEX_BYTES, 4 MiB page budget, 16 MiB expansion ceiling (session-transcript-reader.ts), the 32 MiB REST serializer cap (WORKSPACE_TRANSCRIPT_RESPONSE_MAX_BYTES = 2 * 16 MiB), and the bridgeMAX_BULK_REPLAY_UPDATES = 10_000validated post-transport as the doc describes. - Error contract matches merged code: ACP -32010/-32011/-32012 with
transcript_snapshot_unavailable/transcript_too_large/transcript_page_too_large, REST 409/413 mapping, and400 invalid_transcript_limitall exist as referenced. - #8933 semantics are represented correctly:
historyReplayomission defaults to'stream', in-flight coalescing compares shapes, non-identical shapes conflict withrestore_in_progress, superseded raw results are permanently fenced while same-shape timeout retry survives. The design consumes these boundaries rather than re-declaring them, and keeps the fail-closed direction throughout (no fallback to the old loader, no empty-fallback degradation, typed limit errors bypass thepartial/replayErrordowngrade). - All ~19 referenced identifiers (
computeInitialTurnFromHistory,recoverGoalFromRecords,reserveStartingSessionId,discardStoredSessionIfCurrent,createAndStoreSession,estimateIndexCacheBytes,validateRestoredSnapshots,supersedeUnrestorableGoal, etc.) exist in current main; theloadCliConfig()pre-Config full load and the live write-barrier full reload in acpAgent.ts are accurately described.
Doc quality: internally consistent — projection acquisition modes, one-shot release discipline, consumer migration table, and failure-semantics table agree with each other; acceptance criteria are measurable (exact 32 MiB / 10,000-update boundary tests, one-scan assertions, deterministic cooperative-scheduling tests) and disclosure channels are named. Shipped vs planned work is cleanly separated, and both intentional compatibility changes (256 MiB cold-restore cap, 32 MiB transformed-replay cap) are explicitly gated on maintainer sign-off.
Nit (non-blocking): the status snapshot (head 2026-08-12T02:18Z) predates #8939 and #8955 (merged later that day) and doesn't note #8883 already merged. No contradiction — those touch WebUI refresh / prompt-admission surfaces this design explicitly disclaims, and the delivery rule already requires branching from fresh main — but worth refreshing the prerequisite-status line when implementation starts.
CI: 59/59 checks green/skipped on head sha.
|
Released in v0.21.11. |
What this PR does
This documentation PR defines the reviewed implementation contract for #8678's selective daemon session restore. The prerequisite work in #8691, #8833, #8882, and #8933 has merged, so the runtime implementation can proceed from current
main; #8883 and the later ownership slices remain related but are not prerequisites.The design replaces cold
loadSession/resumeSessionfull transcript materialization with one cold restore projection and a narrower live projection. It specifies one sequential index scan plus selected-record seeks, cooperative scheduling between complete records, shared Goal/artifact/FileHistory reducers, request-local cache admission, and exact replay-shape handling forall,recent(limit), andnone.The lifecycle reuses the existing session-id reservation, Session publication, and stored-session rollback boundaries. It validates the replay envelope before runtime hydration, keeps selective side effects behind the existing fallible setup, and avoids introducing a second admission state machine or a general-purpose activation framework.
Explicitly recent bulk replay is bounded to 32 MiB and 10,000 updates, while an omitted
historyPageSizepreserves legacy full visible replay. The design adds no public REST or SDK success field. Durable checkpoints, worker-thread or streaming JSON parsing, and unrelated full-content readers remain follow-up work.This PR contains the design and implementation plan only; it does not contain the runtime implementation, benchmark results, or E2E evidence.
Why it's needed
The current daemon cold path materializes the complete JSONL transcript before configuration and can materialize it again after writer-lease acquisition.
historyPageSizeis applied only after those allocations, so a client requesting a small recent page can still pay duplicate full-read and reconstruction cost.The existing reader also parses complete physical records synchronously on a shared ACP child. Cumulative scan work can delay active sibling sessions, while one large JSON record remains an indivisible parse interval. The design therefore combines bounded selection with cooperative record-boundary yielding without adding protocol surface or a second reader.
The merged prerequisites now provide safe restore timeouts, attachment identity, transactional WebUI switching, and exact request-shape coalescing. This document binds selective restore to those existing ownership and failure contracts before core and cross-package implementation begins.
Reviewer Test Plan
How to verify
historyPageSizeretains full-replay compatibility.npx prettier --check docs/design/2026-08-08-selective-session-restore.md docs/plans/2026-08-08-selective-session-restore.mdandgit diff --check; both should pass.Evidence (Before & After)
N/A — documentation-only change with no user-visible or runtime behavior.
Tested on
Environment (optional)
macOS Darwin arm64; Node.js 22; Prettier, Git diff validation, and two consecutive broad clean audit passes.
Risk & Scope
qwen/session/loadUpdates, independent live-task/realtime startup readers, and later ownership slices.historyPageSizeis omitted and introduces typed failures only for the explicitly documented transcript and recent-page bounds after maintainer approval.Linked Issues
References #8678
Prerequisites #8691, #8833, #8882, and #8933 are merged. Related but not required: #8883 and the later ownership slices.
中文说明
本 PR 做了什么
这个文档 PR 定义了 #8678 daemon 会话选择性恢复方案经过评审的实施契约。前置工作 #8691、#8833、#8882 与 #8933 均已合入,因此运行时实现可以基于当前
main推进;#8883 与后续 ownership 切片仍然相关,但不是前置条件。方案使用一个冷恢复 projection 和一个更窄的 live projection,替代冷
loadSession/resumeSession对完整 transcript 的物化。它规定执行一次顺序索引扫描加 selected-record seek,在完整记录之间协作式让出调度,复用 Goal、artifact 与 FileHistory reducer,按请求将新索引加入缓存,并对all、recent(limit)和none采用精确 replay shape。生命周期复用现有 session-id reservation、Session 发布和 stored-session 回滚边界。它在运行时 hydration 前验证 replay envelope,将选择性恢复新增的副作用放在现有可失败 setup 之后,并且不引入第二套 admission 状态机或通用 activation 框架。
显式 recent bulk replay 限制为 32 MiB 和 10,000 条 update,省略
historyPageSize时继续保留旧版完整可见 replay。方案不增加公开 REST 或 SDK 成功字段。持久 checkpoint、worker-thread 或 streaming JSON 解析以及无关的全量内容 reader 仍属于后续工作。本 PR 只包含设计与实施计划,不包含运行时实现、benchmark 结果或 E2E 证据。
为什么需要
当前 daemon 冷路径会在配置构建前物化完整 JSONL transcript,并可能在获取 writer lease 后再次物化。
historyPageSize只在这些分配完成后才生效,因此客户端即使只请求一小页最近历史,也可能承担重复的全量读取和重建成本。现有 reader 还会在共享 ACP child 上同步解析完整物理记录。累计扫描工作可能延迟活跃 sibling session,而单条大型 JSON 记录仍然是不可分割的解析区间。因此方案将有界选择与记录边界上的协作式让出结合起来,同时不增加协议面或第二套 reader。
已合入的前置工作现在提供安全恢复超时、attachment identity、事务式 WebUI 切换和精确 request-shape coalescing。本设计在 core 与跨 package 实现开始前,将选择性恢复绑定到这些既有 ownership 和失败契约。
Reviewer 测试计划
验证方式
historyPageSize时保留完整 replay 兼容性。npx prettier --check docs/design/2026-08-08-selective-session-restore.md docs/plans/2026-08-08-selective-session-restore.md和git diff --check,两者都应通过。证据(Before & After)
N/A——纯文档变更,没有用户可见或运行时行为变化。
测试平台
环境(可选)
macOS Darwin arm64;Node.js 22;使用 Prettier、Git diff 校验和两轮连续全面 clean 审计。
风险与范围
qwen/session/loadUpdates、独立 live-task/realtime startup reader,以及后续 ownership 切片。historyPageSize时保留完整 replay,并且只有在 maintainer 批准后,才会为明确记录的 transcript 和 recent-page 边界引入 typed failure。关联 Issue
References #8678
前置 #8691、#8833、#8882 与 #8933 均已合入。相关但非前置:#8883 与后续 ownership 切片。