Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
1755 lines
48 KiB
JSON
1755 lines
48 KiB
JSON
[
|
|
{
|
|
"id": "F001",
|
|
"description": "[Mobile:Foundation] Create React Native app (iOS + Android) in repo with reproducible dev/build workflow",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F002",
|
|
"description": "[Mobile:Foundation] Define environment config for hosted dev/stage/prod (no self-hosted in V1)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F003",
|
|
"description": "[Mobile:Foundation] Add typed REST API client wrapper with consistent error mapping",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F004",
|
|
"description": "[Mobile:Foundation] Add request middleware for auth headers, tenant headers (if required), and user-agent tagging",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F005",
|
|
"description": "[Mobile:Foundation] Add network timeouts and retry/backoff for safe idempotent requests",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F006",
|
|
"description": "[Mobile:Foundation] Add global app state bootstrapping (auth gate) and splash/loading sequence",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F007",
|
|
"description": "[Mobile:Foundation] Add navigation skeleton (tabs + stack) and deep link routing for ticket detail",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F008",
|
|
"description": "[Mobile:Foundation] Add basic design system primitives (colors/typography/spacing) aligned with Alga web",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F009",
|
|
"description": "[Mobile:Foundation] Add skeleton/loading/empty/error states standard library",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F010",
|
|
"description": "[Mobile:Foundation] Add secure storage abstraction (Keychain/Keystore) for session secrets",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F011",
|
|
"description": "[Mobile:Foundation] Add PII-safe logging abstraction with redaction and log level controls",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F012",
|
|
"description": "[Mobile:Foundation] Add analytics scaffolding (screen views + key actions) with opt-out hook (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F013",
|
|
"description": "[Mobile:Foundation] Add crash/error reporting hook (provider TBD) with PII redaction",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F014",
|
|
"description": "[Mobile:Foundation] Add caching layer for ticket list/detail with TTL + invalidation on updates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F015",
|
|
"description": "[Mobile:Foundation] Add pull-to-refresh and background refresh on app resume",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F016",
|
|
"description": "[Mobile:Foundation] Add offline detection UX (always-connected warning + retry actions)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F017",
|
|
"description": "[Mobile:Foundation] Add accessibility baseline (labels, focus order, touch target sizes)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F018",
|
|
"description": "[Mobile:Foundation] Add localization scaffolding (en-US first)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F019",
|
|
"description": "[Mobile:Foundation] Add Settings screen shell + diagnostics (version/build/environment)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F020",
|
|
"description": "[Mobile:Foundation] Add CI job to lint/typecheck mobile app package",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F021",
|
|
"description": "[Mobile:Foundation] Add CI job to run mobile unit tests",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F022",
|
|
"description": "[Mobile:Foundation] Add documentation for mobile local dev and build/release process",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F023",
|
|
"description": "[Mobile:Auth] Implement sign-in screen that launches system browser to Alga hosted login",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F024",
|
|
"description": "[Mobile:Auth] Implement deep link callback handler with state validation and OTT capture",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F025",
|
|
"description": "[Mobile:Auth] Exchange OTT for mobile API credential via server endpoint",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F026",
|
|
"description": "[Mobile:Auth] Persist session securely and restore on cold start",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F027",
|
|
"description": "[Mobile:Auth] Implement session refresh/rotation before expiry",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F028",
|
|
"description": "[Mobile:Auth] Handle refresh failure (revoked/expired) by routing to sign-in",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F029",
|
|
"description": "[Mobile:Auth] Implement logout that revokes server-side session and clears local storage",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F030",
|
|
"description": "[Mobile:Auth] Support Microsoft SSO via web login (no provider-specific native SDK)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F031",
|
|
"description": "[Mobile:Auth] Support Google SSO via web login (no provider-specific native SDK)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F032",
|
|
"description": "[Mobile:Auth] Record device/app metadata with session issue (for audit/analytics)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F033",
|
|
"description": "[Mobile:Auth] Implement optional biometric gate to re-open app (local-only)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F034",
|
|
"description": "[Mobile:Auth] Ensure tokens are never logged or sent to crash reports",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F035",
|
|
"description": "[Mobile:Auth] Implement auth capability discovery endpoint (mobile enabled, providers available)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F036",
|
|
"description": "[Mobile:Auth] Implement resilient UX for auth outages (retry, clear messaging)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F037",
|
|
"description": "[Mobile:Auth] Support vanity/hosted domains for login handoff (configurable allowlist)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F038",
|
|
"description": "[Mobile:Tickets:List] Implement Tickets list screen with infinite scroll pagination",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F039",
|
|
"description": "[Mobile:Tickets:List] Implement pull-to-refresh to reload first page",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F040",
|
|
"description": "[Mobile:Tickets:List] Show ticket number/id, subject/title, status, priority, assignee, client/company, updated-at",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F041",
|
|
"description": "[Mobile:Tickets:List] Render status and priority badges with accessible contrast",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F042",
|
|
"description": "[Mobile:Tickets:List] Implement server-side sorting (default updated-at desc)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F043",
|
|
"description": "[Mobile:Tickets:List] Implement server-side search with debounced input",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F044",
|
|
"description": "[Mobile:Tickets:List] Implement filter UI for status, assignee, priority, updated-since",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F045",
|
|
"description": "[Mobile:Tickets:List] Add quick filters: My tickets, Unassigned, High priority, Recently updated",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F046",
|
|
"description": "[Mobile:Tickets:List] Support combining filters and show active filter summary",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F047",
|
|
"description": "[Mobile:Tickets:List] Support clear-all filters",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F048",
|
|
"description": "[Mobile:Tickets:List] Persist last-used filters per user",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F049",
|
|
"description": "[Mobile:Tickets:List] Handle empty results and error retries gracefully",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F050",
|
|
"description": "[Mobile:Tickets:List] Prefetch ticket detail for first visible rows (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F051",
|
|
"description": "[Mobile:Tickets:List] Implement ticket stats summary header using tickets stats endpoint (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F052",
|
|
"description": "[Mobile:Tickets:List] Ensure list results respect RBAC and data visibility",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F053",
|
|
"description": "[Mobile:Tickets:Detail] Implement Ticket detail screen with loading skeleton and refresh",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F054",
|
|
"description": "[Mobile:Tickets:Detail] Render ticket header (number/title/status/priority/assignee)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F055",
|
|
"description": "[Mobile:Tickets:Detail] Render requester/contact and client/company summary",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F056",
|
|
"description": "[Mobile:Tickets:Detail] Render key timestamps (created/updated/closed) with relative time",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F057",
|
|
"description": "[Mobile:Tickets:Detail] Render description with safe link handling (optional markdown)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F058",
|
|
"description": "[Mobile:Tickets:Detail] Render comments/timeline with pagination",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F059",
|
|
"description": "[Mobile:Tickets:Detail] Differentiate internal vs public comments visually",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F060",
|
|
"description": "[Mobile:Tickets:Detail] Show commenter identity and timestamp for entries",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F061",
|
|
"description": "[Mobile:Tickets:Detail] Support copy ticket id/number and \u201copen in web\u201d link-out",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F062",
|
|
"description": "[Mobile:Tickets:Detail] Handle 404/403 states with friendly UX",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F063",
|
|
"description": "[Mobile:Tickets:Detail] Cache last-viewed ticket detail (TTL)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F064",
|
|
"description": "[Mobile:Tickets:Detail] Ensure detail respects RBAC and field-level visibility",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F065",
|
|
"description": "[Mobile:Tickets:Updates] Implement add-comment composer (multiline) with send action",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F066",
|
|
"description": "[Mobile:Tickets:Updates] Support comment visibility selection (internal vs public)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F067",
|
|
"description": "[Mobile:Tickets:Updates] Validate comment length and show inline errors",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F068",
|
|
"description": "[Mobile:Tickets:Updates] Post comment and update timeline on success",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F069",
|
|
"description": "[Mobile:Tickets:Updates] Preserve draft on failure/navigation and allow retry",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F070",
|
|
"description": "[Mobile:Tickets:Updates] Prevent duplicate submissions while in-flight",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F071",
|
|
"description": "[Mobile:Tickets:Updates] Implement status picker using server-provided allowed statuses",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F072",
|
|
"description": "[Mobile:Tickets:Updates] Submit status change and update ticket header/list badges",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F073",
|
|
"description": "[Mobile:Tickets:Updates] Handle 409 conflicts (ticket changed elsewhere) with refresh + retry UX",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F074",
|
|
"description": "[Mobile:Tickets:Updates] Include mobile client metadata on update calls (audit)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F075",
|
|
"description": "[Mobile:Tickets:Updates] Ensure updates respect RBAC and server-side validation",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F076",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement assign-to-me action and reflect in UI",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F077",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement unassign action when permitted",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F078",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement priority update via picker",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F079",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement due date update (if supported by API)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F080",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement watchers/subscribers add/remove (if supported by API)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F081",
|
|
"description": "[Mobile:Tickets:Critical Updates] Implement time entry creation from ticket (if supported by API)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F082",
|
|
"description": "[Mobile:Tickets:Critical Updates] Surface validation errors clearly for partial updates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F083",
|
|
"description": "[Mobile:Tickets:Critical Updates] Support field-level loading indicators for partial updates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F084",
|
|
"description": "[Mobile:Settings] Implement Settings screen showing current user identity and tenant",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes"
|
|
]
|
|
},
|
|
{
|
|
"id": "F085",
|
|
"description": "[Mobile:Settings] Add \u201cclear cache\u201d action",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes"
|
|
]
|
|
},
|
|
{
|
|
"id": "F086",
|
|
"description": "[Mobile:Settings] Add \u201clogout\u201d action",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes"
|
|
]
|
|
},
|
|
{
|
|
"id": "F087",
|
|
"description": "[Mobile:Settings] Add \u201cabout/legal\u201d screens (privacy policy/terms)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes"
|
|
]
|
|
},
|
|
{
|
|
"id": "F088",
|
|
"description": "[Mobile:Settings] Add toggles: biometric gate, hide sensitive info in notifications (future)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes"
|
|
]
|
|
},
|
|
{
|
|
"id": "F089",
|
|
"description": "[Mobile:Quality] Optimize list rendering (virtualized list, avoid re-renders)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F090",
|
|
"description": "[Mobile:Quality] Optimize payload sizes via slim DTOs / field selection (server support)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F091",
|
|
"description": "[Mobile:Quality] Handle timezone/locale formatting consistently",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F092",
|
|
"description": "[Mobile:Quality] Add privacy review checklist and PII inventory for mobile data flows",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F093",
|
|
"description": "[Mobile:Quality] Add observability events for auth success/failure and API error rates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F094",
|
|
"description": "[Mobile:Release] Set up iOS TestFlight and Android internal testing pipelines",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F095",
|
|
"description": "[Mobile:Release] Define signing, versioning, and release notes process",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F096",
|
|
"description": "[Mobile:Release] Add app icon/splash assets",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F097",
|
|
"description": "[Mobile:Release] Add rollout checklist and rollback plan",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F098",
|
|
"description": "[Server:Mobile Auth] Add mobile handoff endpoint/page that issues a short-lived, single-use OTT for authenticated web sessions",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F099",
|
|
"description": "[Server:Mobile Auth] Add storage for mobile OTTs with expiry, single-use semantics, and tenant/user binding",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F100",
|
|
"description": "[Server:Mobile Auth] Add API endpoint to exchange OTT for mobile API credential (short-lived) and refresh token/rotation mechanism",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F101",
|
|
"description": "[Server:Mobile Auth] Integrate with existing Microsoft/Google SSO configurations used by web login",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F102",
|
|
"description": "[Server:Mobile Auth] Add API endpoint to refresh/rotate mobile credentials and invalidate old tokens",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F103",
|
|
"description": "[Server:Mobile Auth] Add API endpoint to revoke mobile sessions (logout)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F104",
|
|
"description": "[Server:Mobile Auth] Add endpoint for mobile capability discovery (mobile enabled, providers available, TTLs)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F105",
|
|
"description": "[Server:Mobile Auth] Add rate limiting for OTT issue/exchange/refresh endpoints",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F106",
|
|
"description": "[Server:Mobile Auth] Add audit logging for mobile session issue/refresh/revoke events",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F107",
|
|
"description": "[Server:Mobile Auth] Ensure ticket APIs used by mobile are available and documented (list/search/detail/comments/status/assignment/stats)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F108",
|
|
"description": "[Server:Mobile Auth] Ensure ticket comment create API supports internal/public visibility flag",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F109",
|
|
"description": "[Server:Mobile Auth] Ensure consistent error shape for validation/auth errors for mobile clients",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F110",
|
|
"description": "[Server:Mobile Auth] Add migrations for new tables/columns used by mobile auth",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F111",
|
|
"description": "[Server:Mobile Auth] Add tests for OTT single-use + expiry and credential rotation",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F112",
|
|
"description": "[Server:Mobile Auth] Add documentation for mobile auth configuration and hosted domain allowlist",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F113",
|
|
"description": "[Phase2:Notifications] Implement push notification registration (APNs/FCM) and device token management",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F114",
|
|
"description": "[Phase2:Notifications] Add server endpoints to register/unregister device tokens",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F115",
|
|
"description": "[Phase2:Notifications] Send push notifications for assignment/status/mention events",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F116",
|
|
"description": "[Phase2:Notifications] Deep link from push notification into ticket detail",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F117",
|
|
"description": "[Phase2:Notifications] Add notification preferences screen",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F118",
|
|
"description": "[Phase2:Self-hosted] Add base URL selection and self-hosted domain onboarding UX",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F119",
|
|
"description": "[Phase2:Self-hosted] Document self-hosted requirements for mobile handoff URLs and SSO callback domains",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F120",
|
|
"description": "[Phase2:Self-hosted] Add self-hosted connectivity diagnostics and TLS certificate troubleshooting UX",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
},
|
|
{
|
|
"id": "F121",
|
|
"description": "[Mobile:Foundation] Implement standardized API error mapping: network vs validation vs auth vs permission vs server error",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F122",
|
|
"description": "[Mobile:Foundation] Implement global HTTP 401 handler (attempt refresh once then force sign-in)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F123",
|
|
"description": "[Mobile:Foundation] Implement global HTTP 403 handler (show no-access UX)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F124",
|
|
"description": "[Mobile:Foundation] Implement request cancellation for superseded ticket search queries",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F125",
|
|
"description": "[Mobile:Foundation] Implement request deduplication for concurrent identical GETs",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F126",
|
|
"description": "[Mobile:Foundation] Implement app-level telemetry correlation id on every request",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F127",
|
|
"description": "[Mobile:Foundation] Implement secure handling of deep link URLs (reject unexpected hosts/paths)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F128",
|
|
"description": "[Mobile:Foundation] Implement \u201copen in web\u201d URL builder for hosted environments",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F129",
|
|
"description": "[Mobile:Foundation] Implement clipboard helper that redacts sensitive fields by default (configurable)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F130",
|
|
"description": "[Mobile:Foundation] Implement app state restoration for last-viewed tab and last-opened ticket (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F131",
|
|
"description": "[Mobile:Foundation] Implement memory leak guardrails for large lists (profiling checklist)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F132",
|
|
"description": "[Mobile:Foundation] Implement startup performance budget and measurement",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F133",
|
|
"description": "[Mobile:Auth] Implement OTT exchange retry with exponential backoff and single-flight guard",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F134",
|
|
"description": "[Mobile:Auth] Implement refresh token rotation handling with safe rollback on failures",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F135",
|
|
"description": "[Mobile:Auth] Implement session revocation check on app resume (throttled)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F136",
|
|
"description": "[Mobile:Auth] Implement sign-in error UX for invalid tenant/provider configuration",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F137",
|
|
"description": "[Mobile:Auth] Implement sign-in error UX for user without required ticket permissions",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F138",
|
|
"description": "[Mobile:Auth] Implement sign-in UX copy that clearly indicates \u201cinternal users only\u201d",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F139",
|
|
"description": "[Mobile:Tickets:List] Implement List:Filters - status multi-select",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F140",
|
|
"description": "[Mobile:Tickets:List] Implement List:Filters - assignee (me/unassigned) selector",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F141",
|
|
"description": "[Mobile:Tickets:List] Implement List:Filters - priority selector",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F142",
|
|
"description": "[Mobile:Tickets:List] Implement List:Filters - updated-since date picker",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F143",
|
|
"description": "[Mobile:Tickets:List] Implement List:Filters - sort selector",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F144",
|
|
"description": "[Mobile:Tickets:List] Implement List:UX - filter chip summary bar",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F145",
|
|
"description": "[Mobile:Tickets:List] Implement List:UX - clear-all filters CTA",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F146",
|
|
"description": "[Mobile:Tickets:List] Implement List:UX - last refreshed timestamp",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F147",
|
|
"description": "[Mobile:Tickets:List] Implement List:UX - pull-to-refresh haptics (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F148",
|
|
"description": "[Mobile:Tickets:List] Implement List:Errors - 401 handling (refresh then sign-in)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F149",
|
|
"description": "[Mobile:Tickets:List] Implement List:Errors - 403 handling (no access)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F150",
|
|
"description": "[Mobile:Tickets:List] Implement List:Errors - 5xx retry with backoff",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F151",
|
|
"description": "[Mobile:Tickets:List] Implement List:Errors - network offline retry",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F152",
|
|
"description": "[Mobile:Tickets:List] Implement List:Perf - prefetch next page threshold tuning",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F153",
|
|
"description": "[Mobile:Tickets:List] Implement List:Perf - cache invalidation on updates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F154",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - sectioned layout (header/details/comments)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F155",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - pull-to-refresh indicator states",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F156",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - open-in-web uses stable URL format",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F157",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - copy actions for id/number",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F158",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - link handling opens external browser with confirmation (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F159",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - comment pagination (load more)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F160",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - internal/public comment badges",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F161",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - render system events (status/assignee changes) distinctly (if present)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F162",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - cache invalidation after posting comment/status change",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F163",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - optimistic UI for comment post with rollback on failure",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F164",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - optimistic UI for status change with rollback on failure",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F165",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - conflict resolution prompt on 409",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F166",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - consistent date formatting per locale",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F167",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - accessibility: headings for sections",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F168",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - accessibility: timeline entries read in sensible order",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F169",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - scroll-to-latest comment quick action (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F170",
|
|
"description": "[Mobile:Tickets:Detail] Implement ticket detail - jump-to-top button on long timelines (optional)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Users and Primary Flows"
|
|
]
|
|
},
|
|
{
|
|
"id": "F171",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - draft persistence per ticket",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F172",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - draft cleared on successful send",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F173",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - comment length limit enforcement matches server",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F174",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - comment visibility default (internal) and remembered per user",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F175",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - status list fetched and cached with TTL",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F176",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - status transitions validated server-side with friendly error messages",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F177",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - disable send while offline with queued draft (no offline send)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F178",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - toast feedback for success/failure",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F179",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - field-level spinners for partial updates",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F180",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - retry mechanism for transient failures",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F181",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - prevent double-tap submits",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F182",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - include app version/device id headers on mutations",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F183",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - assign-to-me button shows disabled state when already assignee",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F184",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - priority picker disables invalid choices (if server provides)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F185",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - due date picker supports clearing due date (if allowed)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F186",
|
|
"description": "[Mobile:Tickets:Updates] Implement updates - time entry form validates required fields and rounds durations per policy",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F187",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - OTT is bound to user session id to prevent replay across sessions",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F188",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - OTT includes nonce/state and is single-use",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F189",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - OTT expiry configurable (default short, e.g., 60s)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F190",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - exchange endpoint validates OTT + state + device metadata shape",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F191",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - refresh token rotation with immediate invalidation of prior refresh token",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F192",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - capabilities endpoint returns providers enabled and mobile auth enabled flag",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F193",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - capabilities endpoint returns hosted domain allowlist",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F194",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - rate limiting per IP and per user for exchange/refresh",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F195",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - audit logs include device id, app version, user id, tenant, action",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F196",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - consistent error response schema for auth errors",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F197",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket comment visibility enforcement matches permissions (public vs internal)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F198",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket list endpoint supports updated-since filter used by mobile",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F199",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket list endpoint supports assignee=me and assignee=unassigned filters",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F200",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket detail endpoint returns enough fields for header + detail sections",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F201",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket comments endpoint supports pagination and ordering",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F202",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket status update endpoint validates transitions and returns updated summary",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F203",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - ticket assignment update endpoint supports assign-to-self without separate user lookup",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F204",
|
|
"description": "[Server:Mobile Auth] Implement server mobile auth - time entry create endpoint validates ticket association and permissions",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F205",
|
|
"description": "[Mobile:Quality] Quality/Ops - end-to-end analytics event names cataloged and versioned",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F206",
|
|
"description": "[Mobile:Quality] Quality/Ops - crash reporting excludes request/response bodies by default",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F207",
|
|
"description": "[Mobile:Quality] Quality/Ops - redaction rules cover ticket subjects and comment bodies",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Requirements:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F208",
|
|
"description": "[Mobile:Quality] Quality/Ops - API latency measurement per route",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Observability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F209",
|
|
"description": "[Mobile:Quality] Quality/Ops - SLOs defined for key endpoints (list/detail/mutate)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Observability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F210",
|
|
"description": "[Mobile:Quality] Quality/Ops - accessibility audit checklist executed pre-release",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-functional Requirements:Accessibility"
|
|
]
|
|
},
|
|
{
|
|
"id": "F211",
|
|
"description": "[Mobile:Quality] Quality/Ops - security review checklist executed pre-release",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F212",
|
|
"description": "[Mobile:Quality] Quality/Ops - dependency vulnerability scanning enabled for mobile package",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F213",
|
|
"description": "[Mobile:Quality] Quality/Ops - mobile build reproducibility checks in CI",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-functional Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F214",
|
|
"description": "[Mobile:Release] Release - store listing draft (Phase 1)",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F215",
|
|
"description": "[Mobile:Release] Release - screenshot capture plan for App Store / Play Store",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F216",
|
|
"description": "[Mobile:Release] Release - internal beta distribution runbook",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Rollout / Migration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F217",
|
|
"description": "[Mobile:Release] Release - support escalation runbook for auth issues",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Observability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F218",
|
|
"description": "[Mobile:Release] Release - minimum OS support policy documented",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:UX / UI Notes:Platform"
|
|
]
|
|
},
|
|
{
|
|
"id": "F219",
|
|
"description": "[Mobile:Release] Release - feature gating to disable Phase 2 modules in production builds",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"PRD:Non-goals"
|
|
]
|
|
}
|
|
]
|