Skip to content

feat: add sanitized diagnostics log bundle#562

Draft
christineyan4 wants to merge 27 commits into
openclaw:mainfrom
christineyan4:error-logs
Draft

feat: add sanitized diagnostics log bundle#562
christineyan4 wants to merge 27 commits into
openclaw:mainfrom
christineyan4:error-logs

Conversation

@christineyan4

@christineyan4 christineyan4 commented May 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add a sanitized diagnostics bundle export flow for the WinUI tray app, including generated debug summary, connection event timeline, tray log tails, structured diagnostics JSONL, crash log, and setup log tails.
  • Shift the privacy boundary toward source-side sanitization before logs/diagnostics are written or recorded, with DiagnosticsExportRedactor kept as defense-in-depth for older/raw export text.
  • Refactor export redaction away from a broad regex-only approach: parser-style handling now covers private keys, signed handshakes, DPAPI blobs, agent session keys, command-line secret options, sensitive key/value pairs, GUID-like IDs, and common URL/path/token cleanup.
  • Improve diagnostics preview/copy readability by decoding common JSON escape sequences like \u0022 and escaped CRLFs before final redaction, while keeping plain Windows paths stable and guarding control/backslash unicode escapes.
  • Add fail-closed sanitizer-timeout handling for log-tail section sanitization and final full-bundle sanitization so a timeout produces [REDACTED_SANITIZER_TIMEOUT] instead of aborting export.
  • Preserve the preview-before-copy/save full diagnostics flow and native Win32 Save dialog for the self-hosted WinUI app.
  • Add regression coverage for redaction safety, readability, timeout behavior, split-line/nested secrets, missing files, and diagnostics page copy/preview contracts.

Validation

  • dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --filter FullyQualifiedName~DiagnosticsExportRedactorTests
  • dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter "FullyQualifiedName~DiagnosticsBundleBuilderTests|FullyQualifiedName~DiagnosticsPageContractTests"
  • .\build.ps1
  • dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore
  • dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore
  • dotnet test .\tests\OpenClaw.Connection.Tests\OpenClaw.Connection.Tests.csproj --no-restore
  • git diff --check
  • Hanselman-style adversarial review completed with Opus + Codex; follow-up fixes added for nested/double-escaped JSON secrets, conservative escape decoding for Windows paths, unicode control/backslash guards, deterministic escaped-CRLF decoding, and additional timeout/readability regression tests.

- Add diagnostics export redactor for tokens, IDs, paths, cookies, webhooks, and provider secrets
- Include sanitized tray, JSONL, crash, setup, and connection event log tails in diagnostics bundles
- Replace diagnostics save with native Win32 save dialog for self-hosted WinUI
- Add regression tests for redaction and bundle safety

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown

Codex review: needs changes before merge. Reviewed June 26, 2026, 12:49 PM ET / 16:49 UTC.

Summary
The PR adds a WinUI diagnostics bundle preview/copy/save flow with bounded sanitized log tails, source-side diagnostics redaction, native save dialog support, and regression tests.

Reproducibility: yes. for the PR defects: downloaded proof artifacts show /home/openclaw paths in exported bundles, and PR-head source only redacts /Users-style Unix paths. The stale-cache issue is source-reproducible from BuildCached and CreateStateSignature using only collection counts for several diagnostic sections.

Review metrics: 2 noteworthy metrics.

  • Diff Size: 31 files, +2662/-292. The PR spans sanitizer, tray UI, logging, localization, and tests, so privacy and upgrade review is broader than a narrow UI patch.
  • New Export Services: 3 added service files. DiagnosticsBundleBuilder, DiagnosticsExportSanitizer, and DiagnosticsLogTailReader form the new diagnostics sharing boundary maintainers need to review.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Add Linux home-directory redaction and tests using gateway health/session paths.
  • [P2] Fix or remove unsafe bundle caching and add a regression where diagnostic contents change without count changes.
  • [P2] Rerun the required build, shared tests, tray tests, and focused diagnostics tests after the repairs.

Risk before merge

  • [P1] The shareable diagnostics bundle can still expose Linux gateway home-directory paths from included health/session payloads despite claiming user paths are redacted.
  • [P1] Bundle caching can return stale support/debug summaries when diagnostic state contents change without collection-count or source-file-signature changes.
  • [P1] The PR is still draft and changes privacy-sensitive diagnostics/export behavior, so maintainers need a final privacy-boundary review after the narrow repairs and validation finish.

Maintainer options:

  1. Repair Redaction And Cache Invalidation (recommended)
    Add Linux /home path redaction and make cached bundles refresh when diagnostic state contents change, then rerun focused and required validation before merge.
  2. Accept Current Privacy And Freshness Risk
    Maintainers could intentionally accept the current behavior, but that would ship a support artifact that can expose local path identity and stale diagnostic state.
  3. Pause For Privacy Contract Review
    If the support-bundle privacy contract is still unsettled, keep the draft paused until maintainers choose the exact redaction and caching policy.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Add export sanitizer coverage for Linux home-directory paths such as /home/<user>/... in tray/gateway log payloads, with regression tests using gateway health/session paths. Fix DiagnosticsBundleBuilder.BuildCached so bundle text is regenerated when diagnostic state contents change even if collection counts and source-file signatures are unchanged, or remove the unsafe cache. Keep the export side-effect-free and do not edit CHANGELOG.md.

Next step before merge

  • [P2] A narrow automated repair can address the concrete Linux home-path redaction and bundle-cache invalidation defects before maintainer privacy-boundary review resumes.

Security
Needs attention: The diff has a concrete diagnostics privacy concern: exported bundles can still include Linux gateway home-directory paths from log payloads.

Review findings

  • [P1] Redact Linux home paths before exporting bundles — src/OpenClaw.Shared/TokenSanitizer.cs:106-109
  • [P2] Invalidate cached bundles when state contents change — src/OpenClaw.Tray.WinUI/Services/DiagnosticsBundleBuilder.cs:319-324
Review details

Best possible solution:

Keep the bounded, side-effect-free export design, add Linux home-directory redaction and cache invalidation coverage, then return the repaired PR to maintainer privacy-boundary review.

Do we have a high-confidence way to reproduce the issue?

Yes for the PR defects: downloaded proof artifacts show /home/openclaw paths in exported bundles, and PR-head source only redacts /Users-style Unix paths. The stale-cache issue is source-reproducible from BuildCached and CreateStateSignature using only collection counts for several diagnostic sections.

Is this the best way to solve the issue?

No; the side-effect-free bounded export direction is the right shape, but the implementation must repair Linux home-path redaction and cache invalidation before it is the safest maintainable solution.

Full review comments:

  • [P1] Redact Linux home paths before exporting bundles — src/OpenClaw.Shared/TokenSanitizer.cs:106-109
    The bundle manifest says user paths are redacted, but the sanitizer only covers Windows, WSL-mounted Windows, and macOS /Users/... paths. The contributor's copied/saved bundle artifacts still include gateway session paths under /home/openclaw/.openclaw/..., so non-default gateway accounts can expose local user/path identity in a shareable diagnostics bundle; add /home/<user> coverage and regression tests against gateway health/session payloads.
    Confidence: 0.93
  • [P2] Invalidate cached bundles when state contents change — src/OpenClaw.Tray.WinUI/Services/DiagnosticsBundleBuilder.cs:319-324
    BuildCached can reuse the last bundle when the cache key matches, but CreateStateSignature records only counts for warnings, activity, ports, nodes, channels, and sessions. If any of those entries change with the same count and unchanged source files, the preview/copy flow can show stale diagnostics; include stable content in the signature, add a short TTL, or remove the cache with a regression test.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 1c377cb64b65.

Label changes

Label changes:

  • remove merge-risk: 🚨 availability: Current PR review merge-risk labels are merge-risk: 🚨 compatibility, merge-risk: 🚨 security-boundary.

Label justifications:

  • P2: This is a normal-priority feature PR with limited blast radius, but it still has blocking diagnostics privacy and correctness defects.
  • merge-risk: 🚨 compatibility: The PR changes existing diagnostics copy labels and routes support output through new sanitizer/export paths that can alter data users and support rely on.
  • merge-risk: 🚨 security-boundary: The PR changes how shareable diagnostics redact credentials, local identity, paths, URLs, and log payloads, and one path class still leaks.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦞 diamond lobster and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (linked_artifact): Contributor-provided media and copied/saved diagnostics artifacts show the preview/copy/save flow and real sanitized output, though the artifacts also reveal the remaining /home path redaction defect.
  • proof: sufficient: Contributor real behavior proof is sufficient. Contributor-provided media and copied/saved diagnostics artifacts show the preview/copy/save flow and real sanitized output, though the artifacts also reveal the remaining /home path redaction defect.
Evidence reviewed

Security concerns:

  • [medium] Linux home paths can leak in support bundles — src/OpenClaw.Shared/TokenSanitizer.cs:106
    The sanitizer misses /home/<user>/... while the PR includes gateway log payloads that can contain those paths, so a shareable diagnostics artifact may expose local account/path identity unless this redaction class is added and tested.
    Confidence: 0.93

Acceptance criteria:

  • [P1] dotnet test ./tests/OpenClaw.Shared.Tests/OpenClaw.Shared.Tests.csproj --no-restore --filter FullyQualifiedName~TokenSanitizerTests.
  • [P1] dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~DiagnosticsBundleBuilderTests.
  • [P1] ./build.ps1.
  • [P1] dotnet test ./tests/OpenClaw.Shared.Tests/OpenClaw.Shared.Tests.csproj --no-restore.
  • [P1] dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-restore.

What I checked:

Likely related people:

  • Ranjesh: Authored the merged tray UX stack that recently touched DebugPage and Diagnostics page behavior adjacent to this PR. (role: recent area contributor; confidence: medium; commits: 429be9ba9368; files: src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml, src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs)
  • Régis Brid: Recently changed DebugPage code while routing background issues into app notifications. (role: recent area contributor; confidence: medium; commits: 1a07759a7e6e; files: src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs)
  • anagnorisis2peripeteia: Recently changed CommandCenterTextHelper diagnostics/browser support output that this PR reuses and sanitizes. (role: recent adjacent contributor; confidence: medium; commits: a2e2773bb935; files: src/OpenClaw.Tray.WinUI/Helpers/CommandCenterTextHelper.cs)
  • shanselman: Provided the detailed privacy, performance, side-effect-free export, and test-scope review guidance shaping the current PR direction. (role: reviewer; confidence: medium; files: src/OpenClaw.Tray.WinUI/Services/DiagnosticsBundleBuilder.cs, src/OpenClaw.Shared/TokenSanitizer.cs)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown

ClawSweeper PR egg

🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress.

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.
What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

- Restore direct debug-bundle copy/deep-link path to generated summaries only
- Update Diagnostics page copy to clarify summary-only clipboard behavior
- Add contract tests preventing log-tail bundles from bypassing preview

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a sanitized “diagnostics bundle” export flow for the WinUI tray app, including robust redaction of secrets/identifiers and expanded bundle contents (log tails + structured diagnostics + crash/setup tails + connection timeline), along with new regression tests and a Win32-native “Save as” dialog for self-hosted WinUI.

Changes:

  • Introduce DiagnosticsExportRedactor and apply it to bundle generation and log tail reading (including final “whole-bundle” sanitization).
  • Add DiagnosticsBundleBuilder + DiagnosticsLogTailReader and update the debug/diagnostics UI to preview/copy/save the sanitized bundle.
  • Add new Shared/Tray tests covering redaction shapes, split-line secrets, missing files behavior, and bundle safety guarantees.
Show a summary per file
File Description
tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj Links new WinUI diagnostics services/helpers into Tray test project.
tests/OpenClaw.Tray.Tests/DiagnosticsPageContractTests.cs Adds contract tests to enforce “summary-only vs full bundle” UX boundaries.
tests/OpenClaw.Tray.Tests/DiagnosticsBundleBuilderTests.cs Adds tests for bundle contents, missing-file behavior, and split-line redaction.
tests/OpenClaw.Shared.Tests/DiagnosticsExportRedactorTests.cs Adds broad regression coverage for redaction patterns and context preservation.
src/OpenClaw.Tray.WinUI/Windows/DiagnosticsBundleDialog.xaml.cs Reworks Save flow to use Win32 picker + deferral so errors surface in UI.
src/OpenClaw.Tray.WinUI/Windows/DiagnosticsBundleDialog.xaml Replaces InfoBar with a custom “review before sharing” card-style header.
src/OpenClaw.Tray.WinUI/Strings/en-us/Resources.resw Updates strings for “summary debug bundle” and new dialog header UIDs.
src/OpenClaw.Tray.WinUI/Strings/fr-fr/Resources.resw Same localization updates as en-us.
src/OpenClaw.Tray.WinUI/Strings/nl-nl/Resources.resw Same localization updates as en-us.
src/OpenClaw.Tray.WinUI/Strings/zh-cn/Resources.resw Same localization updates as en-us.
src/OpenClaw.Tray.WinUI/Strings/zh-tw/Resources.resw Same localization updates as en-us.
src/OpenClaw.Tray.WinUI/Services/DiagnosticsLogTailReader.cs Adds sanitized + truncated log tail reader for bundle sections.
src/OpenClaw.Tray.WinUI/Services/DiagnosticsClipboardService.cs Renames “debug bundle” copy label to “summary debug bundle”.
src/OpenClaw.Tray.WinUI/Services/DiagnosticsBundleBuilder.cs Adds full bundle builder composing summaries, timeline, and sanitized tails.
src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs Wires diagnostics bundle preview flow and copy actions.
src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml Updates UX copy to “Copy summary debug bundle” with exclusions noted.
src/OpenClaw.Tray.WinUI/Helpers/Win32FilePickerHelper.cs Adds Win32 Save dialog via COM IFileSaveDialog on STA thread.
src/OpenClaw.Tray.WinUI/App.xaml.cs Exposes recent connection diagnostic events for bundling.
src/OpenClaw.Shared/DiagnosticsExportRedactor.cs Adds centralized regex-based redaction for bundles/log exports.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 19/19 changed files
  • Comments generated: 9

Comment thread src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs
Comment thread tests/OpenClaw.Tray.Tests/DiagnosticsPageContractTests.cs
Comment thread src/OpenClaw.Tray.WinUI/Helpers/Win32FilePickerHelper.cs
Comment thread src/OpenClaw.Tray.WinUI/Windows/DiagnosticsBundleDialog.xaml.cs Outdated
Comment thread src/OpenClaw.Tray.WinUI/Strings/en-us/Resources.resw Outdated
Comment thread src/OpenClaw.Tray.WinUI/Strings/fr-fr/Resources.resw
Comment thread src/OpenClaw.Tray.WinUI/Strings/nl-nl/Resources.resw Outdated
Comment thread src/OpenClaw.Tray.WinUI/Strings/zh-cn/Resources.resw Outdated
Comment thread src/OpenClaw.Tray.WinUI/Strings/zh-tw/Resources.resw Outdated
@christineyan4

Copy link
Copy Markdown
Contributor Author

Real behavior proof for diagnostics bundle privacy boundary:

  • “Create diagnostics bundle” opens a preview before log-tail diagnostics can be copied or saved.
  • Preview shows sanitized diagnostics/log content with useful context preserved.
  • “Save to file” opens the native Windows Save dialog.
  • Direct “Copy summary debug bundle” is summary-only and explicitly excludes log tails; log-tail diagnostics
    require the preview flow.
01-preview-dialog 02-native-save-dialog 03-summary-copy-card

- Keep Diagnostics page summary-copy action summary-only
- Strengthen contract tests for the preview-only log-tail boundary
- Destroy native save-dialog filter spec before freeing unmanaged memory
- Remove unused diagnostics InfoBar localization resources
- Update no-HWND save diagnostic message to match Desktop fallback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 27, 2026
@shanselman

Copy link
Copy Markdown
Contributor

This direction makes sense for a shareable diagnostics bundle, but the redactor is carrying a lot of regex responsibility in one place. I would not block solely because it uses regex — conservative over-redaction is probably right here — but I think it needs a maintainability/perf pass before merge: group the rules by threat class, consider source-generated regexes or clearly named rule objects, and add a worst-case/perf regression test so a long log line or malformed URL/token cannot cause pathological backtracking. The current test coverage for common secret shapes is good; my concern is mostly long-term maintainability and worst-case behavior.

@shanselman

Copy link
Copy Markdown
Contributor

I took a closer pass on the redaction implementation. The feature is valuable and regex is not inherently the wrong tool for free-form diagnostics, but I think this needs a small reliability/perf cleanup before merge.

Concrete concerns:

  1. RegexMatchTimeoutException can abort the whole export. DiagnosticsLogTailReader.BuildSection() calls DiagnosticsExportRedactor.Sanitize(...), but its catch filter only handles IO/unauthorized/not-supported exceptions. If a regex hits the 100ms timeout on a long/malformed log line, the timeout escapes and the diagnostics export fails. Please catch RegexMatchTimeoutException there and around the final full-bundle Sanitize(builder.ToString()) pass in DiagnosticsBundleBuilder.Build() so the bundle can include a sanitization-timeout sentinel instead of failing.

  2. SlackSigningSecretPattern looks redundant/dead. It matches exactly 32 hex chars, but HexTokenPattern runs earlier and matches 32+ hex chars, so it should already replace every value that SlackSigningSecretPattern could see. I’d remove the Slack-specific regex and document/test that HexTokenPattern covers that shape.

  3. KeyValueSecretPattern has unbounded key-prefix scans before a large alternation. With MaxLineChars = 8000, a long non-matching key can burn work until the timeout. Consider bounding the key prefix/suffix length, or using a small rule pipeline that parses the key and then checks sensitive-key words outside regex.

  4. Please add tests for the scary cases: timeout does not abort bundle export, redaction is idempotent, JSON non-string secret values are handled or explicitly documented as a known gap, version strings/IP false positives are documented, and one max-size/perf smoke proves the redactor budget stays reasonable.

Longer-term, because this is net10.0, source-generated regexes ([GeneratedRegex]) or named redaction-rule objects would make this much easier to audit than a flat list of compiled regex fields. I would not block on “regex exists”, but I would block on timeout handling and at least one worst-case/perf regression guard.

steipete and others added 2 commits June 8, 2026 21:59
Resolve the old diagnostics bundle PR against current main and refactor the privacy boundary so diagnostics are sanitized at write/record time where possible, with export redaction kept as defense-in-depth.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 11, 2026
Decode common JSON escape sequences before export redaction while keeping plain log paths stable. Add fail-closed timeout handling for bundle sanitization and regression tests for nested escapes and timeout sentinels.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@clawsweeper clawsweeper Bot added the proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. label Jun 11, 2026
Christine Yan and others added 6 commits June 22, 2026 13:52
Keep the diagnostics bundle click handler on the guarded async path while preventing duplicate preview launches. Yield before showing the ContentDialog so it starts from a clean UI dispatch turn.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show the diagnostics bundle dialog immediately with a preparing state while building the bundle off the UI thread. Disable copy/save until the bundle text is ready and avoid repeated legacy log normalization work after a file has already been migrated in the current process.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reserve the diagnostics bundle preview viewport before async bundle text arrives so the dialog does not resize from the loading state. Track persisted-log normalization by file signature so modified files are still migrated while unchanged files are not rescanned repeatedly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reuse recently generated diagnostics bundles, key longer-lived reuse by source/state signatures, and read log tails from the end of files instead of scanning full logs. Preserve the diagnostics dialog layout fix and log guarded UI exceptions with full exception details.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve diagnostics redaction and preview conflicts after upstream changes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Avoid reparenting JSON nodes while normalizing structured setup logs and preserve non-secret request IDs while keeping PII redaction intact.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@shanselman

Copy link
Copy Markdown
Contributor

Christine, I think the diagnostics bundle feature is valuable, but I do not think this PR is safe to merge in its current shape. I would recommend redesigning it around a smaller, side-effect-free export pipeline rather than continuing to patch this version.

The main concern is the privacy/performance boundary. DiagnosticsBundleBuilder.Build() currently calls NormalizePersistedDiagnosticsLogs(), which can rewrite active tray logs, diagnostics JSONL, crash logs, raw chat logs, and every setup *.jsonl file just because the user previews or exports a bundle. That makes a read/export action mutate diagnostic evidence, can race with the async log writers, and can become slow on machines with large or many logs.

I think the safer design is:

  1. Never rewrite source logs during export. Export should tail-read bounded sections and sanitize into the bundle only. Any legacy log migration should be a separate maintenance path with explicit locking and limits.
  2. Bound the bundle aggressively. Set max files, max lines, max bytes per line, max bytes per section, and max total bundle size. Tail first, then redact; do not read/sanitize entire historical logs.
  3. Use one redaction path for every copy/save surface. The existing "Summary debug bundle" path still builds Recent Tray Log from raw lines via CommandCenterTextHelper.BuildRecentTrayLogTail(), bypassing the new bundle builder. All diagnostics copy/export paths should go through the same side-effect-free sanitizer.
  4. Fail closed. If redaction times out or produces invalid JSONL, emit a safe sentinel record like {"event":"redacted_unsafe_log_line"}. Never fall back to the original line.
  5. Prove reliability and speed with tests. Add regression tests for long/adversarial log lines, sanitizer timeout, large log files, many setup logs, concurrent writer/export behavior, legacy unsanitized lines, and all UI copy/export paths.

A smaller salvageable v1 would be: remove persisted-log normalization, keep only bounded tail export, sanitize every emitted line/string at export time, route all copy/save actions through that path, and include perf/timeout tests. Once that is solid, source-side sanitization can still be improved separately, but export must remain a defense-in-depth boundary rather than assuming logs are already safe.

Christine Yan and others added 3 commits June 25, 2026 18:03
Refactor diagnostics bundle generation to tail bounded source sections, sanitize during export, and route copy/export surfaces through the same side-effect-free redaction path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Route recent-log and about-page copy paths through the export sanitizer, and retain bounded context before the visible tail so multiline secrets redact before emission.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Route the connection timeline diagnostic copy surface through the export sanitizer so all diagnostics copy paths share the same defense-in-depth redaction boundary.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@christineyan4

Copy link
Copy Markdown
Contributor Author
Screen.Recording.2026-06-26.111045.mp4
Screenshot 2026-06-26 111154

@christineyan4

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Keep summary diagnostics copy paths summary-only, handle setup log enumeration failures inside bundle generation, and avoid rewriting legacy chat metadata caches unless new tool metadata is actually persisted.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@christineyan4

Copy link
Copy Markdown
Contributor Author

diagnostics bundle preview, with PII sanitized:
https://github.com/user-attachments/assets/a9115b93-fd25-4043-8d2b-28a9a36e9ad7

full diagnostics bundle, copied and pasted:
OpenClaw Windows Tray Diagnostics copy-paste.txt

full diagnostics bundle .txt, after clicking "save to file"
openclaw-diagnostics-20260626-120629.txt

summary bundle:
https://github.com/user-attachments/assets/31cc0884-54ee-4f68-9924-fc90e3afcb48

@christineyan4

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 26, 2026
Preserve connection timeline ISO timestamps in diagnostics bundles and align the summary debug copy text with the summary-only clipboard output.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@christineyan4

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. labels Jun 26, 2026
Redact Linux home-directory paths in diagnostics output and remove unsafe diagnostics bundle reuse so state changes with unchanged collection counts regenerate current bundle text.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants