feat: sketch pad — draw a wireframe in the composer and send it to your crew - #8041
Conversation
Design Review (Fable 5) — 🟡 CONCERNSDesign-level review of Design-Verdict: CONCERNS Sound feature riding the existing attachment pipeline; the one design cost is ~18MB shipped to every install for a lazy modal, 13MB of it one CJK font. Watch
Suggestions
[DESIGN-REVIEWED] d004ff4 |
UX Review (Fable 5) — 🟡 CONCERNSUX-level review of UX-Verdict: CONCERNS Solid, reversibility-first sketch flow; two edges remain — silent loss of oversized sketches on reload, and an unlabeled pencil as the sole touch entry point. Watch
Suggestions
[UX-REVIEWED] d004ff4 |
First Principles Review (Fable 5) — ✅ PASSPremise-level review of All lens work is complete: every mechanism the change claims to reuse exists at base ( First-Principles-Verdict: PASS A drawing input the composer lacked, wired entirely through existing pipelines — every riding surface is declared, measured, and derived from a nameable constraint. What this change shipsIntent: let a user draw a wireframe in the composer and send it to the agent as an attachment — an ADDITION.
The demo GIF follows the repo's checked-in Watch"Built-package size cost, on the record: ~18MB" — 13MB of that is one CJK font family shipped to every install regardless of use. The subtraction is real and already named (#8091); it should land before a second vendored-asset PR normalizes this size class. [FIRST-PRINCIPLES-REVIEWED] d004ff4 |
Opus 4.8 Review — ✅ no blocking findingsReviewed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsFINDING -- website/src/components/SketchDialog.tsx:193 -- ignoring False positive or not applicable? A repository writer can comment: |
9bff5a1 to
91b6bcb
Compare
Interaction demoFlow shown: composer pencil button → sketch dialog (Excalidraw lazy-loads) → draw two boxes + arrow → Insert into message → dialog closes, PNG thumbnail + recorded from 91b6bcb · feat/sketch-pad worktree pod (isolated KIROCREW_HOME, fresh browser context) · mode: default flags · real server + model flow, no fixtures |
91b6bcb to
073428d
Compare
073428d to
9221aaf
Compare
9221aaf to
54cce95
Compare
54cce95 to
cb0c30f
Compare
Design review disposition (head
|
f0ed848 to
13383e7
Compare
A pencil button in the composer opens an Excalidraw whiteboard in a modal. Insert exports the scene as a PNG plus a re-editable .excalidraw.json sidecar and hands both to the existing attachment pipeline (onUploadFiles), so server validation, resizing, and attachment chips are reused unchanged. Excalidraw (0.18.1, exact) and its stylesheet load lazily on first open; the main bundle carries only the wrapper. Scoped npm overrides dedupe Excalidraw's nested Radix layer-state internals onto the app's copies without touching react-menu's intentional nested copies.
13383e7 to
d004ff4
Compare
|
Disposition for span=4109fe9729d2:
|
|
|
|
|
|
|
Open PR relationship auditThis is a consolidated, point-in-time code-level audit note. It compares complete merge-base diffs and current/merged code; it does not treat a shared topic as duplication or partial coverage as completion. Relationship findings
No PR, Issue, label, branch, or review state was changed by the relationship-note portion of this audit. |

Summary
Adds a sketch pad to the composer: a Sketch row in the composer’s "+" attach menu opens an Excalidraw whiteboard in a modal (on touch devices, where that menu is replaced by a direct file picker, a pencil button beside it is the entry instead), so a user can quickly draw a wireframe or annotate an idea and send it to their crew.
.excalidrawsidecar and hands both to the existingonUploadFilesattachment pipeline — server validation, image resizing, and attachment chips are reused unchanged. The sidecar gives the agent structured scene data (element geometry, labels) instead of pixels, and the dashboard's existing read-only scene renderer displays it as a drawing (one new.excalidrawentry in the server's text-extension allowlist — the PR's only backend line).0.18.1(pinned exact) and its stylesheet are lazy-loaded on first open (React.lazy); the main bundle carries only the wrapper. Verified in the built dist: Excalidraw lands in its own async chunk, App/main chunk sizes unchanged vs base.react-dismissable-layer/react-focus-guards/react-focus-scope) deduped onto the app's copies, scoped to the@excalidraw/excalidrawsubtree only soreact-menu's intentional nested copies stay untouched (the Cannot select a non-default agent in Schedule → Create job (dropdown clicks fall through) #6358 guard test andChatSidebar.recencyUnitboth stay green); (b) nanoid pins inside the same scoped block (3.3.18, plus5.1.16formermaid-to-excalidraw) — the GHSA advisories against nanoid<=3.3.17enter the production graph through Excalidraw's subtree, and the scoped pins alone satisfy the Dependency Audit gate (npm audit --omit dev: 0 vulnerabilities).^[a-z]{2}-[A-Z]{2}$, full-match) — locale codes are protocol identifiers, not copy; declared here because the shape applies beyondEXCALIDRAW_LANG.dist/vendor/excalidraw/fonts/, plusEXCALIDRAW_ASSET_PATHset before the module loads): without this, Excalidraw fetches its text-tool fonts from a third-party CDN (esm.sh) — verified by a network probe against a live pod, before (5 CDN font requests) and after (0; all fonts served from/vendor/excalidraw/fonts/). Built-package size cost, on the record: fonts ~14MB (woff2, already compressed — ships near 1:1 in the wheel) + lazy JS chunks ~3.0MB + Excalidraw locale chunks ~1.2MB (161 files, loaded on demand) ≈ ~18MB of dist delta, staged into the PyPI wheel and npm package whether or not the pad is opened. Accepted deliberately: the alternative is a third-party CDN dependency the repo's own no-network rule forbids. Measured composition: Xiaolai (CJK handwriting) is 13MB of the 14MB; all other families total ~530KB — so a reachable-families trim saves ~0.5MB while dropping CJK sketching quality for zh/ja/ko locales. The real decision (deployment-time CJK pruning or glyph subsetting) is tracked in sketch pad: make the 13MB CJK canvas font a deployment-time choice #8091.en-XAregenerated withscripts/gen-pseudolocale.mjs.Testing
SketchDialog.test.tsx: insert disabled on empty canvas; export produces pairedsketch-<ts>.png+sketch-<ts>.excalidrawwithexportBackground: true; dialog closes on insert; Excalidraw stays unmounted (lazy chunk unloaded) while closed.tsc -bclean, production build verified.Evidence
recorded from d004ff4 · feat/sketch-pad worktree pod (isolated KIROCREW_HOME, fresh browser context) · mode: default flags · real server + model flow, no fixtures · re-recorded from this head (the GIF file and the code differ from it only by this amend’s own GIF bytes)