{
  "schemaVersion": "1.0",
  "id": "ai-action-result",
  "title": "Kết quả từng thay đổi",
  "purpose": "Multi-action partial result distinguishes confirmed/pending/conflict/retry.",
  "roles": [
    "adult",
    "child"
  ],
  "group": "ai-assistant",
  "variantOf": null,
  "layout": {
    "canvas": {
      "width": 390,
      "height": 844
    },
    "responsive": {
      "minimumWidth": 360,
      "maximumWidth": 430,
      "scroll": "vertical",
      "safeAreaBottom": true,
      "fontScale": "native dynamic type; reflow without clipping",
      "keyboard": "composer sticky within resized viewport; dialog scrolls; no fixed keyboard overlay"
    },
    "regions": [
      {
        "id": "header",
        "order": 0,
        "type": "safe-area/header",
        "height": "intrinsic"
      },
      {
        "id": "content",
        "order": 1,
        "type": "purpose-specific proposal-result",
        "componentIds": [
          "screen-header",
          "ai-action-result-0",
          "ai-action-result-1",
          "screen-actions"
        ]
      },
      {
        "id": "actions",
        "order": 2,
        "type": "one primary + secondary controls"
      },
      {
        "id": "navigation",
        "order": 3,
        "type": "none"
      }
    ]
  },
  "components": [
    {
      "id": "screen-header",
      "type": "Header",
      "props": {
        "homeLabel": "Nhà Lá",
        "scopeGate": "A",
        "backTarget": "ai-chat",
        "settingsTarget": "settings"
      },
      "tokens": {
        "foreground": "{semantic.light.fg}",
        "darkForeground": "{semantic.dark.fg}"
      },
      "accessibility": {
        "label": "Thanh đầu màn hình",
        "readingOrder": 0,
        "focusOrder": "back then settings"
      }
    },
    {
      "id": "ai-action-result-0",
      "type": "PartialResults",
      "props": {
        "contentText": "Đã áp dụng cục bộ   Lau mặt bếp  An · mỗi 2 ngày · 15/10 · công sức 1    Chưa áp dụng · xung đột   Hoãn Rửa bát  Người phụ trách đã đổi. Cần xem lại, không gửi tự động.    Đang chờ đồng bộ   Báo đã xong việc của tôi  Chưa cộng điểm cho lệnh offline."
      },
      "tokens": {
        "background": "{semantic.light.surface}",
        "foreground": "{semantic.light.fg}",
        "darkBackground": "{semantic.dark.surface}",
        "darkForeground": "{semantic.dark.fg}",
        "bodySize": "{primitive.type.body}",
        "touchTarget": "{primitive.space.48}"
      },
      "accessibility": {
        "label": "Kết quả từng thay đổi · PartialResults",
        "readingOrder": 1,
        "colorOnly": false,
        "fontScaling": true,
        "minimumTouchTarget": 48,
        "instructions": "Đọc theo thứ tự; công bố nhãn trạng thái và lỗi, không chỉ màu."
      }
    },
    {
      "id": "ai-action-result-1",
      "type": "Notice",
      "props": {
        "text": "Minh họa kết quả nhiều lệnh. Không báo “tất cả thành công” khi chỉ một phần được nhận.",
        "tone": ""
      },
      "tokens": {
        "background": "{semantic.light.surface}",
        "foreground": "{semantic.light.fg}",
        "darkBackground": "{semantic.dark.surface}",
        "darkForeground": "{semantic.dark.fg}",
        "bodySize": "{primitive.type.body}",
        "touchTarget": "{primitive.space.48}"
      },
      "accessibility": {
        "label": "Kết quả từng thay đổi · Notice",
        "readingOrder": 2,
        "colorOnly": false,
        "fontScaling": true,
        "minimumTouchTarget": 48,
        "instructions": "Đọc theo thứ tự; công bố nhãn trạng thái và lỗi, không chỉ màu."
      }
    },
    {
      "id": "screen-actions",
      "type": "ActionGroup",
      "props": {
        "actions": [
          {
            "id": "navigate-0",
            "label": "Xem việc đã lưu",
            "kind": "navigate",
            "target": "task-detail",
            "confirmationRequired": false
          },
          {
            "id": "navigate-1",
            "label": "Xem lại lệnh xung đột",
            "kind": "navigate",
            "target": "sync-conflict",
            "confirmationRequired": false
          },
          {
            "id": "retry-proposal",
            "label": "Thử lại lệnh có thể thử",
            "kind": "mutate",
            "target": null,
            "confirmationRequired": false
          },
          {
            "id": "link-ai-chat",
            "label": "Nhờ AI",
            "kind": "navigate",
            "target": "ai-chat",
            "confirmationRequired": false
          },
          {
            "id": "link-settings",
            "label": "Cài đặt",
            "kind": "navigate",
            "target": "settings",
            "confirmationRequired": false
          }
        ],
        "primaryCount": 1
      },
      "tokens": {
        "lightBackground": "{component.light.button.background}",
        "lightForeground": "{component.light.button.foreground}",
        "darkBackground": "{component.dark.button.background}",
        "darkForeground": "{component.dark.button.foreground}",
        "height": "{primitive.space.48}"
      },
      "accessibility": {
        "label": "Hành động của màn hình",
        "keyboard": true,
        "focusVisible": true,
        "disabledOnlyLowContrast": true
      }
    }
  ],
  "fields": [],
  "states": [
    {
      "id": "partial",
      "when": "Mixed command results",
      "visibleUI": "Per-action confirmed/pending/conflict/retry",
      "availableActions": [
        "navigate-0",
        "navigate-1",
        "retry-proposal",
        "link-ai-chat",
        "link-settings"
      ],
      "mutationPolicy": "Actor, exact capability and current versions must still pass; this state never grants rights."
    },
    {
      "id": "replayed",
      "when": "Same key/body retry",
      "visibleUI": "Canonical result, no duplicate writes",
      "availableActions": [
        "navigate-0",
        "navigate-1",
        "retry-proposal",
        "link-ai-chat",
        "link-settings"
      ],
      "mutationPolicy": "Actor, exact capability and current versions must still pass; this state never grants rights."
    },
    {
      "id": "blocked",
      "when": "VERSION_CONFLICT or permissions",
      "visibleUI": "New proposal+confirmation for changed intent",
      "availableActions": [
        "navigate-0",
        "navigate-1",
        "link-ai-chat",
        "link-settings"
      ],
      "mutationPolicy": "Actor, exact capability and current versions must still pass; this state never grants rights."
    }
  ],
  "actions": [
    {
      "id": "navigate-0",
      "label": "Xem việc đã lưu",
      "kind": "navigate",
      "targetScreenId": "task-detail",
      "permission": "A",
      "confirmationRequired": false,
      "contractRef": "local navigation",
      "localBehavior": "Only validated draft/local domain where supported; remote adapters never report success.",
      "idempotency": null
    },
    {
      "id": "navigate-1",
      "label": "Xem lại lệnh xung đột",
      "kind": "navigate",
      "targetScreenId": "sync-conflict",
      "permission": "A",
      "confirmationRequired": false,
      "contractRef": "local navigation",
      "localBehavior": "Only validated draft/local domain where supported; remote adapters never report success.",
      "idempotency": null
    },
    {
      "id": "retry-proposal",
      "label": "Thử lại lệnh có thể thử",
      "kind": "mutate",
      "targetScreenId": null,
      "permission": "Original actor/key/body retained",
      "confirmationRequired": false,
      "contractRef": "Existing per-command retry receipt",
      "localBehavior": "Only validated draft/local domain where supported; remote adapters never report success.",
      "idempotency": "Stable actor/household/command key and canonical body; changed payload is a new confirmed intent."
    },
    {
      "id": "link-ai-chat",
      "label": "Nhờ AI",
      "kind": "navigate",
      "targetScreenId": "ai-chat",
      "permission": "A",
      "confirmationRequired": false,
      "contractRef": "local navigation"
    },
    {
      "id": "link-settings",
      "label": "Cài đặt",
      "kind": "navigate",
      "targetScreenId": "settings",
      "permission": "A",
      "confirmationRequired": false,
      "contractRef": "local navigation"
    }
  ],
  "dataBindings": [
    {
      "source": "POST /v1/households/{hid}/tasks",
      "shape": {
        "proposal_id": "opaque ID",
        "results": "{command_key,state,canonical?,error?}[]"
      },
      "sample": {
        "proposal_id": "proposal-example",
        "results": [
          {
            "command_key": "create-example",
            "state": "confirmed-local"
          },
          {
            "command_key": "snooze-example",
            "state": "conflict"
          },
          {
            "command_key": "complete-example",
            "state": "pending"
          }
        ]
      },
      "sampleOnly": true,
      "actorConstraint": "Adult example only; child requests MUST bind ChildTodayDto/ChildHistoryDto/ChildOccurrenceDto own scope; no adult IDs/contact/roster",
      "envelope": "API refs use CommandEnvelope; local review context is not an API property."
    }
  ],
  "copy": {
    "heading": "Kết quả từng thay đổi",
    "primary": "Xem việc đã lưu",
    "empty": null,
    "notices": [
      "Minh họa kết quả nhiều lệnh. Không báo “tất cả thành công” khi chỉ một phần được nhận."
    ],
    "locale": "vi",
    "demoLabel": "Bản thiết kế · dữ liệu mẫu · không kết nối dịch vụ"
  },
  "implementation": {
    "nativeRoute": "/design/ai-action-result",
    "nativeRouteStatus": "proposed mapping, verify against implementing native navigator",
    "apiRefs": [
      "POST /v1/households/{hid}/tasks",
      "POST /v1/households/{hid}/sync/mutations"
    ],
    "newContractRefs": [
      "ai-agent-contract.json"
    ],
    "notes": [
      "Tất cả ví dụ là dữ liệu thiết kế, không bằng chứng native/API/store đã chạy.",
      "Native route dưới đây là đề xuất mapping cho agent, không tuyên bố route source đã tồn tại.",
      "Mọi mutation dùng envelope {data,version,household_revision,replayed}, stable Idempotency-Key và expected_version khi sửa."
    ],
    "integrationStatus": "design complete; local static/draft interactions; native/API adapters pending",
    "sourceAuthority": [
      "docs/product-brief.md",
      "plans/261013-1409-sweepy-vietnam-mobile/mobile-flows.md",
      "plans/261013-1409-sweepy-vietnam-mobile/api-contracts.md",
      "packages/domain/src/contracts/phase2.ts",
      "packages/domain/src/index.ts",
      "packages/domain/src/contracts/phase3.ts",
      "packages/domain/src/contracts/billing.ts",
      "apps/mobile/src/lib/api.ts"
    ],
    "capability": "A",
    "errors": {
      "401": "Stop queue; adult login or child re-pair without parent account.",
      "403": "Do not retry lost capability. FEATURE_REQUIRED never grants Pro.",
      "409": "Fetch canonical scoped state; review/reconfirm new intent, do not rewrite old replay payload.",
      "422": "Field error with retained draft.",
      "429": "Respect Retry-After.",
      "503": "Backoff only retryable commands with original key."
    }
  }
}
