This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Task submission and status via the SDK
|
||||
The system SHALL allow an external integrator to submit a task (goal or
|
||||
workflow reference plus constraints and an optional explicit Host/Device
|
||||
target) through the platform SDK's API, and to query that task's current
|
||||
status by id, backed by the `task-scheduler` capability. A Device target MUST
|
||||
include its owning Host, and the status representation SHALL expose any
|
||||
explicit target separately from the eventual assignment.
|
||||
|
||||
#### Scenario: Submit a task via the API
|
||||
- **WHEN** an integrator calls the task-submission endpoint with a valid goal
|
||||
and optional constraints
|
||||
- **THEN** the API returns a task id that can be used to poll status, and the
|
||||
underlying `task-scheduler` records a new `queued` `ScheduledTask`
|
||||
|
||||
#### Scenario: Submit a task for one Host and Device
|
||||
- **WHEN** a `tasks:submit` principal submits a valid target containing an
|
||||
eligible Host and Device it is permitted to use
|
||||
- **THEN** the API records that exact target and the scheduler cannot assign
|
||||
the task outside it
|
||||
|
||||
#### Scenario: Device target lacks its Host
|
||||
- **WHEN** an integrator submits a Device target without an owning Host
|
||||
- **THEN** the API rejects the request before creating a task
|
||||
|
||||
#### Scenario: Query status of a known task
|
||||
- **WHEN** an integrator requests status for a task id that exists
|
||||
- **THEN** the API returns that task's current status (`queued`, `assigned`,
|
||||
`dispatched`, `done`, or `failed`) and its explicit target when present
|
||||
|
||||
#### Scenario: Query status of an unknown task
|
||||
- **WHEN** an integrator requests status for a task id that does not exist
|
||||
- **THEN** the API returns a not-found response rather than an unhandled server
|
||||
error
|
||||
|
||||
### Requirement: Python SDK client mirrors the REST API
|
||||
The system SHALL provide a Python client (`CloudClient`) exposing methods
|
||||
corresponding to every `/v1/...` resource, user-authentication,
|
||||
user-administration, and governance route, including targeted task submission
|
||||
and read-only Host AI-usage access, so integrators do not need to
|
||||
hand-construct HTTP requests.
|
||||
|
||||
#### Scenario: Client submits a targeted task and retrieves status
|
||||
- **WHEN** a caller uses `CloudClient` to submit a task with an explicit target
|
||||
and then fetches status by the returned id
|
||||
- **THEN** the client produces the same target and lifecycle result as direct
|
||||
REST calls
|
||||
|
||||
#### Scenario: Client administers governance with a scoped bearer
|
||||
- **WHEN** a caller configures `CloudClient` with `governance:admin` and
|
||||
invokes a policy operation
|
||||
- **THEN** the client sends that authentication and returns the corresponding
|
||||
non-secret policy representation
|
||||
|
||||
### Requirement: Public API operations enforce scopes
|
||||
The public platform API SHALL require operation-specific scopes for task
|
||||
submission, task reading, pool reading, plugin reading, plugin
|
||||
administration, user administration, governance reading, and governance
|
||||
administration, regardless of whether the principal came from a bearer
|
||||
credential or user session.
|
||||
|
||||
#### Scenario: Submit principal has task scope
|
||||
- **WHEN** a bearer or user principal with `tasks:submit` calls the
|
||||
task-submission endpoint
|
||||
- **THEN** the request is authorized subject to normal task validation and
|
||||
any effective user-submission policy
|
||||
|
||||
#### Scenario: Non-admin principal attempts plugin registration
|
||||
- **WHEN** an authenticated principal without `plugins:admin` calls plugin
|
||||
registration
|
||||
- **THEN** the API rejects the request before resolving or loading the plugin
|
||||
target
|
||||
|
||||
#### Scenario: Non-admin principal attempts user administration
|
||||
- **WHEN** an authenticated principal without `users:admin` calls a
|
||||
user-administration endpoint
|
||||
- **THEN** the API rejects the request before reading or changing protected
|
||||
user state
|
||||
|
||||
#### Scenario: Principal lacks governance administration scope
|
||||
- **WHEN** an authenticated principal without `governance:admin` changes a
|
||||
user or Host policy
|
||||
- **THEN** the API rejects the request before changing policy or usage state
|
||||
Reference in New Issue
Block a user