merge: bring local uncommitted work onto the cloud-agent branch

Merges the wip/local-snapshot-20260901 safety commit (94 uncommitted files:
in-flight Account/Mac/Tip work, clipboard-semantics improvements, and the
feature-preview recording tooling) into the newer cloud-agent line.

Conflict resolutions:
- docs/*: honour the branch's deliberate removal in eac44da; drop the now
  dangling docs/archive/README.md that only pointed at the deleted files.
- CHANGELOG: both sides describe separate [Unreleased] features; keep both.
- ClipboardSkillSemanticRanker: take the branch's reply routing, which retires
  ranking playfulReply/acceptInvitation/... as separate skills in favour of
  ordinary/formal/playful variants inside one reply action. Keep the local
  link/phone/CJK-density work, which is orthogonal and still referenced.
- OfficialSkillCatalogTests: keep the local "installed exactly once" assertion;
  it matches the test's own comment and does not hardcode the default set.
- ClipboardSkillSemanticRankerTests: keep both sides' disjoint test functions;
  retarget the two link/phone cases at the branch's row, which no longer
  surfaces the retired specialised reply skills.

Verified: xcodebuild build succeeds and the 77 ranker/catalog/analyzer tests
pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 12:34:23 -07:00
co-authored by Claude Opus 5
79 changed files with 3459 additions and 1178 deletions
@@ -294,6 +294,21 @@ final class ClipboardSemanticAnalyzerTests: XCTestCase {
XCTAssertFalse(acknowledgment.replyableMessage.isDetected)
}
/// The classifiers are trained on single sentences. A multi-sentence paste
/// analyzed as one blob dilutes bag-of-words confidence below the routing
/// threshold, so the intent must be scored per sentence instead.
func testIntentIsFoundInsideAMultiSentencePaste() async {
let analysis = await ClipboardSemanticAnalyzer().analyze(
"""
各位好,这是本周的进度同步。设计稿已经全部定稿,开发那边也开始联调了。\
麻烦你今天下班前把新版报价单发我。另外测试环境这两天可能会有波动,\
大家注意一下。
"""
)
XCTAssertTrue(analysis.task.isDetected)
}
func testPersonalPlanDoesNotBecomeAutomaticTask() async {
let analysis = await ClipboardSemanticAnalyzer().analyze(
"私人备忘:我准备周五自己整理完这份报告。"