Project assets — files, images & screenshots as evidence¶
The biggest credibility gap is personas reasoning from prompts instead of real
material. Assets close it: any file — a screenshot of your onboarding, a pricing
page capture, an interview note, a PDF — attaches to a research project as
first-class, citable evidence with a stable id. brief_council automatically
puts every project asset in the room, so reactions are grounded in what is
actually there.
Terminology: assets are files. Council-room websites, external prototype links and
A/B variants are references (add_artifact, surfaced under /references), not
assets. Replayable uses of a flow, prototype or live URL are sessions.
Attaching¶
# MCP (the natural path — an agent attaches material while it works):
attach_asset(project_id, path="/tmp/onboarding-step2.png", title="Onboarding step 2")
attach_asset(project_id, content_base64=…, filename="interview-01.md")
attach_prototype_shot(project_id, prototype_id) # screenshot a registered prototype
# CLI parity:
sonaloop asset-attach <project_id> ./pricing.png --title "Pricing page" --notes "v2 draft"
sonaloop asset-list <project_id>
sonaloop asset-remove <project_id> <asset_id>
Binaries land in the content-addressed store (data/assets/<hash>.<ext>); the
record lands on the project. Local single-user mode serves that file at
/data/assets/…. Multi-tenant Cloud instead stores it below the bound
workspace and deliberately returns 404 for raw runtime-file routes. Browser
previews and downloads use /assets/{asset-id}/content (or /preview): the
authenticated route resolves the opaque id only inside the active workspace.
Compact Inspector cards load a bounded 640 px WebP from the fixed
/assets/{asset-id}/thumbnail route after that same workspace check; opening or
downloading the card still targets the original. Thumbnail derivatives are cached
only inside the active workspace partition and browser responses stay private, no-store.
Unsafe active formats such as SVG and HTML are download-only. Authorized agents
still receive image pixels through view_asset. Ids are content-addressed per
project, so re-attaching the same bytes is an idempotent upsert. kind (image |
screenshot | document | file) is inferred from the extension. Attaching emits
the asset.attached lifecycle event (docs/lifecycle-hooks.md).
The multimodal contract¶
Images are evidence, not just storage: view_asset(project_id, asset_id)
returns the actual image over MCP, so the host LLM looks at it with its own
eyes before authoring persona reactions — no in-process vision, no OCR. Text
documents carry an inline excerpt (quoted directly in council briefs); other
binaries are cited by id.
In a council brief, every project asset rides each participant's
agent_context as an EVIDENCE ASSETS IN THE ROOM block: image assets
instruct the host to view_asset them first; document excerpts are inline.
Sharing report deliverables¶
The report header offers Share PDF and Download PowerPoint. The PDF is a concise stakeholder edition: it keeps the conclusion and section structure, limits supporting prose and points detailed evidence back to Sonaloop. PowerPoint stays editable. Both are recorded as outgoing project assets with synthesis provenance, and a re-export supersedes the prior file.
Cloud applies the synthesis owner's published workspace branding. If the workspace has an approved 16:9 PowerPoint master, its canvas, theme, masters and layouts are used and its sample slide instances are discarded. Otherwise Sonaloop's polished default deck is used.
Downloads remain available while the underlying governed research run is active. They are delivery projections of evidence already recorded: generating one neither consumes nor completes the run's current dispatch, while incoming evidence and token-bearing run outputs keep the strict trace contract. The whole card for a generated deliverable downloads the file directly and its attachment event does not show a redundant live “open asset” alert. Incoming evidence keeps the inspector/detail flow.
Persistence¶
- Assets appear read-only in the project outline, the Library's Assets tab (
/assets) and/assets/{id}detail pages in the web inspector. Both modes use the opaque bounded thumbnail route for compact cards; tenant Cloud serves it through the authenticated, active-workspace-only boundary and does not expose the raw mount. Incoming files are grouped as Assets in the outline; generated documents appear as deliverables. - Several assets in a project or report detail render as a compact responsive gallery instead of one tall full-width column. Wide viewports place bounded previews horizontally and wrap as needed; narrow viewports collapse to one column. A thumbnail is navigation, not replacement evidence: ordering and captions remain intact, each file opens its canonical detail, and print/export restores the figure's natural height. Explicitly positioned report figures and charts keep normal reading width.
export-snapshotnow includes research projects and copies asset binaries todata/export/assets/;import-snapshotrestores both — the evidence survives the portable round-trip.