ACL Application Context Language

Define intent. AI builds the stack.

tasks.contract.acl

Preview for juice.tasks

:::ACL_METADATA
DOMAIN: juice.tasks
CONTEXT: Contract
VERSION: 1.0.0
REQUIRES:
  - acl.identity.UserDirectory@^1.0 AS Identity
:::

CONTRACT CreateTask {
  DESCRIPTION: "Creates a new task with default todo status."
  INPUT:
    - title
    - description
    - priority
    - assignee
    - dueDate
  AUTHZ:
    - admin:any
    - member:any
  LOGIC: |
    1. EXECUTE Flow.PrepareNewTask
    2. PERSIST Schema.Task
    3. EMIT task.created
  INTERFACE:
    - REST: POST /tasks
}

CONTRACT EditTask {
  DESCRIPTION: "Updates mutable fields on an existing task."
  INPUT:
    - title
    - description
    - priority
    - dueDate
  AUTHZ:
    - admin:any
    - member:self
  LOGIC: |
    1. UPDATE mutable Schema.Task fields only
    2. EMIT task.updated
  INTERFACE:
    - REST: PATCH /tasks/{id}
}

CONTRACT ChangeStatus {
  DESCRIPTION: "Transitions a task to a new lifecycle status."
  INPUT:
    - status
  AUTHZ:
    - admin:any
    - member:self
  LOGIC: |
    1. EXECUTE Flow.TransitionStatus
  INTERFACE:
    - REST: POST /tasks/{id}/status
}

CONTRACT AssignTask {
  DESCRIPTION: "Sets or clears the assignee on a task."
  INPUT:
    - assignee
  AUTHZ:
    - admin:any
    - member:self
  LOGIC: |
    1. CALL Identity.ResolveUser with assignee
    2. SET Schema.Task.assignee
    3. EMIT task.assigned
  INTERFACE:
    - REST: POST /tasks/{id}/assign
}

CONTRACT ArchiveTask {
  DESCRIPTION: "Archives a completed task, removing it from active lists."
  INPUT:
    - taskId
  AUTHZ: admin
  LOGIC: |
    1. REQUIRES Schema.Task.status == done
    2. EXECUTE Flow.ArchiveCompletedTask
  INTERFACE:
    - REST: POST /tasks/{id}/archive
}

CONTRACT DeleteTask {
  DESCRIPTION: "Soft-deletes a task by archiving it. Data retained for audit."
  INPUT:
    - taskId
  AUTHZ: admin
  LOGIC: |
    1. EXECUTE Flow.SoftDeleteTask
  INTERFACE:
    - REST: DELETE /tasks/{id}
}

CONTRACT TasksAPI {
  DESCRIPTION: "Read-only endpoints for listing and retrieving tasks."
  LOGIC: |
    1. GET /tasks returns list of non-archived tasks with status/priority/assignee filters.
    2. GET /tasks/{id} returns single task if requester is admin or assignee.
  INTERFACE:
    - REST: GET /tasks
    - REST: GET /tasks/{id}
}