apply_journal_operations Edit a Journal: add_entry, update_entry {patch, expected}, add_files, remove_entry, add|rename|reorder|remove_report_page, update_settings, start_action, action_status. Upload files first (upload_asset/create_asset_upload). Details: /docs/mcp/apply_journal_operations. Action buttons: update_settings.actions defines label, instructions, options and default runtime/levelId. start_action creates a queued result entry; Desktop dispatches it. action_status claims queued → running as your agentId, then running → done/failed with expectedStatus. Write results to that same entry before finishing. add_entry.document or attach_document: {id, markdown?} creates an owned document; omit markdown to attach an existing hosted document. Read/edit with sheetId + documentId. set_document_attached hides/restores an entry document without deleting content; documentDetached marks a retained document. delete_document explicitly deletes it. Both require the current documentId. Removing an entry removes its document. Report pages: a report too big for one document (each page has its own size limits) splits across pages; add_report_page {entryId,page:{id,title},afterPageId?,markdown?} adds one (the entry's pages list them; the page whose id is documentId is the report's own), then edit a page with apply_document_operations documentId = its id. rename_report_page/remove_report_page need expectedTitle; reorder_report_page takes afterPageId. CLI: qraft doc add-page JOURNAL --entry E --title T --markdown @f; doc read/append/replace --entry E --page P. Read journal instructions before adding entries. Add/update entries with existing guarded operations; update_entry needs the previous value of each patched key in expected. Reuse revisions, keep writes small, and retry uncertain writes with identical requestId and payload. Charts in Journals and Documents: use a fenced qraft-chart code block containing JSON, or a Document codeBlock with attrs.language="qraft-chart" and a text child containing that JSON. Snapshot shape: {version:1,type:"bar"|"line"|"pie"|"donut",title:string,xLabel?:string,unit?:string,notes?:string,series:[{name:string}],rows:[{label:string,values:[number|null]}]}. One value per series per row; all series share unit. Blank measurements are null, not zero. Limits: 500 rows, 8 series, 64 KB, and the host content limit. Pie/donut requires exactly one series, nonnegative nonmissing values, positive finite total. No vendor options or callbacks. Example: {version:1,type:"bar",title:"p95 frame time",unit:"ms",series:[{name:"p95"}],rows:[{label:"Before",values:[97]},{label:"After",values:[16.7]}]}. Document append_blocks/replace_block accept content.markdown or content.blocks; guard replace/delete by block version. Journal add_entry/update_entry uses fenced JSON in body; update_entry needs expected.body and revision. Overview/compact reads summarize charts; read the entry whole or Document block with view=full for lossless data. CLI: qraft chart encode spec.json --format markdown|block|json; qraft chart append spec.json --sheet S [--entry-id E | --document-id PAGE]. Markdown/JSON retain source; static HTML/PDF show readable data-table fallbacks.