Skip to content

feat: preview spreadsheets and slide decks#55

Merged
shakkernerd merged 19 commits into
openclaw:mainfrom
jjjhenriksen:codex/spreadsheet-slide-viewer
Jul 13, 2026
Merged

feat: preview spreadsheets and slide decks#55
shakkernerd merged 19 commits into
openclaw:mainfrom
jjjhenriksen:codex/spreadsheet-slide-viewer

Conversation

@jjjhenriksen

@jjjhenriksen jjjhenriksen commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add read-only previews for XLSX-family spreadsheets with bounded cell grids and worksheet tabs
  • add read-only previews for PPTX-family slide decks with bounded slide text and previous/next navigation
  • preserve authenticated downloads and explicit fallbacks for malformed, unsupported, or over-budget Office archives
  • add browser-visible proof and end-to-end coverage for both formats

This builds directly on the multi-class artifact viewer introduced in #49. The exact head is rebased on current remote main at 0090ef0791a56345496c6acf96d51e3e924bac39, including the merged work from #50 and #51.

Safety boundaries

  • 24 MiB compressed Office preview ceiling
  • 512 ZIP-entry metadata ceiling, 25,000 XML elements per parsed part before DOM construction, and 12 MiB cumulative extracted-data ceiling
  • 4 MiB per extracted entry with streamed deflate cancellation before over-budget output is buffered
  • 100 worksheets, 10,000 shared strings, 1 MiB shared text, 10,000 retained workbook cells, and at most 10,000 rendered grid cells
  • 200 slides, 2,000 paragraphs per slide, and 64 KiB of text per slide
  • macros are never executed; formulas display cached values only
  • unused media and embedded objects are not extracted by the text-only preview

End-to-end behavior proof

The proof fixture is uploaded through ClickClack's real upload and attachment APIs, opened from the rendered message card, and exercised in the running Go-backed web app.

Spreadsheet preview

The browser opened forecast.xlsx, rendered the Forecast sheet as a scrollable grid, exposed both worksheet tabs, and switched to Assumptions without leaving the conversation.

Spreadsheet preview with worksheet tabs

The same browser scenario also proves package-root relationship resolution, workbook-global cell limits, a bounded sparse 10,000-cell DOM, and successful text-only rendering when an unused slide media object exceeds the extraction limit.

Safety fallback

A crafted workbook with 101 worksheet descriptors is rejected before repeated worksheet extraction. The authenticated original remains available.

Workbook worksheet-limit fallback

Slide deck preview

The browser opened launch.pptx, rendered slide text in the artifact pane, exposed slide count and navigation, advanced to the second slide, and retained the authenticated download action.

Slide deck preview with navigation

Verification

  • pnpm check — passed: Go, FakeCo AWS, desktop, TypeScript/Svelte typechecks, lint, formatting, production builds, and embedded web assets
  • pnpm coverage — passed, 85.8% total Go coverage
  • git diff --check passed
  • CAPTURE_OFFICE_PROOF=1 CLICKCLACK_E2E_PORT=18086 node_modules/.bin/playwright test tests/e2e/artifact-viewer.spec.ts — 12 passed
  • focused Office path — stored and deflated size lies, pre-DOM 25,001-element rejection, 101-sheet rejection, shared-string and paragraph flood rejection, workbook-global cell budget, omitted cell-reference derivation, sparse-grid DOM budget, package-root relationships, unused large media, worksheet tabs, slide navigation, and download availability all passed

Review closeout

Peter's structured autoreview process was run repeatedly before commit. Eight accepted findings were fixed: streamed decompression bounding, workbook-global cell accounting, stored-entry size validation, visible grid clipping disclosure, worksheet-count bounding, extracted-only expansion accounting, rectangular DOM-grid bounding, and package-absolute relationship resolution. The final exact-source rerun is currently blocked by a local Codex CLI structured-input truncation regression; no finding was emitted by that failed rerun. ClawSweeper found no actionable issues on the prior head. Seven subsequent ChatGPT Codex findings plus ClawSweeper’s pre-DOM structural-bound finding are fixed on exact head b38580f: bounded worksheet, cell, shared-string, slide, and paragraph iteration; shared-text and paragraph limits; derived coordinates for omitted cell references; and abort-safe preview assignment.

No database, SQL, OpenAPI, SDK, upload-storage, or public transport contract changes are included.

@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

Exact-head review request for f51a204aa23574e8f0518c93218882f6d8df4cd5, based on current main at e493526788725130168e240ec0e1dd2d8e16b488.

  • Go-backed artifact-viewer E2E: 12/12 passed.
  • Spreadsheet tabs, slide navigation, authenticated downloads, and streamed decompression rejection are covered.
  • Browser proof is embedded in the PR body.
  • This builds on merged feat: add multi-class artifact viewer #49.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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.

@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

Correction: bind review to the actual exact head f51a204338494090434da31c5c3375e1ddb52ba7 (the prior comment expanded the short SHA incorrectly). Base remains current main at e493526788725130168e240ec0e1dd2d8e16b488.

@clawsweeper re-review

@jjjhenriksen
jjjhenriksen force-pushed the codex/spreadsheet-slide-viewer branch 2 times, most recently from 34039c4 to 999784f Compare July 12, 2026 18:16
@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

Exact-head review request for 999784ff166feda594a70a8dc596dc10e614e3ab, rebased on merged #51 / current main at 1021d14e6e28d6ba5c9fbd3726b35d8ba5343bfa.

Maintainer-pattern hardening added after reviewing the landing work on #49, #50, and #51:

  • pnpm check: PASS
  • pnpm coverage: PASS, 85.8%
  • Go-backed artifact-viewer Playwright: PASS, 12/12
  • focused Office proof now covers stored and deflated size lies, 101-sheet rejection, workbook-global cell and DOM budgets, package-root relationships, unused large media, normal workbook tabs, slide navigation, and authenticated fallbacks
  • exact-head screenshots include normal spreadsheet/deck behavior plus the worksheet-limit fallback
  • embedded web assets rebuilt on the feat: add draggable channel ordering #51 landing tree

The shared autoreview helper completed the earlier source-review cycles and drove eight fixes; its final branch-mode closeout now fails closed because this PR intentionally contains binary proof images.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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.

Re-review progress:

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 12, 2026, 3:41 PM ET / 19:41 UTC.

Summary
Adds read-only XLSX-family spreadsheet grids and PPTX-family slide-text previews with worksheet or slide navigation, bounded client-side parsing, authenticated fallbacks, documentation, generated web assets, and end-to-end coverage.

Reproducibility: not applicable. This PR adds a new preview capability rather than fixing a defined current-main bug, and the only exact-head CI failure is an unrelated direct-message menu timeout.

Review metrics: 3 noteworthy metrics.

  • Diff size: 22 files, +995/-99. The feature spans the parser, viewer UI, generated assets, documentation, proof media, and focused E2E coverage.
  • Parser budgets: 12 explicit limits. The patch bounds archive, XML, worksheet, cell, string, slide, paragraph, and rendered-text work before display.
  • Full browser suite: 70 passed, 1 unrelated timeout. The only exact-head failure occurred in direct-message menu handling rather than the changed Office viewer.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • none.

Risk before merge

  • [P1] Merging intentionally exposes untrusted Office ZIP/XML parsing on the browser UI thread; the hard limits substantially reduce risk but cannot prove the absence of every CPU-heavy crafted input, so maintainers must explicitly own that availability boundary.

Maintainer options:

  1. Accept the bounded parser (recommended)
    Merge after maintainer approval of the main-thread parsing boundary; handle the unrelated direct-message timeout under normal CI policy.
  2. Isolate parsing first
    Move Office parsing to a terminable worker before merge to further contain residual UI-stall risk.
  3. Pause Office previews
    Keep these formats download-only if the project does not want to own the parser surface.

Next step before merge

  • No contributor-facing defect remains; a maintainer should decide whether the project will own synchronous browser-side Office parsing and then apply normal CI policy to the unrelated timeout.

Maintainer decision needed

  • Question: Should ClickClack accept bounded synchronous browser-side parsing of Office Open XML archives as the permanent preview boundary?
  • Rationale: The patch has no concrete correctness or security defect, but it creates ongoing product and operational ownership of attacker-controlled ZIP/XML parsing on the UI thread, which automation cannot approve on maintainers' behalf.
  • Likely owner: steipete — Peter Steinberger carried final hardening and documentation work on the merged artifact-viewer foundation and is the strongest available owner for accepting its permanent parser boundary.
  • Options:
    • Accept bounded client parsing (recommended): Merge with the documented hard limits and authenticated fallback, treating the unrelated direct-message timeout through normal CI rerun policy.
    • Require worker isolation: Move archive and XML parsing into a terminable worker before merge for stronger UI-thread containment.
    • Keep downloads only: Decline Office previews and retain authenticated download behavior for spreadsheets and slide decks.

Security
Cleared: No supply-chain, dependency, secret, permission, server-execution, or persisted-data regression was found; the residual client-parser denial-of-service concern is separately surfaced as availability merge risk.

Review details

Best possible solution:

Keep the strict text-only parser, hard resource limits, and authenticated fallback, then merge if maintainers accept synchronous client parsing; otherwise move parsing into a terminable worker rather than broadening server-side conversion or full Office rendering.

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

Not applicable: this PR adds a new preview capability rather than fixing a defined current-main bug, and the only exact-head CI failure is an unrelated direct-message menu timeout.

Is this the best way to solve the issue?

Yes, if maintainers accept the parser boundary: bounded text-only extraction with authenticated fallback is narrower and more maintainable than server conversion or full Office rendering, while worker isolation is the safer alternative for stronger availability containment.

AGENTS.md: found, but no applicable review policy affected this item.

Codex review notes: model internal, reasoning high; reviewed against 0090ef0791a5.

Label changes

Label changes:

  • add feature: ✨ showcase: ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. Bounded in-conversation previews for spreadsheets and presentations unlock a common collaboration workflow without introducing server-side conversion, storage changes, or editing scope.

Label justifications:

  • P2: This is a useful, bounded user-facing feature with meaningful but non-urgent impact.
  • merge-risk: 🚨 availability: The PR intentionally parses untrusted Office ZIP/XML content synchronously in the browser, leaving residual UI-stall risk for maintainers to accept.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • feature: ✨ showcase: ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. Bounded in-conversation previews for spreadsheets and presentations unlock a common collaboration workflow without introducing server-side conversion, storage changes, or editing scope.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): Inspected after-fix screenshots from the running Go-backed app directly show worksheet switching, slide navigation, retained authenticated downloads, and an over-limit workbook fallback.
  • proof: sufficient: Contributor real behavior proof is sufficient. Inspected after-fix screenshots from the running Go-backed app directly show worksheet switching, slide navigation, retained authenticated downloads, and an over-limit workbook fallback.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. Inspected after-fix screenshots from the running Go-backed app directly show worksheet switching, slide navigation, retained authenticated downloads, and an over-limit workbook fallback.
Evidence reviewed

What I checked:

Likely related people:

  • jjjhenriksen: Authored the merged multi-class artifact viewer and its safety contract, with prior merged history on the exact viewer, classifier, tests, and docs extended here. (role: artifact viewer introducer and recent area contributor; confidence: high; commits: eb6e05d0dd73; files: apps/web/src/components/artifacts/ArtifactViewer.svelte, apps/web/src/lib/artifacts.ts, tests/e2e/artifact-viewer.spec.ts)
  • steipete: Authored the final merged artifact-viewer hardening/docs commit and is co-credited on the merged feature commit; path shortlog also shows substantial work across the central files. (role: artifact viewer hardening contributor and merger; confidence: high; commits: 77bbaa4c5024, eb6e05d0dd73; files: apps/web/src/components/artifacts/ArtifactViewer.svelte, apps/web/src/lib/artifacts.ts, tests/e2e/artifact-viewer.spec.ts)
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.
Review history (6 earlier review cycles)
  • reviewed 2026-07-12T18:20:39.898Z sha 999784f :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T18:25:41.934Z sha 999784f :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T18:30:58.128Z sha 999784f :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T18:51:52.371Z sha 371d47e :: needs changes before merge. :: [P1] Bound XML structure before building the browser DOM
  • reviewed 2026-07-12T18:58:04.546Z sha 371d47e :: needs changes before merge. :: [P1] Bound XML structure before building the browser DOM
  • reviewed 2026-07-12T19:36:11.199Z sha b38580f :: needs maintainer review before merge. :: none

@jjjhenriksen
jjjhenriksen marked this pull request as ready for review July 12, 2026 18:23
@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P2 Normal priority bug or improvement with limited blast radius. labels Jul 12, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 999784ff16

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/web/src/lib/office.ts Outdated
);
const cells: SpreadsheetCell[] = [];
let truncated = false;
for (const cell of Array.from(worksheet.getElementsByTagNameNS("*", "c"))) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Stop scanning worksheets after the cell budget

When an uploaded workbook has a worksheet with hundreds of thousands of tiny <c/> elements that still fit under the 4 MiB entry limit, this Array.from(...) materializes every cell before the remainingCells guard can break. That bypasses the intended 10,000-cell safety budget during parsing and can allocate/iterate enough nodes to hang the artifact viewer; iterate with an early break and/or reject excessive cell tags before creating an array.

Useful? React with 👍 / 👎.

Comment thread apps/web/src/lib/office.ts Outdated
characters += text.length;
if (characters > PRESENTATION_TEXT_LIMIT)
throw new Error("A slide contains too much text to preview safely.");
paragraphs.push(text);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Cap slide paragraphs before rendering them

When a PPTX slide contains many one-character paragraphs, characters stays below the 64 KiB text limit while paragraphs can grow to tens of thousands of entries, and the Svelte viewer renders one DOM node per entry. This gives crafted decks a way to freeze the preview despite the text-size cap; add a paragraph/run count limit or coalesce text before pushing.

Useful? React with 👍 / 👎.

Comment thread apps/web/src/lib/office.ts Outdated
const sharedStrings: string[] = [];
if (entries.has("xl/sharedStrings.xml")) {
const shared = xml(await entryText(bytes, entries, "xl/sharedStrings.xml", signal, budget));
for (const item of Array.from(shared.getElementsByTagNameNS("*", "si"))) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Bound shared strings before cell parsing

When an XLSX contains a large sharedStrings.xml with many tiny <si> entries, this loop materializes every shared string before the 10,000-cell cap is applied, even if only a few cells reference them. A crafted workbook can fit this under the 4 MiB entry limit while allocating hundreds of thousands of strings/nodes on the main thread; add an entry/character budget or resolve only the referenced indices.

Useful? React with 👍 / 👎.

Comment thread apps/web/src/lib/office.ts Outdated
truncated = true;
break;
}
const reference = cell.getAttribute("r") || "";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Derive cell positions when references are omitted

When an XLSX producer relies on row/cell order and omits the optional cell r attribute, every parsed value gets stored with an empty reference here, so spreadsheetGrid never maps those values to A1/B1/etc. Those valid sheets render as blank despite having cell data; derive the coordinate from the containing row and cell index when r is absent.

Useful? React with 👍 / 👎.

Comment on lines +344 to +345
if (kind === "spreadsheet") spreadsheet = await parseSpreadsheet(bytes, signal);
else presentation = await parsePresentation(bytes, signal);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Discard aborted Office parse results

When a user opens another artifact while a spreadsheet or deck is still in synchronous XML parsing, the abort signal may not be observed until after parsing returns, but these assignments still write the old preview data. If the newer artifact has already reached ready, the stale parse can overwrite it; store the parse result in a local, recheck signal.aborted/upload identity, and only then assign.

Useful? React with 👍 / 👎.

Comment thread apps/web/src/lib/office.ts Outdated
const relationships = relationshipMap(
xml(await entryText(bytes, entries, "ppt/_rels/presentation.xml.rels", signal, budget)),
);
const slideIDs = Array.from(presentation.getElementsByTagNameNS("*", "sldId"));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Enforce the slide cap before collecting all IDs

When presentation.xml contains a very large number of <sldId> elements, this Array.from(...) builds the full list before applying the 200-slide limit on the next line. A small crafted deck can therefore spend substantial time and memory enumerating slide IDs even though only 200 can be previewed; count/collect only up to the cap and mark the rest as truncated.

Useful? React with 👍 / 👎.

Comment thread apps/web/src/lib/office.ts Outdated
}
const sheets: SpreadsheetSheet[] = [];
let remainingCells = SPREADSHEET_CELL_LIMIT;
const sheetDescriptors = Array.from(workbook.getElementsByTagNameNS("*", "sheet"));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Enforce the worksheet cap before collecting all sheets

When workbook.xml contains far more than 100 <sheet> entries, this line materializes every descriptor before the sheet-count guard rejects the workbook. That means the new worksheet cap still allows a crafted workbook to allocate and iterate a huge sheet list on the main thread; collect only up to the limit plus one or pre-scan the XML before building the array.

Useful? React with 👍 / 👎.

@jjjhenriksen
jjjhenriksen force-pushed the codex/spreadsheet-slide-viewer branch 2 times, most recently from 3941862 to 371d47e Compare July 12, 2026 18:43
@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

PR 51 is merged, and this branch is now rebased onto latest main (925105f). The seven actionable ChatGPT Codex findings have been fixed on exact head 371d47e; pnpm check and the full 12-test artifact-viewer Playwright suite both pass on that rebased head.

@clawsweeper

clawsweeper Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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.

Re-review progress:

@clawsweeper clawsweeper Bot removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. labels Jul 12, 2026
@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

@clawsweeper review

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. 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. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. labels Jul 12, 2026
@jjjhenriksen
jjjhenriksen force-pushed the codex/spreadsheet-slide-viewer branch from 371d47e to b38580f Compare July 12, 2026 19:31
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. and removed 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. labels Jul 12, 2026
@shakkernerd shakkernerd self-assigned this Jul 13, 2026
@shakkernerd
shakkernerd force-pushed the codex/spreadsheet-slide-viewer branch from b38580f to e8c383f Compare July 13, 2026 04:18
@shakkernerd
shakkernerd merged commit bfeafe0 into openclaw:main Jul 13, 2026
7 checks passed
@shakkernerd

Copy link
Copy Markdown
Member

Merged using rebase.

What changed after review:

  • Reworked Office parsing into a terminable worker with bounded streaming ZIP/XML processing and explicit resource limits.
  • Preserved spreadsheet and slide semantics across strict OOXML, hidden content, formulas, phonetic annotations, mixed sheet types, and macro-enabled formats.
  • Added real archive fixtures, browser behavior coverage, compatibility documentation, and refreshed embedded assets and proof screenshots.

Verification:

  • Rebased/refreshed onto current origin/main before pushing.
  • Crabbox AWS cbx_6df364b22dc6: full pnpm check passed in run_fcb0cf27296f; the 14-case Office artifact suite passed in run_7c42f083fc7e; final browser proof passed in run_0b59af470a53.
  • Real browser proof covered spreadsheet, slide outline, strict OOXML, hidden/mixed content, MIME-only classification, and fallback behavior.
  • Auto-review: clean after all accepted findings were resolved.
  • GitHub checks: Go, TypeScript, Playwright E2E, Docker Image, and all desktop jobs green.

Landed on main:

Thanks @jjjhenriksen!

@jjjhenriksen
jjjhenriksen deleted the codex/spreadsheet-slide-viewer branch July 13, 2026 04:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants