Hermes 284313f908
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
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

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"
]
}
]