{ "name": "download.add — add an ISO for later, into the Programs category", "description": "The ordinary add path. saveDir is canonicalized and checked against the allowed roots before anything is written. startMode is 'later' deliberately: this suite replays against a real veloxd (tests/conformance/run.sh), and a real daemon given startMode 'now' would actually start fetching url for real. No fixture may pair a real external URL with startMode 'now' -- see contracts/fixtures/README.md.", "request": { "jsonrpc": "2.0", "id": 11, "method": "download.add", "params": { "url": "https://releases.ubuntu.com/26.04/ubuntu-26.04-desktop-amd64.iso", "filename": "ubuntu-26.04-desktop-amd64.iso", "categoryId": "programs", "segments": 8, "startMode": "later" } }, "response": { "jsonrpc": "2.0", "id": 11, "result": { "taskId": "$uuid", "state": "paused", "duplicate": null } }, "assertions": [ "saveDir is omitted here on purpose: it resolves to saveTo.defaultDir, which is itself checked against saveTo.allowedRoots the same way an explicit saveDir would be -- see errors/download.add.invalid-path.json for the -32011 case", "startMode 'later' lands the task in 'paused' and never hands it to the engine, so nothing is fetched and no .veloxpart is created yet -- that only happens once the task is actually started (download.start.json, or startMode 'now'/'queue' against a source this suite controls)", "event.task.added is emitted to every subscriber before this reply is sent" ] }