State: shaping decision needed. Await human approval or rejection of the complete minimal v1 image-attachment contract in issue comment 5466895269. Even if approved, implementation stays unowned until #116 is dispositioned, #137 then #139 are rebuilt on the current train, and corrected-train #80 acceptance establishes the exact Messenger baseline, because the claim overlaps Messenger/Home surfaces.
Parent
[spec] Messenger UI: human chat, not a log.
Blocked by
The former several-bubbles prerequisite is delivered; it is historical, not the current blocker.
Outcome
A Card is a transcript item that is not a text bubble. v1 Card here: a screenshot in the thread (Computer frame when it helps), and an image the user attaches from the composer +. Images are first-class, not markdown image syntax. Attach Computer frames and files the Bot made when they help, not as a default dump.
Demo
- Attach an image from the composer. See it in the thread as a Card or as images on a bubble.
- When a screenshot helps, see it in the thread. Not a dump of every Computer frame.
- Refresh: the Card is still there.
Existing constraints
Talk HTTP persists Card kind. The vanishing permission panel is not this ticket. File chips (csv/pdf), mermaid, and widgets stay parked. Do not copy Grok Bot artwork. Do not publish Grok screenshots to the repo.
Acceptance criteria
These criteria apply only if the human approves the complete contract in comment 5466895269.
- One staged, removable composer image can send alone or with text and reaches only a Harness that advertises ACP image prompt capability.
- Unsupported Harnesses fail before Transcript mutation and preserve the staged image.
- A deliberate provider-neutral
openbot-transcript attach_image action can import one allowed Bot-directory/shared-drop image as a Bot-owned Transcript image Card.
- Every persisted image is decoded and normalized to metadata-free PNG, at most 8 MiB and 4096 by 4096 pixels, behind an authenticated same-origin media route.
- Attachment publication and message relation are atomic; startup reconciles temporary, orphaned, and missing files; deletion removes message-owned media.
- The thumbnail opens an accessible focus-trapped contain-scaled dialog with Close, Escape, and exact focus restoration.
- Images are first-class Transcript objects, never markdown, Workspace paths, base64 JSON, arbitrary ACP output, or automatic frame dumps.
Non-goals
- Multiple images, generic file chips, video, SVG, animation, galleries, annotation, pan, or a carousel in v1.
- Inferring attachments from arbitrary ACP/tool output or attaching every Computer frame.
- Transcript-only decoration that was not delivered to the selected Harness.
- Publishing private paths, original filenames, EXIF, raw provider payloads, or user secrets.
- Starting a worker before the human decision and corrected train order settle.
Required proof
- Public Home/API regressions for validation, normalization, atomic publication, authenticated retrieval, cleanup, and crash reconciliation.
- ACP capability and explicit MCP-action coverage with unsupported-provider failure preserving staged UI state.
- Focused rendered PWA coverage for staging, removal, send, Card rendering, full-size dialog, accessibility, and refresh persistence.
- Full deterministic suite, typechecks, production build, version gates, and exact-build real attachment/screenshot persistence acceptance.
- Separate implementation, deterministic, live, commit, push, PR, train, main merge, release, deployment, and installation states.
Human decision
Approve or reject the complete seven-part contract in #41 (comment). A change to Harness delivery, the explicit MCP event, PNG limits, or message-owned lifetime changes the implementation and proof shape. The safe default is to keep the issue unowned.
State: shaping decision needed. Await human approval or rejection of the complete minimal v1 image-attachment contract in issue comment 5466895269. Even if approved, implementation stays unowned until #116 is dispositioned, #137 then #139 are rebuilt on the current train, and corrected-train #80 acceptance establishes the exact Messenger baseline, because the claim overlaps Messenger/Home surfaces.
Parent
[spec] Messenger UI: human chat, not a log.
Blocked by
The former several-bubbles prerequisite is delivered; it is historical, not the current blocker.
Outcome
A Card is a transcript item that is not a text bubble. v1 Card here: a screenshot in the thread (Computer frame when it helps), and an image the user attaches from the composer
+. Images are first-class, not markdown image syntax. Attach Computer frames and files the Bot made when they help, not as a default dump.Demo
Existing constraints
Talk HTTP persists Card kind. The vanishing permission panel is not this ticket. File chips (csv/pdf), mermaid, and widgets stay parked. Do not copy Grok Bot artwork. Do not publish Grok screenshots to the repo.
Acceptance criteria
These criteria apply only if the human approves the complete contract in comment 5466895269.
openbot-transcript attach_imageaction can import one allowed Bot-directory/shared-drop image as a Bot-owned Transcript image Card.Non-goals
Required proof
Human decision
Approve or reject the complete seven-part contract in #41 (comment). A change to Harness delivery, the explicit MCP event, PNG limits, or message-owned lifetime changes the implementation and proof shape. The safe default is to keep the issue unowned.