Ae1
High
- Category
- analysis-evasion
- Content
> `references/task-config-catalog.md` for the coverage matrix.
- Confidence
- 100% confidence
- Finding
- Referenced artifact was not completely inspected
Security audit
Security checks for vulnerabilities and agentic risk
The skill is coherent for managing Huawei Cloud CloudRobo training jobs, but it instructs agents to launch or resubmit costly long-running work without a final confirmation prompt.
Review before installing. Use this skill only with least-privilege CloudRobo credentials and an explicit workspace ID, and require a human confirmation step before create-task, restart-task, resume-task, stop-task, delete-tasks, save-draft, register-checkpoint, or any command that can spend compute resources or alter tasks. Be careful running the included test script because it can create drafts, restart them, and delete tasks after only a brief terminal warning.
> `references/task-config-catalog.md` for the coverage matrix.
> `references/task-config-catalog.md` for the coverage matrix.
| List tasks | `list-tasks [--train-mode] [--status] [--offset] [--limit]` | `list_train_tasks` / `list_sim_rl_tasks` | `GET /` |
| Show task | `show-task --task-id <id>` | `show_train_task` / `show_sim_rl_task` | `GET /{task_id}` |
| Update task | `update-task --task-id <id> --config '<json>'` | `update_train_task` / `update_sim_rl_task` | `PATCH /{task_id}` |
| Delete tasks | `delete-tasks --task-id <id> [--task-id <id>...]` | `batch_delete_train_tasks(execution_ids)` / `delete_sim_rl_task(task_id)` | `POST /batch-delete` (train) / `DELETE /{task_id}` (SimRL) |
> **delete-tasks behavior**: For regular training tasks, the CLI auto-resolves `execution_id` from
> the provided `task_id` via `show-task` before calling batch-delete. Users can pass task IDs- [API Paths](references/api-paths.md) — Full endpoint list with SDK source line references
- **Test**: `bash scripts/test-cli-commands.sh` (CLI/SDK/API); see `templates/test-vars.json` for full coverage
| Save draft (train / SimRL) | Write access to `cloudrobo-service` (`/v1/training/train-tasks/draft`, `/v1/training/rl-tasks/simulation/draft`) |
| Update task name/description | Write access to `cloudrobo-service` (`PATCH /v1/training/train-tasks/{id}`, `PATCH /v1/training/rl-tasks/simulation/{id}`) |
| Batch delete train-tasks | Delete access to `cloudrobo-service` (`POST /v1/training/train-tasks/batch-delete`) |
| Delete SimRL task | Delete access to `cloudrobo-service` (`DELETE /v1/training/rl-tasks/simulation/{id}`) |
| View stages / resource-usage / events / logs / signed-url | Read access to task sub-resources |
| Count tasks by status | Read access to `cloudrobo-service` (`/v1/training/train-tasks/stats`, `/v1/training/rl-tasks/simulation/stats`) |
| Checkpoint management (list/register) | Read/Write access to `cloudrobo-service` (`/v1/training/train-tasks/{id}/checkpoints`) || create_sim_rl_task_draft | `create_sim_rl_task_draft(req)` | `save-draft --sim-rl` | `POST /v1/training/rl-tasks/simulation/draft` |
| show_sim_rl_task | `show_sim_rl_task(task_id)` | `show-task --sim-rl` | `GET /v1/training/rl-tasks/simulation/{task_id}` |
| update_sim_rl_task | `update_sim_rl_task(task_id, req)` | `update-task --sim-rl` | `PATCH /v1/training/rl-tasks/simulation/{task_id}` |
| delete_sim_rl_task | `delete_sim_rl_task(task_id)` | `delete-tasks --sim-rl` | `DELETE /v1/training/rl-tasks/simulation/{task_id}` |
| stop_sim_rl_task | `stop_sim_rl_task(task_id)` | `stop-task --sim-rl` | `POST /v1/training/rl-tasks/simulation/{task_id}/stop` |
| copy_sim_rl_task | `copy_sim_rl_task(task_id, req=None, task_detail=None)` | `clone-task` | `POST /v1/training/rl-tasks/simulation/{task_id}/copy` |
| restart_sim_rl_task | `restart_sim_rl_task(task_id, req=None, workspace_id=None, task_detail=None)` | `restart-task --sim-rl` | `POST /v1/training/rl-tasks/simulation/{task_id}/restart` |and `algorithm_version_id` (2-field format). The backend auto-resolves engine/command from the
algorithm asset. Top-level `inputs`/`outputs` arrays are required. See [Workspace Model Sub-flow](#step-3a-ws--workspace-model-sub-flow) below.
2. **Select model** → extract `asset_id` + `latest_version_id` from the selected model's list entry.
**Do NOT ask user for version again** — auto-use `latest_version_id`. Only ask if user explicitly
wants a non-latest version.
3. **Query model version detail** `GET /v1/assets/{asset_id}/versions/{version_id}` → get `actions`
array. Each action: `{action, algorithm:{asset_id, version_id}, status}`and `algorithm_version_id` (2-field format). The backend auto-resolves engine/command from the
algorithm asset. Top-level `inputs`/`outputs` arrays are required. See [Workspace Model Sub-flow](#step-3a-ws--workspace-model-sub-flow) below.
2. **Select model** → extract `asset_id` + `latest_version_id` from the selected model's list entry.
**Do NOT ask user for version again** — auto-use `latest_version_id`. Only ask if user explicitly
wants a non-latest version.
3. **Query model version detail** `GET /v1/assets/{asset_id}/versions/{version_id}` → get `actions`
array. Each action: `{action, algorithm:{asset_id, version_id}, status}`and `algorithm_version_id` (2-field format). The backend auto-resolves engine/command from the
algorithm asset. Top-level `inputs`/`outputs` arrays are required. See [Workspace Model Sub-flow](#step-3a-ws--workspace-model-sub-flow) below.
2. **Select model** → extract `asset_id` + `latest_version_id` from the selected model's list entry.
**Do NOT ask user for version again** — auto-use `latest_version_id`. Only ask if user explicitly
wants a non-latest version.
3. **Query model version detail** `GET /v1/assets/{asset_id}/versions/{version_id}` → get `actions`
array. Each action: `{action, algorithm:{asset_id, version_id}, status}`and `algorithm_version_id` (2-field format). The backend auto-resolves engine/command from the
algorithm asset. Top-level `inputs`/`outputs` arrays are required. See [Workspace Model Sub-flow](#step-3a-ws--workspace-model-sub-flow) below.
2. **Select model** → extract `asset_id` + `latest_version_id` from the selected model's list entry.
**Do NOT ask user for version again** — auto-use `latest_version_id`. Only ask if user explicitly
wants a non-latest version.
3. **Query model version detail** `GET /v1/assets/{asset_id}/versions/{version_id}` → get `actions`
array. Each action: `{action, algorithm:{asset_id, version_id}, status}`**Algorithm config differences:** | Sub-path | Algorithm format | Discovery | |----------|------------------------------------------------------------------------------------------------------------------------------------------------|-----------| | Gallery (预制) | 2 fields: `algorithm_asset_id` + `algorithm_version_id`. Backend auto-resolves engine/image. | `list-publication-assets --type algorithm` → extract `algorithm_asset_id` + `latest_version_id`. Query `ext_metadata` for hyperparams/env/resource. | | Workspace (空间资产) | 7 fields: `engine.image_url` + `image_asset_id` + `image_version_id` + `code_dir` + `command` + `algorithm_asset_id` + `algorithm_version_id`. | `list-assets --type algorithm` → extract `algorithm_asset_id` + `latest_version_id`. Query `ext_metadata` for engine/command/code_dir + hyperparams/env/resource. |
## Edge Cases | Scenario | Handling | | ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days |
| Scenario | Handling | | ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` |
| Scenario | Handling | | ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` |
| Scenario | Handling | | ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) |
| ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) |
| Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint |
| Missing `workspace_id` | All commands auto-resolve from config or auto-query; run `cloudrobo workspace use` to set default | | Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint |
| Task in non-terminal state | Poll at 30-60s intervals; training can run for hours/days | | `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint | | Stopped task | Use `restart-task` to resubmit; `resume-task` for supported train-only cases |
| `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint | | Stopped task | Use `restart-task` to resubmit; `resume-task` for supported train-only cases | | SimRL resume | Not supported; `--sim-rl` not accepted on `resume-task` |
| `spec` format | String `Ascend: <n> * <model> \| <vCPUs> vCPUs \| <GiB> GiB`, not JSON. Filter by `ext_metadata.resource` constraints | | `train_method` / `train_mode` | Uppercase enums: `FFT`/`SFT`/`LORA`/`QLORA`/`DEEPSPEED`; `MODEL_TUNING`/`TRAIN_FROM_SCRATCH` | | CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint | | Stopped task | Use `restart-task` to resubmit; `resume-task` for supported train-only cases | | SimRL resume | Not supported; `--sim-rl` not accepted on `resume-task` |
| CREATE_FAILED | Check `spec` format, `cluster_id`, resource availability, task name uniqueness (409 Conflict), **input model status** (must be `DRAFT` for workspace models) | | RUN_FAILED | Check logs/events; common: OOM, image pull failure, dataset access denied, **dataset format incompatibility** (exitCode 1 in <2 min, no logs) | | Resource scheduling failure | Check `spec`, `worker_num`, cluster capacity, and `ext_metadata.resource` min NPU constraint | | Stopped task | Use `restart-task` to resubmit; `resume-task` for supported train-only cases | | SimRL resume | Not supported; `--sim-rl` not accepted on `resume-task` | | Draft submit via CLI | `restart-task` supports `--config`/`--config-file` to edit fields before resubmit | | Missing required fields | SDK validates before HTTP call; CLI shows `click.UsageError` with the missing field list |
No suspicious patterns detected.