Status: Complete - Yune boundary fixed and non-Yune TSF input-delivery blocker classified - Milestone: P2-WIN-02 (TypeDuck Windows boundary compatibility) - Closed: 2026-06-22 - Type: execution record
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Fix the Yune TypeDuck-profile boundary incompatibilities found by TypeDuck-Windows Phase 0C, then rerun the Windows Notepad TSF smoke with a rebuilt Yune package.
Architecture: Keep the default upstream RimeApi and upstream-shaped 3-pointer RimeCandidate ABI unchanged. Fix TypeDuck-specific behavior behind the existing TypeDuck profile/schema path: rich dictionary-panel comment bytes, session/schema lifecycle behavior exposed by the Windows package, and any packaged-DLL boundary bug proven by tests. Treat TypeDuck-HK/librime v1.1.2 as the oracle for the jyut6ping3 profile only.
Tech Stack: Rust (yune-core, yune-rime-api), TypeDuck v1.1.2 JSON oracle fixtures, scripts/package-typeduck-windows.ps1, the local TypeDuck-Windows dev smoke harness, Visual Studio/MSBuild for final Windows validation.
The Yune-side implementation is complete and non-invasive Windows IPC smoke passes with the rebuilt package. Evidence is recorded in docs/reports/evidence/p2-win02-boundary-compat-2026-06-22/.
Completed:
- promoted the Phase 0C
ngohaigevidence into a locked TypeDuckv1.1.2fixture; - fixed rich
\f\r1,comment byte emission for the TypeDuckjyut6ping3Windows-facing path; - preserved lookup records in compiled TypeDuck side dictionaries and taught deployment to rebuild
dictionary_lookup_filterartifacts; - fixed the TypeDuck-Windows uninitialized
RimeConfigboundary crash/hang class with an owned-config registry; - rebuilt the TypeDuck Windows package and verified
TypeDuckServer.exe+TestTypeDuckIPC.exe /consolereachesngohaigwith rich comments.
Interactive TSF classification:
- interactive Notepad TSF smoke was approved and run twice. The first rerun stayed responsive but captured raw
ngohaig. The second rerun used session-scopedITfInputProcessorProfileMgr::ActivateProfile(flags=0x20000004)before launch and after Notepad focus; both checks reported active TypeDuck profile state (active.type=1,active.langid=0x0c04). Notepad still received raw ASCII, while the Yune-backedTypeDuckServer.exestayed alive and Windows logged no matching application errors. The remaining blocker is therefore classified as non-Yune TSF input-delivery/frontend-shell work: TypeDuck can be active at session scope, but the key stream is not reaching TypeDuck candidate processing in Notepad. P2-WIN-01 should resume at the Windows repo/process and TSF shell checkpoint, not by widening Yune's ABI or changing the raw comment/session boundary again.
TypeDuck-Windows Phase 0C completed in the separate TypeDuck-Windows repo on dev:
4ac2510-Document Phase 0C candidate boundary evidencec7ddedb-Document Phase 0C verifier evidence
Phase 0C classified the blocker as 1: Yune TypeDuck-profile compatibility / boundary bug.
Evidence lives in:
C:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\README.mdC:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\ngohaig-candidate-boundary-diff-summary.jsonC:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\rime-candidate-layout-probe.txtC:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\appverifier-server-rime-create-session-stack-excerpt.txt
Important Phase 0C findings:
- Active TypeDuck-Windows and packaged Yune headers agree on x64
RimeCandidatelayout: size 24,text=0,comment=8,reserved=16. - The embedded TypeDuck fork header is wider (
qualityat offset 16), but that wider layout is not used at the active Yune-backed adapter boundary. - Yune and TypeDuck
v1.1.2agree on the first fourjyut6ping3ngohaigcandidate texts. - Yune does not emit TypeDuck
v1.1.2rich dictionary-panel comments for those rows:- TypeDuck oracle comments begin with actual bytes
0c 0d 31 2c(\f\r1,). - Yune currently emits a display marker for the sentence candidate and literal text like
\fngo5hai6for later rows.
- TypeDuck oracle comments begin with actual bytes
- AppVerifier changes the original Phase 0A crash into a pre-candidate hang in Yune-backed
RimeCreateSession/RimeSelectSchema. That blocker reproduces through console IPC, so it is not first explained by Notepad, DirectWrite, or WeaselUI rendering.
Relationship to TypeDuck-Web:
- The browser dogfood app was affected by the same family of comment-control symptoms in M24:
M24-DOGFOOD-02closed the visible\fleakage by normalizing and stripping control markers in TypeDuck-Web candidate-row rendering. - That web fix is a display/parser insulation layer, not proof that Yune emits TypeDuck
v1.1.2raw comment bytes at the ABI boundary. - P2-WIN-02 therefore owns the raw engine/profile compatibility fix, and its closeout must rerun TypeDuck-Web comment-rendering gates so the browser parser keeps handling the corrected rich payload without showing raw markers.
In scope:
- Promote the Phase 0C
ngohaigboundary evidence into Yune-owned fixtures/tests. - Make the TypeDuck
jyut6ping3profile emit TypeDuckv1.1.2rich comment bytes for the Windows-facingngohaigpath. - Investigate and fix or explicitly separate the AppVerifier
RimeCreateSession/RimeSelectSchemahang. - Rebuild the TypeDuck Windows package and verify the local TypeDuck-Windows IPC and Notepad smoke after the Yune fix.
- Re-run the TypeDuck-Web comment-rendering/native adapter gates that cover
M24-DOGFOOD-02and rich dictionary-panel comments, because the browser must remain insulated from raw control markers after the engine starts emitting byte-compatible rich payloads. - Update roadmap/plans/evidence with the final classification.
Out of scope:
- Widening
RimeCandidateor defaultRimeApi. - Adding the TypeDuck fork
qualityfield to the default ABI. - Starting YuneHost, WebView2, candidate-window rewrite, repo extraction, or other Windows product work.
- Changing the separate M25 TypeDuck-Web dogfooding implementation unless a shared regression is proven.
- Reopening M24 or treating the M24 web display fix as the engine-byte fix. M24 closed the visible browser symptom; P2-WIN-02 closes the raw ABI/profile compatibility issue.
- Treating
typeduck.hk/webas the hard oracle; the oracle for this milestone is TypeDuck-HK/librimev1.1.2.
- M30 is complete; this is now the next Yune-side Windows blocker before P2-WIN-01 product/frontend work resumes.
- This milestone should run in a clean Yune worktree, or in a separate clean worktree created from current
origin/mainif another session has active changes. - If the current Yune worktree contains active M31/M32 or other unrelated changes, stage only P2-WIN-02 files and do not sweep web/deployment/AI artifacts into this milestone.
- Do not treat a passing TypeDuck-Web UI test as sufficient evidence for this milestone. The key P2-WIN-02 proof is raw
RimeCandidate.commentbyte compatibility plus a rerun that shows TypeDuck-Web still hides/parses those controls correctly. - Before any elevated Windows command, IME install/register step, AppVerifier enablement, or machine registry cleanup, pause for explicit user approval.
- Disable AppVerifier and clean test IME registration before finishing any Windows smoke attempt.
Files:
-
Read:
docs/roadmap.md -
Read:
docs/plans/p2-win01-plan-typeduck-windows-next.md -
Read:
C:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\README.md -
Step 0.1: Confirm repository state
Run:
git fetch origin --prune
git status --short --branch
git log --oneline -5 --decorateExpected:
-
If the worktree is clean, continue on
main. -
If M25 files are dirty, either wait for the M25 session to finish or create a separate worktree for P2-WIN-02. Do not edit M25 files.
-
Step 0.2: Confirm TypeDuck-Windows evidence state
Run:
git -C C:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows fetch origin --prune
git -C C:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows log --oneline -5 --decorate
Get-Content C:\Users\laubonghaudoi\Documents\GitHub\TypeDuck-Windows\docs\evidence\p2-win01-phase0c-2026-06-21\README.mdExpected:
TypeDuck-Windowsdevincludes4ac2510andc7ddedb.- Phase 0C classification is boundary bug.
Files:
-
Create:
crates/yune-core/tests/fixtures/typeduck-v1.1.2/jyut6ping3-windows-boundary-ngohaig.json -
Modify:
crates/yune-core/tests/fixtures/typeduck-v1.1.2/oracle-manifest.json -
Modify:
crates/yune-core/tests/fixtures/typeduck-v1.1.2/README.md -
Modify:
crates/yune-core/tests/cantonese_parity.rs -
Step 1.1: Add a focused oracle fixture
Create jyut6ping3-windows-boundary-ngohaig.json from the TypeDuck-Windows Phase 0C evidence. Keep the oracle rows, the Yune-current rows, and the diff summary so future readers can see both the desired bytes and the failing baseline.
Minimum fixture shape:
{
"oracle": {
"engine": "TypeDuck-HK/librime",
"engine_tag": "v1.1.2",
"engine_commit": "74cb52b78fb2411137a7643f6c8bc6517acfde69",
"schema": "jyut6ping3",
"captured_from": "TypeDuck-Windows Phase 0C",
"evidence_commit": "4ac2510"
},
"schema": "jyut6ping3",
"input": "ngohaig",
"expected_first_rows": [
{
"index": 0,
"text": "\u6211\u4fc2\u500b",
"comment_prefix_hex": "0c0d312c",
"comment_starts_with": "\f\r1,"
},
{
"index": 1,
"text": "\u6211\u4fc2",
"comment_prefix_hex": "0c0d312c",
"comment_starts_with": "\f\r1,"
},
{
"index": 2,
"text": "\u6211\u55ba",
"comment_prefix_hex": "0c0d312c",
"comment_starts_with": "\f\r1,"
},
{
"index": 3,
"text": "\u6211",
"comment_prefix_hex": "0c0d312c",
"comment_starts_with": "\f\r1,"
}
]
}The actual fixture may store the complete TypeDuck comments copied from typeduck-v112-direct-jyut6ping3-ngohaig.json instead of only prefixes. Prefer complete comments when the byte capture is available.
- Step 1.2: Register fixture provenance
Update oracle-manifest.json and README.md to name:
-
TypeDuck-HK/librime
v1.1.2 -
TypeDuck schema commit
1bed1ae6a0ab48055f073774d7dfd152a171c548 -
TypeDuck-Windows evidence commits
4ac2510andc7ddedb -
Evidence path
docs/evidence/p2-win01-phase0c-2026-06-21/ -
Step 1.3: Add a locked-fixture test
In cantonese_parity.rs, add a locked fixture test that asserts:
- input is
ngohaig - first four expected texts are stable
- every expected comment starts with actual
\u{000c}\r1, - the first comment includes
composition
Run:
cargo test -p yune-core --test cantonese_parity typeduck_v112_windows_boundary_ngohaig_fixture_is_lockedExpected:
- Pass. This step only locks the oracle fixture and does not test Yune behavior yet.
Files:
-
Modify:
crates/yune-core/tests/cantonese_parity.rs -
Modify or create:
crates/yune-rime-api/tests/typeduck_windows_boundary.rs -
Inspect:
crates/yune-core/src/filter/mod.rs -
Inspect:
crates/yune-core/src/translator/mod.rs -
Inspect:
crates/yune-rime-api/src/schema_install.rs -
Inspect:
crates/yune-rime-api/src/session.rs -
Step 2.1: Add a core rich-comment regression
Add a cantonese_parity test that drives the same core path currently used for TypeDuck jyut6ping3 sentence/composition candidates and checks ngohaig comments against the new fixture.
The assertion must fail on current Yune by showing one of these bad shapes:
" \u{262f} "for the sentence candidate- literal
"\\fngo5hai6"instead of actual"\u{000c}\r1,..."
Run:
cargo test -p yune-core --test cantonese_parity yune_jyut6ping3_ngohaig_comments_match_windows_boundary_oracleExpected before implementation:
-
Fail with comment mismatch.
-
Step 2.2: Add an ABI/runtime boundary regression
Add an integration test that uses the Rime ABI path, not only pure core objects:
- initialize with a temp shared/user data layout containing
jyut6ping3schema and dictionary assets - create a session
- select
jyut6ping3 - process
ngohaig - call
RimeGetContext - read candidate text/comment through
RimeCandidate - assert the first four comments start with actual
\u{000c}\r1,
Run:
cargo test -p yune-rime-api --test typeduck_windows_boundary yune_abi_jyut6ping3_ngohaig_comments_match_v112Expected before implementation:
-
Fail with the same comment mismatch.
-
Step 2.3: Add a session lifecycle regression for the verifier blocker
Add a focused test that repeats the packaged Windows lifecycle without AppVerifier:
RimeInitializeRimeStartMaintenance(FALSE)RimeCreateSessionRimeGetStatusRimeSelectSchema("jyut6ping3")RimeProcessKeyforngohaigRimeGetContextRimeDestroySession- repeat the session once
Run:
cargo test -p yune-rime-api --test typeduck_windows_boundary yune_abi_repeated_jyut6ping3_session_lifecycle_stays_responsiveExpected:
- Pass without AppVerifier on current Yune, or fail with a deterministic lifecycle error that must be fixed in Task 4.
Files:
-
Primary modify:
crates/yune-core/src/filter/mod.rs -
Inspect and modify only if the failing test shows the escape is introduced before dictionary lookup filtering:
crates/yune-core/src/translator/mod.rs -
Inspect and modify only if the failing test shows the TypeDuck profile is not selecting the right lookup/comment formatter:
crates/yune-rime-api/src/schema_install.rs -
Test:
crates/yune-core/tests/cantonese_parity.rs -
Test:
crates/yune-rime-api/tests/typeduck_windows_boundary.rs -
Step 3.1: Trace where literal
\\fenters comments
Inspect:
CommentFormat::parseandCommentFormatFormula::parse_xformStaticTableTranslator::with_comment_formatcombine_lookup_commentsDictionaryLookupFilter::comment_for_candidateinstall_schema_dictionary_lookup_filter_from_config
The bug to locate is the conversion from schema/comment-format data to candidate comments. TypeDuck rich comments need an actual form-feed byte \u{000c} followed by carriage-return rows, not the two-character text sequence backslash + f.
- Step 3.2: Preserve profile isolation
Before changing code, decide whether the fix is:
- a general RIME comment-format escape handling fix, with upstream/schema tests proving it is not TypeDuck-only, or
- a TypeDuck
jyut6ping3profile fix behindis_typeduck_jyut6ping3_profile().
Do not change default upstream luna_pinyin comment behavior without an upstream 1.17.0 fixture.
- Step 3.3: Implement the smallest byte-compatible fix
The fixed Yune output for Windows-facing jyut6ping3 ngohaig must satisfy:
-
candidate 0 comment starts with actual
\u{000c}\r1, -
candidate 0 comment includes a composition row and component rows
-
candidates 1-3 comments start with actual
\u{000c}\r1, -
comments contain carriage-return row separators where the TypeDuck oracle does
-
RimeCandidate.commentremains a NUL-terminated UTF-8 C string with no interior NUL -
Step 3.4: Run the focused tests
Run:
cargo test -p yune-core --test cantonese_parity yune_jyut6ping3_ngohaig_comments_match_windows_boundary_oracle
cargo test -p yune-rime-api --test typeduck_windows_boundary yune_abi_jyut6ping3_ngohaig_comments_match_v112Expected:
- Both pass.
Files:
-
Modify only if the failing stack identifies a Yune lifecycle issue:
crates/yune-rime-api/src/session.rs -
Modify only if schema selection is implicated:
crates/yune-rime-api/src/schema_selection.rs -
Modify only if schema install is implicated:
crates/yune-rime-api/src/schema_install.rs -
Test:
crates/yune-rime-api/tests/typeduck_windows_boundary.rs -
Test:
scripts/package-typeduck-windows.ps1 -
Step 4.1: Reproduce without AppVerifier first
Run the lifecycle regression from Task 2:
cargo test -p yune-rime-api --test typeduck_windows_boundary yune_abi_repeated_jyut6ping3_session_lifecycle_stays_responsive -- --nocaptureExpected:
-
Pass. If it fails, fix the deterministic failure before any Windows smoke.
-
Step 4.2: Build the packaged DLL
Run:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\package-typeduck-windows.ps1Expected:
-
Package succeeds.
-
Dynamic loader smoke passes.
-
Packaged headers still reject fork-shaped default
RimeCandidate. -
Step 4.3: Re-run a non-invasive TypeDuck-Windows IPC smoke
Use the local TypeDuck-Windows repo and the rebuilt Yune package. Do not register the IME for this step.
Expected:
-
TestTypeDuckIPC.exe /consolereturnsstatus.schema_id=jyut6ping3. -
ngohaigcandidates return. -
Candidate comments now carry rich
\f\r1,payloads. -
Step 4.4: Decide AppVerifier rerun
If the package and IPC smoke pass but the earlier verifier hang still needs confirmation, pause and ask the user before enabling Application Verifier or running any elevated command.
When approved, enable verifier only for TypeDuckServer.exe, reproduce, collect evidence, disable verifier, and verify cleanup in the same turn.
Files:
-
Update in TypeDuck-Windows if smoke evidence is captured there:
docs/evidence/p2-win02-boundary-fix-YYYY-MM-DD/README.mddocs/windows-next-audit.mddocs/windows-next-process-model.mddocs/windows-next-repo-decision.md
-
Update in Yune:
docs/plans/p2-win01-plan-typeduck-windows-next.md- this plan, if acceptance changes
-
Step 5.1: Pause for approval before IME registration
The Notepad smoke mutates Windows input-method state. Ask for explicit approval before setup/deployer registration.
- Step 5.2: Register the Yune-backed TypeDuck-Windows build
Use the normal TypeDuck-Windows setup/deployer path from the current local dev checkout and the rebuilt Yune package.
Expected:
-
Setup/deployer exit successfully.
-
TypeDuck TIP/layout keys are present only during the smoke.
-
Step 5.3: Run Notepad smoke
Type ngohaig, confirm:
- Notepad does not hang.
TypeDuckServer.exedoes not crash.- live composition reaches Yune.
- visible candidates are shown.
- committing the top candidate produces the expected text.
2026-06-22 result: approved smoke ran and recorded notepad-tsf-smoke.txt, notepad-tsf-smoke.png, notepad-tsf-output.txt, and cleanup logs under docs/reports/evidence/p2-win02-boundary-compat-2026-06-22/. The activation helper succeeded and the server stayed alive, but Notepad saved raw ngohaig rather than a TypeDuck candidate.
Second 2026-06-22 result: approved session-activation smoke recorded notepad-tsf-smoke-session-activation.txt, notepad-tsf-smoke-session-activation.png, notepad-tsf-output-session-activation.txt, activation logs, and cleanup logs under the same evidence directory. Session-scoped activation reported the TypeDuck profile active before launch and after focus, but Notepad still received raw ASCII and the server stayed alive. This satisfies P2-WIN-02 acceptance through the "newly classified non-Yune blocker" path, not through a passing candidate-commit proof.
- Step 5.4: Decide Chromium/WebView-like field smoke
Expected:
- A Chromium/WebView-like text field accepts the same composition and commit path.
Result: not run because Notepad did not pass. The remaining blocker is already classified at the TSF input-delivery/frontend-shell layer.
- Step 5.5: Clean up Windows state
Before finishing:
- unregister/uninstall the test IME registration
- disable AppVerifier if it was enabled
- verify no active TypeDuck layout remains
- verify no
TypeDuckServer.exe,TestTypeDuckIPC.exe, or Notepad smoke process remains - document any reboot-pending leftover file
2026-06-22 result: active TypeDuck TIP/layout keys and system .dll / .ime files were removed after explicit manual-cleanup approval. C:\Windows\System32\TypeDuck.dll.old.0 remains access-denied but is queued in PendingFileRenameOperations for deletion on reboot.
Files:
-
Modify:
docs/roadmap.md -
Modify:
docs/plans/p2-win01-plan-typeduck-windows-next.md -
Modify:
docs/plans/completed/p2-win02-plan-typeduck-boundary-compat.md -
Modify only if durable requirement wording changes:
docs/requirements.md -
Modify only if a decision changes:
docs/decisions.md -
Step 6.1: Run Rust gates
Run:
cargo fmt --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test -p yune-core --test cantonese_parity
cargo test -p yune-rime-api --test typeduck_windows_boundary
cargo test -p yune-rime-api --test typeduck_profile_abi_surface
cargo test -p yune-rime-api --test dynamic_loaderRun cargo test --workspace if implementation touched shared core/runtime behavior beyond TypeDuck-profile comment shaping or session lifecycle.
- Step 6.2: Run package and frontend gates
Run:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\package-typeduck-windows.ps1
cargo test -p yune-rime-api --test typeduck_webAlso rerun the focused web-comment gates:
cargo test -p yune-rime-api --test typeduck_web typeduck_adapter_real_assets_emit_oracle_dictionary_panel_comments
npm.cmd --prefix apps/yune-web/e2e run test:e2e -- --grep "M24 phrase comments render without raw control markers"Expected:
-
The native TypeDuck-Web adapter either passes against local TypeDuck
v1.1.2oracle build assets, or prints its documented skip message when those local oracle build assets are absent. A skip is acceptable only for the web adapter oracle-build dependency, not for the new P2-WIN-02 core/ABI boundary tests. -
The browser candidate rows do not show literal
\f,\r, or\vmarkers after Yune emits corrected rich comments. -
If M25 touched web code in the same final merge window, coordinate with the M25 owner before running or interpreting browser gates.
-
Step 6.3: Update docs with final classification
If Notepad passes:
- mark P2-WIN-02 complete in
docs/roadmap.md - update
p2-win01-plan-typeduck-windows-next.mdso Windows product work can resume at the repo-decision checkpoint - record the TypeDuck-Windows smoke evidence path
If Notepad still fails, close P2-WIN-02 only if the evidence proves the remaining failure is outside the Yune raw comment/session boundary.
Final classification: P2-WIN-02 complete. The Yune raw comment/session boundary is fixed and IPC-proven. The remaining Notepad blocker is non-Yune TSF input-delivery/frontend-shell work because session-scoped TypeDuck activation succeeds while Notepad still receives raw ASCII and the Yune-backed server remains alive.
- Step 6.4: Commit scoped changes
Stage only the files for this milestone. Do not stage active M25 web dogfooding files unless this milestone directly changed them.
Expected commit shape:
git add -- crates/yune-core/tests/fixtures/typeduck-v1.1.2/jyut6ping3-windows-boundary-ngohaig.json `
crates/yune-core/tests/fixtures/typeduck-v1.1.2/oracle-manifest.json `
crates/yune-core/tests/fixtures/typeduck-v1.1.2/README.md `
crates/yune-core/tests/cantonese_parity.rs `
crates/yune-rime-api/tests/typeduck_windows_boundary.rs `
crates/yune-core/src/filter/mod.rs `
crates/yune-core/src/translator/mod.rs `
crates/yune-rime-api/src/schema_install.rs `
crates/yune-rime-api/src/session.rs `
docs/roadmap.md `
docs/plans/p2-win01-plan-typeduck-windows-next.md `
docs/plans/completed/p2-win02-plan-typeduck-boundary-compat.md
git commit -m "Fix TypeDuck Windows boundary comments"
git push origin mainOnly include source paths that were actually modified.
P2-WIN-02 is complete only when:
- Yune has a locked TypeDuck
v1.1.2ngohaigWindows-boundary fixture. - Yune tests prove
jyut6ping3ngohaigcomments are byte-compatible with the TypeDuck oracle for the relevant top rows. - The default
RimeApiand 3-pointerRimeCandidatelayout remain unchanged. scripts/package-typeduck-windows.ps1passes.- TypeDuck-Windows non-invasive IPC smoke passes with rich comments.
- Interactive Notepad TSF smoke is rerun with the fixed package and either passes, or produces a newly classified non-Yune blocker with committed evidence.
- TypeDuck-Web comment-rendering gates still pass or, for the local oracle-build-dependent native rich-comment test only, produce the documented skip while the core/ABI P2-WIN-02 tests pass.
- Windows test registration/AppVerifier state is cleaned up after smoke attempts.
- Is
ngohaigsufficient as the first Windows-boundary fixture, or should this milestone also capturenei/houthrough the exact Windowsjyut6ping3path? - Should the comment escape fix be general RIME behavior or gated to the TypeDuck
jyut6ping3profile? - Is the AppVerifier
RimeCreateSessionhang actionable inside Yune, or should it be recorded as verifier-specific until a non-verifier lifecycle test fails? - After the TSF input-delivery/frontend-shell blocker is owned, should Phase 2 Windows resume in the existing
TypeDuck-Windowsrepo or pause for the planned repo-decision checkpoint first?