Repository navigation
fix(chat): native chat shows literal details tags instead of collapsible sections - #1773
paulcam206 wants to merge 23 commits into
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: ready, awaiting a maintainer decision. What this changesThis PR renders supported details and summary wrappers as native collapsible sections and preserves Markdown safety and presentation. Example: An assistant sends <details><summary>Sources</summary> followed by evidence and a closing details wrapper.
Review scores
ProductKind: Feature · Worth it: Needs a maintainer decision · Fix scope: Complete Merge readiness⏳ Ready, awaiting maintainer decision This PR provides distinct native disclosure rendering that current main lacks, with no concrete introduced defect found; adoption remains a maintainer choice, and the required CI Gate remains red. Priority: P2 Decision needed
Before mergeNone. FindingsNone. Agent review detailsHow this fits togetherAssistant text enters ReactorChatTimeline, passes through sanitization and disclosure recognition, and becomes native WinUI Markdown controls and expanders. flowchart LR
A[Assistant text] --> B[Markdown sanitizer]
B --> C[Disclosure recognition]
C --> D[Markdown presentation]
C --> E[Native expanders]
D --> F[Chat timeline]
E --> F
Technical reviewBest possible solution: Adopt the bounded disclosure extension in the existing Markdown owners if maintainers approve its supported syntax. Do we have a high-confidence way to reproduce the issue? Current-main NoHtml rendering explains the literal wrappers, corroborated by the inspected BEFORE Hub capture; no target code or tests were executed during this review. Is this the best way to solve the issue? The parser reuses Markdown context recognition and the existing sanitizer and presentation owners, while native Expander state supplies the requested interaction without enabling general HTML. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 8d5e27bd8d3a. Provenance checked
TestingProof path: shipped entry point. SecurityNone. EvidenceWhat I checked:
Preflight sourceSource unknown. Source comparison at the observed PR snapshot only. Completion is self-reported; body, policy, tests, execution, and report bytes are not verified. Review metrics
LabelsLabel changes:
Label justifications:
Rating scale6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior. WorkflowClawSweeper edits this one comment on every review. Comment HistoryReview history (15 earlier review cycles; latest 8 shown)
Reviewed November 12, 2026, 10:58 PM ET / November 13, 2026, 03:58 UTC (Revision 16). |
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
Native Windows validation of #1773 Windows validation report (roboclaw/validate-pr-1773-20261027)1. Identity
2. Host
3. Commands and results (attempt 2, evidence
|
| Lane | Command | Exit | TRX total/executed/passed/failed/skipped |
|---|---|---|---|
| prereq diag | .\scripts\setup-dev.ps1 -CheckOnly |
0 | n/a |
| build | .\build.ps1 |
0 | n/a |
| Shared | dotnet build + dotnet test ...Shared.Tests --no-restore --logger trx;LogFileName=shared.trx |
0 | 4462 / 4427 / 4427 / 0 / 35 not run (integration-gated, OPENCLAW_RUN_INTEGRATION unset; same as hosted default) |
| Tray | same, tray.trx |
0 | 4259 / 4259 / 4259 / 0 / 0 |
| docs | .\scripts\validate-docs.ps1 |
0 | n/a |
| parser | run-proof-tests.ps1 ... ChatMarkdownDisclosureTests -ResultName pr1773-parser |
0 | 22 / 22 / 22 / 0 / 0; SiblingDisclosures_InspectAtMostOneTokenPerWrapper ran for both 2500 and 5000 |
| native UI | dotnet build ...UITests -c Debug -r win-x64; run-proof-tests.ps1 ... ReactorMarkdownDisclosureProofTests -RuntimeIdentifier win-x64 |
0 | 2 / 2 / 2 / 0 / 0 (Light theme case and inert-content case) |
4. Negative control
- Disposable local clone
C:\v\c1773-negctl3(only remote: the guest-local clone path; never pushed; guest has no GitHub credentials). Diff: one line inChatMarkdownDisclosures.cs, loop restored toi = 0 .. tokens.Count, counter and tests kept. dotnet test ...Tray.Tests --filter ChatMarkdownDisclosureTests: 22 / 22 / 20 passed / 2 failed. Only the two work-count cases failed:count: 2500actual 12,502,500 (allowed 2500-5000),count: 5000actual 50,005,000 (allowed 5000-10000). All 20 semantic cases (malformed, incomplete, list/quote/code, nesting, literal fallback) passed.- Proves: the new assertions detect the old quadratic traversal and the bounded loop is what reduces visits to O(n). It is an instrumented old-traversal control, not a pristine-base run, and not a wall-clock performance claim.
5. Visual/UIA evidence
- Native UI lane asserts UIA expand/collapse and markdown state on rerender/resize in Light theme, plus inert untrusted content. No screenshots taken (OPENCLAW_VISUAL_TEST not set; Dark/HighContrast screenshot expansion not run pending capture-owner consent). No pixels claimed.
6. Retained failures (all environmental, none candidate-caused)
- Attempt 1 (
1773-5ccdf0fe...): build/test exit 1 fromNU1301 No such host is known (api.nuget.org)during the 8:40 PM DNS outage. - Control attempts 1 and 2 (
negctl,negctl2): GitVersionNo base versions determinedbecause my disposable clone was detached / lackedorigin/main. Harness issue; fixed by mirroring the source clone'sorigin/mainref.
7. Reviews, decisions, unrun lanes
- No new source written. No code repair needed.
- Unrun: Dark/HighContrast screenshot expansion (needs capture-owner decision), ARM64 native run, Release/packaged app. Maintainer decision on adopting the restricted details/summary extension remains open.
8. Cleanup
- Guest released via
crabbox stop --provider hyperv cbx_a2e836d3ff6e;crabbox list --provider hypervandGet-VMconfirm the VM is gone. - Evidence:
files\evidence\1773\evidence-1773.zip(sha256 18A02885003C5B26536BBC1522D3B92AAFB9950F881BC08B3BC9D2B0E8FC2117), unpacked underfiles\evidence\1773\unpacked. Contains no credentials; tray roots are synthetic test data.
86f0c26 to
c8b8948
Compare
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
…ry context, update CI contract
…arated container markers
Audit by mutation of ChatMarkdownDisclosures plus replay of the five defect states the review found: drop 18 unit cases that no mutant or historical defect distinguishes, and reduce the native disclosure proof to Light plus the inert-content case in one process. Dark and HighContrast become screenshot-only captures under OPENCLAW_VISUAL_TEST=1.
Bound recursive part construction to the token indexes inside each disclosure. Keep wrapper recognition and literal fallback unchanged. Add deterministic breadth coverage for 2,500 and 5,000 siblings below the existing input cap. Co-authored-by: paulcam206 <16614499+paulcam206@users.noreply.github.com>
Each disclosure opener searched the entire remaining message for </summary> before the length check rejected it, so many unterminated openers below the input cap caused quadratic scanning. Search only the window an accepted summary can occupy; the accepted summary length is unchanged.
…ist-wrap check Resolving the rebase onto main removes ReactorChatMarkdownContractTests, which only matched timeline source text. Reactor now owns Markdown list layout, so the native disclosure proof asserts that a long list item wraps inside the narrowed host, and the ledger rows point at behavioral guards.
…sure A summary that was never closed searched ahead for any </summary> within the summary window, so an incomplete section took a later valid section's terminator and emitted one disclosure whose heading held the first body, its closer, and the next opener. A summary must now close before a blank line or another disclosure wrapper; otherwise the section stays literal and the later disclosure still renders. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
A pipe-free closing-wrapper line directly after a table closes the disclosure, matching GitHub Markdown (an HTML block start ends the table) and the existing nested-disclosure table coverage. Record this so the table-cell exclusion is not read as applying to that line. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The five files this PR adds were committed with CRLF while the repository stores 98% of its C# and scripts with LF, so a stock git diff --check over the PR range reported every line as trailing whitespace. Content is unchanged; none of the files contains a multi-line string literal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Alpha promotions check out the candidate source, which can predate Set-CiUiTestEnvironment.ps1. Running the exporter from that checkout would fail the UI job before any test ran, where the old inline job bindings worked. Load it from GITHUB_SHA like the crash-metadata helper and bind the roots to the candidate checkout explicitly. test-ci-ui-profile.ps1 now runs the workflow step against disposable history: a candidate without the exporter, a candidate with a different copy, and a failed extraction that must not write any roots. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Release promotions run the UI job against the candidate's checkout. An alpha that predates the native Markdown disclosure renderer has no NativeMarkdownProof tests, and the proof runner rejects a zero-test run, so the promotion would fail on proofs the candidate never had. Run the step during a promotion only when the candidate contains the proof tests. Ordinary CI always runs it and still fails on zero tests; the workflow contract pins that condition. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
main (openclaw#2093) now renders assistant http/https links and bare URLs as live hyperlinks, sanitizing with preserveWebLinks. Disclosure bodies follow that policy, but a summary is plain Expander header text, so a preserved web link would read as "[docs](<https://...>)". Re-sanitize summaries inertly so they read "docs (https://...)" as before. Replace the disclosure inert-content proof with a behavioral proof of the merged policy: web links and bare URLs inside and outside a disclosure are live with exact targets, file: links, images and raw HTML stay inert, the summary link reads as text, and the chat's underline-free link and inline-code chip styling reaches disclosure bodies. This also covers the source-text assertions main added to ReactorChatMarkdownContractTests, which this PR deletes.
main openclaw#2101 moved assistant Markdown to the web chat's 14-pixel block gap, with list, marker, divider and code-syntax hooks. A message that contains a disclosure still stacked its parts at the old 8-pixel gap, so the text around a disclosure and the blocks of its body sat tighter than the rest of the message. Disclosures now share MessageBlocks' rhythm, including the compact 8-pixel gap in thinking text. Markdown after a disclosure is rendered as its own block stack, so its first heading lost the 7-pixel lead-in a heading keeps after any other block. The renderer now learns whether a part leads its message or disclosure body, and only a leading part drops that lead-in. This PR deletes the source-text ReactorChatMarkdownContractTests, which openclaw#2101 extended. Its list, ordered-marker and thematic-break hook checks become mounted assertions in ReactorMarkdownWebParityProofTests; code syntax and highlighter cleanup were already covered there, and list wrapping by the disclosure proof. The list-layout ledger row now states that the ListItem hook only restyles and places the marker.
fd03c44 to
6efff19
Compare
|
Scoped maintainer refresh requested by @bkudiess: merging captured main |
Preserve current Markdown styling, links, shared theme ownership and CI lanes. Port the newer shared contrast-owner contract into the existing mounted Markdown behavior proof instead of retaining obsolete source-shape assertions. Co-authored-by: bkudiess <7658216+bkudiess@users.noreply.github.com>
|
Refreshed #1773 (fix(chat): native chat shows literal details tags instead of collapsible sections) on the original contributor branch with a normal, non-force push.
Conflict choice: the sole modify/delete conflict was Integration: the narrow balanced, sanitized details/summary parser and native Expander behavior are retained. #2093 link/inline-style policy and #2101 Markdown rhythm, list and code presentation remain in their existing owners. The five automatically merged owner/docs/project files were independently recomputed and matched the candidate byte-for-byte. The split Gateway fixture lane, isolated disclosure lane, production-resource/animation exclusions and pipeline-owned UI-profile export remain intact; no general HTML execution or redesign was added. Review and validation: independent GPT-6 Astra review through the canonical shared helper covered the full 17-file candidate against the exact main SHA, P0-P3, with no actionable findings ( New-head CI: Build and Test run 43298592551 and CodeQL run 43298591439 are pending/in progress. Required current-head Windows checks and behavior proof remain outstanding. The existing maintainer decision on adopting the restricted disclosure capability, and the previously noted proof-pool declaration correction, are unchanged. This branch is not being declared merge-ready. Handing back after this scoped refresh. No merge into main, title/body edit, draft transition or hosted re-review request was made. |
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
# Conflicts: # scripts/test-ci-workflow-contract.ps1
# Conflicts: # .github/workflows/ci.yml # scripts/test-ci-workflow-contract.ps1 # tests/OpenClaw.Tray.Tests/CiNugetCacheWorkflowTests.cs
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
What Problem This Solves
Fixes: native chat shows literal
<details>,<summary>, and</details>text instead of a collapsible section when an assistant message uses the common disclosure pattern.I started this work after seeing a reply in Hub chat that came back as a
<details>/<summary>block rendered as literal tags instead of a collapsible section. The BEFORE screenshots under Evidence reproduce that same literal-tag rendering with a canned message; they are not a capture of the original reply.User Impact
User impact: assistant messages with
<details><summary>...</summary>...</details>sections render as a native, keyboard-operable expand/collapse control named after the summary, with the Markdown body (paragraphs, lists, tables, quotes, code) revealed on expansion. Expansion state survives rerender, streaming body updates, and resize. Unsupported or incomplete forms stay literal text. No migration or user action required.Why This Change Was Made
The active chat path (
ReactorChatTimeline.BuildSafeMarkdownon Microsoft.UI.Reactor) usesNoHtml, so raw HTML is inert and<details>is never recognized. The change recognizes only balanced, block-level<details>/<summary>wrappers (the existing md4c parser distinguishes prose from code and containers), renders a native WinUIExpanderwith keyed Reactor expansion state, and passes the body through the existing sanitized Markdown renderer, so it follows the same rules as the rest of the message: http/https links and bare URLs are live (since #2093), while other link schemes, images and raw HTML stay inert. Summary text is plain header text, not an HTML surface; a link in it reads astext (url).Supported: same-line or later-line non-empty summary, initial
open, nested disclosures up to 16 levels. Left literal: unsupported attributes, empty summaries, summaries not closed before a blank line or another disclosure wrapper, deeper nesting, incomplete streaming wrappers, and disclosures inside code, quotes, lists, or table cells. An unclosed summary cannot borrow a later section's</summary>, so a following valid disclosure still renders. As in GitHub Markdown, a closing-wrapper line directly after a table ends the table and closes the disclosure.The implementation-string rendering guards were replaced by behavioral parser/native tests. The independent CI profile-isolation contract is now restored separately: the UI job runs Set-CiUiTestEnvironment.ps1 from the pipeline revision, and test-ci-ui-profile.ps1 executes that same exporter, and the workflow step that loads it, against throwaway checkouts and environment files. It checks the emitted data, roaming AppData, local AppData, and repository-root bindings without reading workflow or implementation source. The default-root case runs from a different caller directory to prove that repository selection follows the exporter checkout.
Author scope acceptance: The PR author accepts the documented restricted, balanced, block-level native
<details>/<summary>scope: "accept the narrow block-level syntax". Unsupported forms retain inert rendering and literal fallback.Sole remaining repository sign-off: the repository's maintainers still need to decide whether to adopt this restricted rendering capability. The author's scope acceptance carries no repository-maintainer approval.
Evidence
Current head
5a1b8975(merges ofmain1ebcf004,6ddc13b8and20d85144)The author normal-merged
mainthree times on top of the maintainer's merge0abb30a4, without rewriting it:422593cemerged1ebcf004,8890e1b8merged6ddc13b8, and the current head5a1b897510c4128765eb06cfe94da54d972ae0a1(treeb33f2873) mergedmain20d851442129767678b3345b9d5b5ea8ae114410.mainbrought: fix(setup): WSL setup rolls back when the Gateway restarts behind a live WSL relay #2128 (WSL setup rollback), fix(tests): intermittent CI failures when hosted runners are under load #2129 (test timing under hosted-runner load), fix(tests): mock Gateway fixture UI tests fail intermittently in CI #2132 (mock Gateway fixture UI test fixes, including the selector race that failed this PR's mock Gateway job at0abb30a4), fix(chat): replies stack as repeated partial bubbles while a GPT model streams #2134 (live replies render from the chat stream only), fix(ci): Tray UI tests fail intermittently and the step times out on passing runs #2130 (Tray UI test waits and a 25-minute Tray UI step limit), fix(ci): Tray UI tests time out when the whole suite runs serially in one job #2135 (the ordinary Tray UI suite split intoui-testsand a paralleltray-ui-shardjob) and fix(test): released-Gateway Dashboard proof fails when the job's first Edge launch is slow #2140 (Dashboard browser proof startup).8890e1b8:scripts/test-ci-workflow-contract.ps1only, where fix(ci): Tray UI tests fail intermittently and the step times out on passing runs #2130's 25-minute assertion sat next to this PR's disclosure-step assertions. Both are kept.5a1b8975: fix(ci): Tray UI tests time out when the whole suite runs serially in one job #2135's shard split, in.github/workflows/ci.yml,scripts/test-ci-workflow-contract.ps1andCiNugetCacheWorkflowTests.cs.Category!=NativeMarkdownProofis now part of the base exclusion both shards share, and the contract's partition proof uses that base, so the disclosure proofs stay out of both shards and run only in their own step.tray-ui-shardbinds its isolated roots through the same pipeline-ownedConfigure isolated UI product rootsstep asui-testsinstead of its inline job-level bindings; the contract checks this for both shards, andtest-ci-ui-profile.ps1now requires every copy of that step to equal the one it executes (9 checks). The source-textUiLane_IsolatesEveryProductRootAndSeparatesNativeOnboardingProoftest stays deleted;mainhad extended it to count the shard filters, which the contract's partition proof covers.docs/RELEASING.mdanddocs/TEST_COVERAGE.mddescribe both shards. Four negative controls, each mutating only the shard job, fail as intended: a job-level root binding, a shard filter withoutNativeMarkdownProof, a diverging root step and a missing root step (host-checks.txt).mainhas the samegit patch-idat0abb30a4and5a1b8975.ChatMarkdownDisclosures.cs,ChatMarkdownPresentation.cs,ReactorChatTimeline.cs, the disclosure unit tests and both disclosure and web-parity proofs are byte-identical to0abb30a4. No product source changed between8890e1b8and5a1b8975.5a1b8975; the required closeout, the disclosure lanes and three rounds of the Tray UI tests that failed in CI at422593ceran in a guest at8890e1b8, whose product source and UI test harness defaults are identical. Results and hosted CI are under Validation. The real Hub screenshots below were taken at0abb30a4and were not retaken, because the renderer is unchanged.Previous head
0abb30a4(maintainer merge ofmain3d5f1427)At maintainer @bkudiess's request, roboclaw-bot merged
main3d5f14270dd6bd8b260a723ff2e73a68ea858ca8into this branch on 2026-11-12 with a normal push (refresh note).0abb30a457652952c73aa78ff33cee67b3329525is a two-parent merge with6efff19afirst. The author pushed nothing after it.ReactorChatMarkdownContractTests.cs, whichmainimprove(chat): refine composer sizing and context controls #2117 extended and this PR deletes. It stays deleted. Its new source-text check that Markdown reads the sharedChatThemeChangescontrast owner became behavior: the mounted web-parity proof now setsChatThemeChanges.IsHighContrastand callsChatThemeChanges.Refresh()directly, and expects mounted Markdown highlighters to clear and return.mainchanged around disclosures: improve(chat): refine composer sizing and context controls #2117 gives prose the primary text tone and moves High Contrast tracking intoChatThemeChanges, whichChatMarkdownPresentation.IsHighContrastnow forwards to; it also wraps the transcript in a fade border. None of this touches the disclosure parser,Disclosures,MessageBlocksorBuildSafeMarkdown: those regions,ChatMarkdownDisclosures.cs, its unit tests and the disclosure proof are byte-identical to6efff19a.ChatMarkdownPresentation.IsHighContrastturned into a private probe instead of forwarding toChatThemeChanges, the web-parity proof fails at "High Contrast clears chat highlighters" in both themes (negctl-summary.txt). That is the gap the maintainer's retarget closes: the test previously set the Markdown probe directly, which bypasses the shared owner. Controls A and B were not repeated: the code they mutate and the assertions they target are byte-identical to6efff19a, where both failed as intended (history below).Native proof on
0abb30a4(latest real Hub screenshots)One throwaway crabbox Hyper-V guest, released afterwards: lease
cbx_5fbc94545ce3, Windows 11 Enterprise Insider Preview 10.0.29683 x64, 6 vCPU, interactive session, fresh clone with head0abb30a457652952c73aa78ff33cee67b3329525and tree226f73e6checked before and after, merge base3d5f1427, isolatedOPENCLAW_TRAY_*roots, WindowsAppSDK 2.6.5 (project.assets.jsonresolves 2.6.5, Reactor 0.1.0-preview.17) and the signed WindowsAppRuntime 2.6.5 installer....Sha.0abb30a457652952c73aa78ff33cee67b3329525,OpenClaw.Tray.WinUI.exeSHA-2567DEED6F0C71CBD63FE182DF8B938AE9663709ADA70AB27977287A0BA1501A90C. BEFORE:main3d5f14270dd6bd8b260a723ff2e73a68ea858ca8, SHA-256178D99C92F37CE5F39D30ED3CD4C9D15ADB68B0EA26711EDF285D7FFC63E2085, same guest, fixture host and transcript.--themeoption sets the theme; the only harness change serves the transcript.16e785ddon branchproof/1773-0abb30a4-20261112(summary.txtwith TRX counts and hashes, per-theme UIA reports, the negative-control result, the disclosure test-host captures undervisual/andmain's web-parity sample rendered by this head undervisual-webparity/).main3d5f1427, Light0abb30a4, Light0abb30a4, DarkUIA log, identical for Light and Dark: "Sources and evidence"
Collapsed,Expand,Expanded; "Raw command output"CollapsedtoExpanded; both collapsed again; in the review case the unclosed<details><summary>Firststays literal and "Second" expands. Onmainthere are no disclosure buttons.Earlier-head evidence (superseded by the current head above; kept for history)
Earlier-head screenshots are linked rather than embedded.
Head
6efff19a(rebased onmain65de1e35, superseded by the maintainer merge0abb30a4)main65de1e35, resolving conflicts with improve(chat): assistant Markdown follows the web chat's spacing, tones and code colors #2101 (web Markdown rhythm, list, marker and divider hooks, code colors) and feat(automations): native Automations page with web parity #1893 (CI). Disclosures adoptedmain's 14-pixel block rhythm, and a heading right after a disclosure keeps its lead-in. improve(chat): assistant Markdown follows the web chat's spacing, tones and code colors #2101's source-text checks were replaced by mounted list, marker and divider assertions inReactorMarkdownWebParityProofTests.cbx_88fd03b6e5de:./build.ps1passed; Shared 5,772 passed; Tray 6,323 passed; parser 27; disclosure proofs 2/2; visual 4/4;main's Markdown UI proofs 7/7. Negative control A (old 8-pixel gap, list hooks removed) failed on the block gap (14 vs 8) and list gap (6 vs 2); B (divider hook removed, Markdown after a disclosure treated as leading) failed on the heading lead-in (7 vs 0) and the divider's accessibility view. Real Hub Light and Dark UIA checks passed. Hub...Sha.6efff19a, SHA-256D26C9EDA299EC7FB08616D65E5672163CEED631CE524C65859344B61103604B7. Assets on08c7df27.6efff19a: its runs were created during GitHub's Actions incident on 2026-11-11 and stayed queued with no jobs.Screenshots (
main65de1e35BEFORE,6efff19aLight and Dark: both collapsed, sources expanded, both expanded, review case):1773-6efff19a/real-hub/at the pinned proof commit.Head
fd03c448(rebased onmaine59374c0, superseded by6efff19a)mainimprove(chat): align native conversation and tool activity with web #2093 made assistant http/https links and bare URLs live and added after-reconcile inline styling. The disclosure renderer adoptedmain's sanitizer, Markdown options and styling, andfd03c448kept summaries inert (a summary link readsdocs (url)).AssistantMarkdown_DisclosureFollowsTheChatLinkAndContentPolicyreplaced the inert-content proof; a negative control without the inert summaries failed exactly that proof.cbx_50d4db5c64c4:./build.ps1passed; Shared 5,615 passed; Tray 6,152 passed; parser 27; disclosure proofs 2/2; visual 4/4; real Hub Light and Dark UIA checks passed. Hub...Sha.fd03c448, SHA-2561382B1C0BB94D4E7F1BE89A0CC2A506266073A4580053398078B7367AC19C694. Assets on101a82fc.maine59374c0.Screenshots (
maine59374c0BEFORE,fd03c448Light and Dark: both collapsed, sources expanded, both expanded, review case):1773-fd03c448/real-hub/at the pinned proof commit.Head
ffdbc4a1(rebased onmain045d13ac, superseded byfd03c448)mainrefactor(ui): share responsive page presentation #2085 in three CI files were resolved by combining both sides: the Tray UI filter excludes the animation-preference categories andNativeMarkdownProof, and the PR still deletes the source-text UI-lane test that the behavioral contract script covers.1b0451c8(the UI job loadsSet-CiUiTestEnvironment.ps1from the pipeline revision) andffdbc4a1(promotions of older alphas skip absent disclosure proofs). Both have negative controls.cbx_187c5faeb4e8: CI's disclosure step 2/2, visual run 4/4, real Hub Light and Dark UIA checks passed. Hub...Sha.ffdbc4a1, SHA-256ED5248EAE2D9385BEE4B940FA252FAF2C321790EEDBD43F77FBD4CE29DFD097D. Assets onbc79b83e.main's unrelated mock-Gateway voice-reply timeout, so the disclosure step was skipped there.main4aee38a1, Lightffdbc4a1, Lightffdbc4a1, DarkValidated head
66a6d46b(rebased onmain4aee38a1)Changes in this revisit:
main4aee38a1bfaa2f7d241130a3548d94f0547a3c9c.git range-diffshows every patch unchanged. The emptyci: retriggercommit was dropped.7c906f93fixes the review case: an unclosed<summary>followed by a valid disclosure. It stays literal instead of taking the later section's</summary>. Adds regression testUnterminatedSummary_StaysLiteralWithoutConsumingALaterDisclosureand one docs sentence.bd6a235e(docs) records that a closing-wrapper line directly after a table ends the table and closes the disclosure. This matches GitHub's renderer and the existingNestedOpenDisclosure_PreservesCodeAndMarkdownBlockstest. A local review suggested treating that line as a table row. It was checked against GitHub's Markdown API and not adopted.66a6d46bstores this PR's five new files with LF endings, the repository convention; they had been committed as CRLF. Content is unchanged:git diff --ignore-cr-at-eol bd6a235e 66a6d46bis empty. A stockgit diff --checkover the PR range now passes.Real Hub proof on
66a6d46bAppVersion ...Sha.66a6d46b890d1dc4616702f5ced37da6a654060e) and frommain4aee38a1for BEFORE.PrintWindowcapture.main4aee38a1, LightUIA log, identical for Light and Dark:
Collapsed, thenExpand, thenExpanded.Collapsed, thenExpanded.Collapsed/Collapsed.<details><summary>Firsttext is present literally, and "Second" is a separate button that goes fromCollapsedtoExpanded.On
main, the UIA tree has no disclosure buttons; both messages are plain text containing the literal tags.Real Hub proof on
032965b2(then-current head)This is the unmodified current-head app (
AppVersion ...Sha.032965b2; tree2f98f612, the same tree asd70cff00). It ran in a throwaway crabbox Hyper-V guest: leasecbx_9558fdb99e8c, Windows 11 Insider 10.0.29683 x64, 1024x768, interactive session. The app was built in-guest against WindowsAppSDK 2.6.4, and the guest had the WindowsAppRuntime 2.6.4 installer (which also registered 2.6.5).PrintWindowimages.Collapsed→Expand→Expanded.Collapsed→Expanded.Collapseon both →Collapsed/Collapsed.This exercises the rebased rendering path:
Microsoft.UI.Reactor.Advanced.Factories.Markdownon sanitized disclosure segments, with Reactor-owned list layout.Screenshots (
032965b2Light and Dark):1773-032965b2/at the pinned proof commit.The UIA reports and build receipt are on assets-only commit
280c191a, and the guest is deleted.Not exercised on this head:
Rebase on main (
d70cff00; current head032965b2adds only an emptyci: retriggercommit)Current head
d70cff00ed49051cf34f47f4097c251e44595449is5f580bb6rebased ontomainat2ff4d168(after #1791, #1797 and Reactor preview.16). Main removed the preview.12 list-item workaround and moved toMicrosoft.UI.Reactor.Advanced.Factories.Markdown;BuildInertMarkdownuses that factory on the already-sanitized disclosure segments. Main'sReactorChatMarkdownContractTestsonly matched timeline source text. This PR removes it, so a new commit replaces it with a rendered check inReactorMarkdownDisclosureProofTests: after the host narrows to 240 px, a long list item must wrap inside it. Thereactor-markdown-list-layoutandreactor-markdown-presentation-closedledger rows now cite behavioral guards.Local:
./build.ps1passed;OpenClaw.Shared.Tests4809 passed, 25 skipped, 0 failed;OpenClaw.Tray.Tests4807 passed, 0 failed;OpenClaw.Tray.UITestscompiles; CI workflow contract and docs validation pass. Throwaway crabbox Hyper-V guest (leasecbx_8a675098b37e, exact head and tree2f98f612, WindowsAppSDK 2.6.4): parser lane (ChatMarkdownDisclosureTests) passed;NativeMarkdownProofLight, Dark and HighContrast each 1/1 including the new list-wrap assertion; the inert-content case 1/1. The current-head real-Hub captures are in the section above; the older captures below are from5f580bb6.Hosted CI on
d70cff00/032965b2: "UI, functional, and accessibility tests" fails on a cross-branch testhost crash, not this change.d70cff00(run 41531252889): the testhost crashed inReactorChatLayoutProofTests.SandboxFlyout_ReflectsSettingsWithoutChangingDraftAndOpensSettings.032965b2(run 41542375819): crashed again, this time inReactorChatLayoutProofTests.ReasoningPicker_PreservesCurrentValueWithoutInventingSupportedOptions. Before the crash, 198+ UI tests passed, and the separate mock-Gateway lane passed 44/44.ReactorChatLayoutProofTeststesthost crash has also hit:8e0dc8e7), pollybot13/gateway-voice-successor-1915 (c98608cf): SandboxFlyout9521eec1), dev/larroy/wipe-openclaw-state (e84a5bb3), openclaw/gateway-unresponsive-peer-pr (29b9ea46): ReasoningPickere4affd6a): ComposerFlyoutsd70cff00with all 23 tests failing and passed on032965b2. bkudiess-remove-skills-page (b9eecbf9) had the identical all-fail on Nov 2.mainat2ff4d168(run 41499696100) failed its Network recovery and Revocation recovery WSL E2E jobs.Proof on
5f580bb6(pre-rebase)Head
5f580bb629e8b0afed2365e689e81305914eee41is this branch rebased again ontomainatef1df54d(the only conflict was indocs/TEST_COVERAGE.md; both paragraphs are kept). It carries two fixes for the P2 review findings. First, "fix(chat): avoid rescanning sibling disclosure tokens"Partsnow receives each disclosure body's token range, so sibling bodies never rescan one another.SiblingDisclosures_InspectAtMostOneTokenPerWrapper(2500/5000)counts part-building token visits. With the oldfor (var i = 0; i < tokens.Count; i++)loop restored, both cases fail; with the fix, they pass. No wrapper recognition or literal fallback changed. Second, "fix(chat): bound the summary terminator search to the summary limit": each opener now searches for</summary>only within the 4096-character summary window plus the terminator length, rather than the rest of the message.UnterminatedSummaries_SearchOnlyTheSummaryWindow(10,000 unterminated<details><summary>xlines, 200,000 characters) counts the characters searched; it fails with the old unbounded search and passes with the fix.SummaryLengthLimit_IsUnchangedByTheBoundedSearchkeeps 4096 accepted and 4097 literal.Local on this head:
./build.ps1passed;OpenClaw.Shared.Tests4807 passed, 25 skipped, 0 failed;OpenClaw.Tray.Tests4786 passed, 0 failed;OpenClaw.Tray.UITestscompiles;scripts/test-ci-workflow-contract.ps1andscripts/validate-docs.ps1pass.Real behavior on WindowsAppSDK 2.6.4, run in a throwaway crabbox Hyper-V guest (lease
cbx_76f84af0e023, Windows 11 Insider 10.0.29683 x64, 1024x768, interactive session, WindowsAppRuntime 2.6.4 installed). The exact head was cloned and pinned by commit and tree (d7c57f42), the app identity reportsSha.5f580bb6, and the app was built in-guest;deps.jsonresolves everyMicrosoft.WindowsAppSDK*package at 2.6.4.NativeMarkdownProof, one process per theme, withOPENCLAW_VISUAL_TEST=1: Light, Dark and HighContrast each 1/1 passed;AssistantMarkdown_UntrustedContentRemainsInertInsideDisclosure1/1 passed. The test asserts accessible expansion, state kept across rerender, streaming and resize, Copy on literal code, and inert content.OpenClaw.Tray.WinUI.exeagainst the loopback fixture Gateway serving the same canned transcript as before. The fixture-host seam that serves it was applied only to a separate host clone. UIA log, Light and Dark: header button "Sources and evidence"Collapsed→Expand→Expanded; "Raw command output"Collapsed→Expanded;Collapseon both →Collapsed/Collapsed. Captures are owned-HWNDPrintWindowimages.Screenshots (
5f580bb6Light and Dark):1773-5f580bb6/real-hub/at the pinned proof commit.Native proof captures (Light, Dark, HighContrast, expanded and collapsed), UIA reports, the transcript, the capture script and the host seam are on assets-only commit
5e4f981e(1773-5f580bb6/,method/). The guest has been deleted.Rebase on main (
c8b89482, superseded by the head above)Current head
c8b89482bfe2a5acbdecca5b089fb619337d2be0is a rebase of86f0c26aontomainat4cbbe51c; it adds no new behavior. Conflicts were confined to CI/docs: the Tray UI filter now excludes bothGatewayFixture(from main) andNativeMarkdownProof, the mock Gateway step and the Markdown disclosure proof step both run,docs/CHAT_VISUAL_DESIGN.mdkeeps main's question-dock/working-claw text plus the disclosure paragraphs, and theUiLane_...source-inspection test stays removed in favor ofscripts/test-ci-ui-profile.ps1. On this head:./build.ps1passed;OpenClaw.Shared.Tests4807 passed, 25 skipped, 0 failed;OpenClaw.Tray.Tests4781 passed, 0 failed (includesChatMarkdownDisclosureTests);scripts/test-ci-workflow-contract.ps1andscripts/test-ci-ui-profile.ps1passed. The windowedNativeMarkdownProofUI tests were not rerun locally (no desktop windows); CI runs them. Visual and earlier evidence below is from the pre-rebase revisions it names.CI profile-isolation replacement (then-current head)
Pre-rebase head: 86f0c26. This correction changes only CI configuration and its behavioral regression scripts. It does not change disclosure rendering or expand the supported syntax. Author scope acceptance is recorded above; the repository-maintainer decision remains the sole outstanding sign-off.
The UI workflow now exports the same four existing roots through one executable owner, scripts/Set-CiUiTestEnvironment.ps1, immediately after checkout and before any build or test. scripts/test-ci-ui-profile.ps1 runs that real exporter with scratch state, checks its GitHub environment output, preserves an unrelated binding, and verifies default checkout selection from another working directory. It never starts the app, changes process/profile environment, or inspects source markers.
Copied output from the unchanged exporter:
All eight broken-binding controls ran isolated copies of the exporter. Each failed for its intended observable contract, not a fixture failure:
These are mutation controls for the new coverage, not a claim that the pre-existing workflow actually omitted a binding. Removing or redirecting any one of the four exported roots is the realistic defect the replacement catches. The previous C# source-text assertions remain deleted.
Preserved visual evidence: the following captures retain their actual historical revision (f5ecc7b). They are not fresh screenshots from this correction.
October heads (
f5ecc7b9through86f0c26a)Real Hub (Release, unpackaged, win-x64) against the loopback fixture Gateway, BEFORE
main50d0b34a(SHA-256FC037B1A2851847656F6EC444F8338A2FCE1E2AC8225D478EB7CC2A304E742AF), AFTERf5ecc7b9(SHA-25645DB8ECE6CC35552DF7E30CAC2F6A882E6A9CF7BD03CC344B39E481344346DAD), driven through UIAExpandCollapsePattern. Assets,PROVENANCE.mdand the local fixture seam are on branchpaulcam206-disclosure-proof-assets, commite498921.opendisclosure, literal code, listNative proof captures from the synthetic WinUI test host (HighContrast is simulated resources, not the OS mode):
./build.ps1Debug and Release passed; Shared 4,427 passed, 35 skipped, 0 failed; Tray 4,257 passed, 0 failed (20 disclosure parser cases);NativeMarkdownProof2/2 in one isolated process, run 4 times. The disclosure tests were trimmed by mutation and defect replay on9cc2f8f3.86f0c26arestored behavioral UI-profile coverage:test-ci-ui-profile.ps16 checks, 8/8 broken-binding mutation controls rejected, workflow contract passed.<details>disclosures work properly" in a standalone Debug preview built fromec4089b2plus an uncommitted routed-input fix, not this branch or the Hub; the disclosure sources were byte-identical to77e2b614. Preview SHA-256:OpenClaw.Tray.WinUI.dllA2A725B918C1BFCCBE2476D523DA39DFA8F0C7F1E6AC0C50766D39615D5BC783,OpenClaw.Chat.dllC1815C3A1FE909A37CB77ADB8E35E2E8DC66D6FE4D2A871AC014F335C014E2FE,OpenClaw.Shared.dll3B6CBC0D4F99BD03AAAF77E14BD9358FE4E5C665B11A1AFD52562D8966C2883F.Change Type
Scope
winnodeRequired proof pools
windows-winui-interactive: native chat rendering changed; collapsible disclosures, their UI Automation expand and collapse, and their Light and Dark presentation need current-head visible proof in the WinUI app. Results are under Validation and Real Behavior Proof; this declaration does not by itself claim the pool ran.Validation
Current head
5a1b897510c4128765eb06cfe94da54d972ae0a1(treeb33f2873): the author's normal merge ofmain20d85144into8890e1b8.On the author's machine, on
5a1b8975(host-checks.txt):./build.ps1: passed../scripts/test-ci-workflow-contract.ps1,./scripts/test-ci-ui-profile.ps1(9 checks),./scripts/test-ci-gate-results.ps1,./scripts/test-alpha-promotion.ps1(34 cases) and./scripts/validate-docs.ps1: passed.dotnet test tests/OpenClaw.Tray.Tests --filter FullyQualifiedName~CiNugetCacheWorkflowTests: 4 passed.git -c core.whitespace= diff --check 20d85144 5a1b8975: clean.In a throwaway crabbox Hyper-V guest at
8890e1b8(git diff 8890e1b8 5a1b8975 -- srcis empty), released afterwards: leasecbx_b770281f3f03, Windows 11 Enterprise Insider Preview 10.0.29683 x64, 6 vCPU, interactive session, fresh clone with head8890e1b8and tree1d55cbaachecked before and after, isolatedOPENCLAW_TRAY_*roots, WindowsAppSDK 2.6.5 and the signed WindowsAppRuntime 2.6.5 installer. Hub...Sha.8890e1b8...,OpenClaw.Tray.WinUI.exeSHA-256D609CFE52782941F180C286FFC8F1A79862D42800DDBEE4DEC61712913C5982C. Receipts:summary.txtate617b1abon branchproof/1773-5a1b8975-20261113../build.ps1: passed.dotnet test ./tests/OpenClaw.Shared.Tests/OpenClaw.Shared.Tests.csproj --no-restore: 5,849 passed, 0 failed (29 opt-in native MXC, device-identity and CUDA integration tests not executed).dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-restore: 6,384 passed, 0 failed.dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-build --filter FullyQualifiedName~ChatMarkdownDisclosureTests: 27 passed../scripts/validate-docs.ps1,./scripts/test-ci-workflow-contract.ps1,./scripts/test-ci-ui-profile.ps1and the stock diff check: passed../scripts/run-proof-tests.ps1 -Project tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -Filter 'Category=NativeMarkdownProof' -ResultName markdown-disclosure -RuntimeIdentifier win-x64(CI's step): 2 passed (the link/content-policy proof and the expand, rerender and resize proof).main's Markdown rendering proofs,dotnet test tests/OpenClaw.Tray.UITests --no-build -r win-x64 --filter "(FullyQualifiedName~OpenClaw.Tray.UITests.ReactorMarkdown|FullyQualifiedName~ReactorChatLayoutProofTests.CodeBlock_PreservesLiteralContentAndCopiesExactText)&Category!=NativeMarkdownProof": 7 passed.422593ce(WorkspaceWindowProofTests.NativePagesAndOwnerLinks_StayInOneWorkspaceWindow,UsagePageRenderingTests.MainStates_RenderTheApprovedHierarchyInBothThemesandReactorQuestionProofTests.ProductionRoot_QuestionExpansionRetainsNativeComposerAndViewModelDraft), with fix(ci): Tray UI tests fail intermittently and the step times out on passing runs #2130's waits, three rounds: 35 of 35 passed in each.0abb30a4, where all of them passed or failed as intended (below).Hosted CI on
5a1b8975: Build and Test run 43358006514 failed in one job; CodeQL (run 43358006441) passed. Every other job passed: both ordinary Tray UI shards (ui-tests: 1,041 passed and 6 skipped of 1,047, then the steady-resource, animation and Axe steps;tray-ui-shard: 334 passed and 3 skipped of 337), Core and CLI, Tray/setup/integration, the three WSL E2E lanes, release metadata, MSIX x64 and arm64, the Store bundle and the x64 publish smoke. CI'sRun native Markdown disclosure proofsstep ran at this head and reported 2 discovered, 2 executed, 2 passed.GatewayFixtureUiTests.SystemsDaily_InsetAndExpandedNativeFramesfailed with "Systems observation 'SystemsRetry' must belong to the retained native window and process." (GatewayFixtureSystemsUiTests.cs:414, an ownership check inside a UI Automation wait on the Systems page). This PR's diff does not touch the Systems page, the ownership helper or the fixture harness. The same test failed with the same message on two unrelated pull requests the day before (job 131090299270, job 131463763249), and onmainat2a237069with aNullReferenceException(job 130846584693).main's own mock Gateway job also failed at its current tip8d5e27bd, on a different test (Automations_ScopesToAgentsAndCoversMainStates, a focus timeout; job 131663484058). The fixture tests that failed this job at0abb30a4and422593cewere not among this run's failures.Previous heads:
8890e1b8(merge ofmain6ddc13b8), leasecbx_b770281f3f03: the guest results above. Hosted CI never ran on it:mainmerged fix(ci): Tray UI tests time out when the whole suite runs serially in one job #2135 while it was being validated, and the pull request was unmergeable when8890e1b8was pushed.422593ce(merge ofmain1ebcf004), leasecbx_559a81184a85:./build.ps1passed; Shared 5,846 passed, 1 failed:InstalledFileWorkerResolverTests.TamperFailureRetainsUnprovenPreparationInsteadOfDeletingForeignObjects(obstacle: "added")is meant to observe its 64 MiB runtime copy mid-way but first saw it finished (67,108,864 bytes) after 5 min 37 s under full-suite load; this PR touches no FileTransfer code, and the failing case's 5 variants and its 94-test class passed on rerun in the same guest (receipts5b1b5f85). Tray 6,372 passed; parser 27; disclosure proofs 2/2;main's Markdown UI proofs 7/7. Hosted run 43344451081 failed two jobs.Run Tray UI Testsfinished in 14 min 15 s with 3 failures in code this PR does not touch, so CI skipped the disclosure step:WorkspaceWindowProofTests.NativePagesAndOwnerLinks_StayInOneWorkspaceWindow(theme: "Dark")timed out forwarding thechatdeep link to the test app;UsagePageRenderingTests.MainStates_RenderTheApprovedHierarchyInBothThemes(theme: Dark, scenario: "stale")timed out waiting forUsageDaily;ReactorQuestionProofTests.ProductionRoot_QuestionExpansionRetainsNativeComposerAndViewModelDraftread an empty composer right after setting a draft in an empty conversation, before any message existed to render, which is the signature fix(ci): Tray UI tests fail intermittently and the step times out on passing runs #2130 records and instruments. The mock Gateway job failedSelectedAssistantAndConversationSurviveTransientRosterLossButNotAuthoritativeRemovalwith "Timed out waiting for native Send action after reconnect", the same wait and message that failed onmainat3d5f1427(job),3f47e838(job) and3c75a324(job).main's own run at1ebcf004(43335989231) failed both jobs too: its Tray UI step hit the 15-minute limit and its mock Gateway job failed two other tests.0abb30a4(roboclaw-bot's merge ofmain3d5f1427), leasecbx_5fbc94545ce3:./build.ps1passed; Shared 5,847 passed; Tray 6,371 passed with one load timeout inOpenClawChatDataProviderTeststhat passed its focused and class reruns (2/2, 621/621); parser 27; disclosure proofs 2/2 and visual 4/4;main's Markdown UI proofs 7/7; negative control C failed exactly its High Contrast assertion in both themes; real Hub Light, Dark andmainBEFORE checks passed; local ClawSweeper patch correct, no findings. Hosted run 43298592551 failed two jobs:Run Tray UI Testshit its 15-minute limit while passing (1,194 results, 0 failures), so CI skipped the disclosure step, and the mock Gateway job failedNewAgentUsesGatewayCreationAndRefreshesWithoutReplacingConversationwith aNullReferenceExceptionatGatewayFixtureUiTests.cs:1575, the same failure the test had on four unrelated PRs that day (improve(chat): refine composer sizing and context controls #2117, feat: add an animated desktop lobster with notification bubbles #1681, fix: keep agent creation on its original Gateway connection #1854, fix(ci): Tray UI tests fail intermittently and the step times out on passing runs #2130) and the racemainfix(tests): mock Gateway fixture UI tests fail intermittently in CI #2132 fixed. The hosted ClawSweeper review of0abb30a4reported no findings (proof 5/6, patch 4/6).6efff19a(merge base65de1e35), leasecbx_88fd03b6e5de:./build.ps1passed; Shared 5,772 passed; Tray 6,323 passed; parser 27; disclosure proofs 2/2 and visual 4/4;main's Markdown UI proofs 7/7; negative controls A and B failed exactly their intended assertions; local ClawSweeper patch correct, no findings. Hosted CI never ran: its runs were created during GitHub's 2026-11-11 Actions incident and stayed queued with no jobs.fd03c448(merge basee59374c0), leasecbx_50d4db5c64c4:./build.ps1passed; Shared 5,615 passed; Tray 6,152 passed; parser 27; disclosure proofs 2/2 and visual 4/4; the inert-summary negative control failed exactly the link/content-policy proof; hosted run 42889574113 14 passed, 7 skipped, with the UI job passing and onemain-red mock Gateway reconnect test failing.ffdbc4a1(merge base045d13ac): host CI gates and local ClawSweeper clean; guest native proof 2/2 and visual 4/4 on WindowsAppSDK 2.6.5; hosted run 42682198936 17 passed, 7 skipped, UI job failed only onmain's mock-Gateway voice-reply timeout.3a4e19cd(merge basefc777f2f): hosted run 42271781790 19 passed, 7 skipped, 0 failed, disclosure proofs 2/2.66a6d46b(merge base4aee38a1), leasecbx_9a6a8b6516bb:./build.ps1passed; Shared 4,927 passed (25 configured skips); Tray 5,087 passed; parser 27 passed; disclosure proofs 2/2; CI-shaped Tray UI lane 642 passed, 7 skipped (on content-identicalbd6a235e); unclosed-summary negative control failed exactly its 2 new cases; hosted run 42158018045 19 passed, 7 skipped, 0 failed.Real Behavior Proof
cbx_b770281f3f03for the proof runs at8890e1b8,cbx_5fbc94545ce3for the real Hub screenshots at0abb30a4), WindowsAppSDK 2.6.5 (project.assets.jsonresolves 2.6.5, Reactor 0.1.0-preview.17) and the signed WindowsAppRuntime 2.6.5 installer.5a1b897510c4128765eb06cfe94da54d972ae0a1: build, the CI contract checks and hosted CI, including its native disclosure proof step, ran here; the required closeout, that proof step andmain's Markdown rendering proofs also ran in the guest at8890e1b8, whose product source is identical (Validation). The real Hub screenshots are from0abb30a457652952c73aa78ff33cee67b3329525, the maintainer's merge ofmain3d5f1427; the disclosure renderer and its proofs are byte-identical between these heads....Sha.0abb30a457652952c73aa78ff33cee67b3329525,OpenClaw.Tray.WinUI.exeSHA-2567DEED6F0C71CBD63FE182DF8B938AE9663709ADA70AB27977287A0BA1501A90C.main3d5f14270dd6bd8b260a723ff2e73a68ea858ca8, SHA-256178D99C92F37CE5F39D30ED3CD4C9D15ADB68B0EA26711EDF285D7FFC63E2085.dotnet <GatewayFixtureHost.dll> --app <OpenClaw.Tray.WinUI.exe> --artifacts <dir> --duration-seconds 240 --theme <Light|Dark>, with the canned transcript served through the harness seam.main's Markdown rendering proofs ran on the same build (Validation).0abb30a4(latest real Hub screenshots)", with BEFORE captures frommain3d5f1427.main: the messages show<details>,<summary>and</details>as plain text, inmain's current styling.main's current presentation: the 14-pixel block gap, list markers, the primary prose tone from improve(chat): refine composer sizing and context controls #2117, the code card with syntax colors and underline-free accent links.<details><summary>Firststays literal, and the following "Second" disclosure renders and expands.Yes.proof/1773-0abb30a4-20261112in the author's fork, pinned to commit16e785dd, fetched (HTTP 200) after upload. This body was read back and compared after the update.main'scompactSecondaryReadingpath) use the same renderer and gap rule but were not exercised.Security Impact
NoNoNoNoNoYes, explain the risk and mitigation: N/A. No raw HTML is rendered. Disclosure bodies use the same sanitized Markdown path and link policy as the rest of the assistant message (live http/https links since improve(chat): align native conversation and tool activity with web #2093, limited by Reactor to http/https/mailto; other schemes, images and raw HTML inert), so a disclosure adds no new link surface. Summaries are plain text. The link/content-policy proof checks both.Compatibility and Migration
YesYes, CI-only: unchanged UI profile/root values are exported by a pipeline-owned setup step instead of inline workflow bindings, so release promotions of older alphas keep working. No user configuration changes.NoReview Conversations
The unclosed-summary thread is fixed in
abf9ccef(originally7c906f93) with its regression test, and it is resolved. No review threads remain open. The proof-pool declaration roboclaw-bot asked to correct now nameswindows-winui-interactive. ClawSweeper's review of0abb30a4reported no findings; its open items were the adoption decision below and the required CI Gate. It asked for the cause of the mock Gateway failure: that was the selector racemainfixed in #2132, and it did not recur at5a1b8975. The CI Gate's remaining failure at this head is attributed under Validation. The remaining decision is the repository-level one under "Why This Change Was Made": whether to adopt this restricted rendering capability.