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
1834 lines
41 KiB
JSON
1834 lines
41 KiB
JSON
[
|
|
{
|
|
"id": "T001",
|
|
"description": "Unit: Create React Native app (iOS + Android) in repo with reproducible dev/build workflow",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F001"
|
|
]
|
|
},
|
|
{
|
|
"id": "T002",
|
|
"description": "Unit: Define environment config for hosted dev/stage/prod (no self-hosted in V1)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T003",
|
|
"description": "Unit: Add typed REST API client wrapper with consistent error mapping",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T004",
|
|
"description": "Unit: Add request middleware for auth headers, tenant headers (if required), and user-agent tagging",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F004"
|
|
]
|
|
},
|
|
{
|
|
"id": "T005",
|
|
"description": "Unit: Add network timeouts and retry/backoff for safe idempotent requests",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F005"
|
|
]
|
|
},
|
|
{
|
|
"id": "T006",
|
|
"description": "Unit: Add global app state bootstrapping (auth gate) and splash/loading sequence",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T007",
|
|
"description": "Unit: Add navigation skeleton (tabs + stack) and deep link routing for ticket detail",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F007"
|
|
]
|
|
},
|
|
{
|
|
"id": "T008",
|
|
"description": "Unit: Add basic design system primitives (colors/typography/spacing) aligned with Alga web",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008"
|
|
]
|
|
},
|
|
{
|
|
"id": "T009",
|
|
"description": "Unit: Add skeleton/loading/empty/error states standard library",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F009"
|
|
]
|
|
},
|
|
{
|
|
"id": "T010",
|
|
"description": "Unit: Add secure storage abstraction (Keychain/Keystore) for session secrets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F010"
|
|
]
|
|
},
|
|
{
|
|
"id": "T011",
|
|
"description": "Unit: Add PII-safe logging abstraction with redaction and log level controls",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T012",
|
|
"description": "Unit: Add analytics scaffolding (screen views + key actions) with opt-out hook (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012"
|
|
]
|
|
},
|
|
{
|
|
"id": "T013",
|
|
"description": "Unit: Add crash/error reporting hook (provider TBD) with PII redaction",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T014",
|
|
"description": "Unit: Add caching layer for ticket list/detail with TTL + invalidation on updates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T015",
|
|
"description": "Unit: Add pull-to-refresh and background refresh on app resume",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F015"
|
|
]
|
|
},
|
|
{
|
|
"id": "T016",
|
|
"description": "Unit: Add offline detection UX (always-connected warning + retry actions)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T017",
|
|
"description": "Unit: Add accessibility baseline (labels, focus order, touch target sizes)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F017"
|
|
]
|
|
},
|
|
{
|
|
"id": "T018",
|
|
"description": "Unit: Add localization scaffolding (en-US first)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F018"
|
|
]
|
|
},
|
|
{
|
|
"id": "T019",
|
|
"description": "Unit: Add Settings screen shell + diagnostics (version/build/environment)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F019"
|
|
]
|
|
},
|
|
{
|
|
"id": "T020",
|
|
"description": "Unit: Add CI job to lint/typecheck mobile app package",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F020"
|
|
]
|
|
},
|
|
{
|
|
"id": "T021",
|
|
"description": "Unit: Add CI job to run mobile unit tests",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F021"
|
|
]
|
|
},
|
|
{
|
|
"id": "T022",
|
|
"description": "Unit: Add documentation for mobile local dev and build/release process",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F022"
|
|
]
|
|
},
|
|
{
|
|
"id": "T023",
|
|
"description": "E2E: Implement sign-in screen that launches system browser to Alga hosted login",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023"
|
|
]
|
|
},
|
|
{
|
|
"id": "T024",
|
|
"description": "E2E: Implement deep link callback handler with state validation and OTT capture",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T025",
|
|
"description": "E2E: Exchange OTT for mobile API credential via server endpoint",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025"
|
|
]
|
|
},
|
|
{
|
|
"id": "T026",
|
|
"description": "E2E: Persist session securely and restore on cold start",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F026"
|
|
]
|
|
},
|
|
{
|
|
"id": "T027",
|
|
"description": "E2E: Implement session refresh/rotation before expiry",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F027"
|
|
]
|
|
},
|
|
{
|
|
"id": "T028",
|
|
"description": "E2E: Handle refresh failure (revoked/expired) by routing to sign-in",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F028"
|
|
]
|
|
},
|
|
{
|
|
"id": "T029",
|
|
"description": "E2E: Implement logout that revokes server-side session and clears local storage",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F029"
|
|
]
|
|
},
|
|
{
|
|
"id": "T030",
|
|
"description": "E2E: Support Microsoft SSO via web login (no provider-specific native SDK)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F030"
|
|
]
|
|
},
|
|
{
|
|
"id": "T031",
|
|
"description": "E2E: Support Google SSO via web login (no provider-specific native SDK)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F031"
|
|
]
|
|
},
|
|
{
|
|
"id": "T032",
|
|
"description": "E2E: Record device/app metadata with session issue (for audit/analytics)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F032"
|
|
]
|
|
},
|
|
{
|
|
"id": "T033",
|
|
"description": "E2E: Implement optional biometric gate to re-open app (local-only)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F033"
|
|
]
|
|
},
|
|
{
|
|
"id": "T034",
|
|
"description": "E2E: Ensure tokens are never logged or sent to crash reports",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F034"
|
|
]
|
|
},
|
|
{
|
|
"id": "T035",
|
|
"description": "E2E: Implement auth capability discovery endpoint (mobile enabled, providers available)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F035"
|
|
]
|
|
},
|
|
{
|
|
"id": "T036",
|
|
"description": "E2E: Implement resilient UX for auth outages (retry, clear messaging)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F036"
|
|
]
|
|
},
|
|
{
|
|
"id": "T037",
|
|
"description": "E2E: Support vanity/hosted domains for login handoff (configurable allowlist)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T038",
|
|
"description": "E2E: Implement Tickets list screen with infinite scroll pagination",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F038"
|
|
]
|
|
},
|
|
{
|
|
"id": "T039",
|
|
"description": "E2E: Implement pull-to-refresh to reload first page",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F039"
|
|
]
|
|
},
|
|
{
|
|
"id": "T040",
|
|
"description": "E2E: Show ticket number/id, subject/title, status, priority, assignee, client/company, updated-at",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T041",
|
|
"description": "E2E: Render status and priority badges with accessible contrast",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F041"
|
|
]
|
|
},
|
|
{
|
|
"id": "T042",
|
|
"description": "E2E: Implement server-side sorting (default updated-at desc)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F042"
|
|
]
|
|
},
|
|
{
|
|
"id": "T043",
|
|
"description": "E2E: Implement server-side search with debounced input",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F043"
|
|
]
|
|
},
|
|
{
|
|
"id": "T044",
|
|
"description": "E2E: Implement filter UI for status, assignee, priority, updated-since",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F044"
|
|
]
|
|
},
|
|
{
|
|
"id": "T045",
|
|
"description": "E2E: Add quick filters: My tickets, Unassigned, High priority, Recently updated",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F045"
|
|
]
|
|
},
|
|
{
|
|
"id": "T046",
|
|
"description": "E2E: Support combining filters and show active filter summary",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F046"
|
|
]
|
|
},
|
|
{
|
|
"id": "T047",
|
|
"description": "E2E: Support clear-all filters",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
},
|
|
{
|
|
"id": "T048",
|
|
"description": "E2E: Persist last-used filters per user",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F048"
|
|
]
|
|
},
|
|
{
|
|
"id": "T049",
|
|
"description": "E2E: Handle empty results and error retries gracefully",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F049"
|
|
]
|
|
},
|
|
{
|
|
"id": "T050",
|
|
"description": "E2E: Prefetch ticket detail for first visible rows (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T051",
|
|
"description": "E2E: Implement ticket stats summary header using tickets stats endpoint (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F051"
|
|
]
|
|
},
|
|
{
|
|
"id": "T052",
|
|
"description": "E2E: Ensure list results respect RBAC and data visibility",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F052"
|
|
]
|
|
},
|
|
{
|
|
"id": "T053",
|
|
"description": "E2E: Implement Ticket detail screen with loading skeleton and refresh",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053"
|
|
]
|
|
},
|
|
{
|
|
"id": "T054",
|
|
"description": "E2E: Render ticket header (number/title/status/priority/assignee)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F054"
|
|
]
|
|
},
|
|
{
|
|
"id": "T055",
|
|
"description": "E2E: Render requester/contact and client/company summary",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F055"
|
|
]
|
|
},
|
|
{
|
|
"id": "T056",
|
|
"description": "E2E: Render key timestamps (created/updated/closed) with relative time",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F056"
|
|
]
|
|
},
|
|
{
|
|
"id": "T057",
|
|
"description": "E2E: Render description with safe link handling (optional markdown)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F057"
|
|
]
|
|
},
|
|
{
|
|
"id": "T058",
|
|
"description": "E2E: Render comments/timeline with pagination",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F058"
|
|
]
|
|
},
|
|
{
|
|
"id": "T059",
|
|
"description": "E2E: Differentiate internal vs public comments visually",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F059"
|
|
]
|
|
},
|
|
{
|
|
"id": "T060",
|
|
"description": "E2E: Show commenter identity and timestamp for entries",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F060"
|
|
]
|
|
},
|
|
{
|
|
"id": "T061",
|
|
"description": "E2E: Support copy ticket id/number and “open in web” link-out",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F061"
|
|
]
|
|
},
|
|
{
|
|
"id": "T062",
|
|
"description": "E2E: Handle 404/403 states with friendly UX",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F062"
|
|
]
|
|
},
|
|
{
|
|
"id": "T063",
|
|
"description": "E2E: Cache last-viewed ticket detail (TTL)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F063"
|
|
]
|
|
},
|
|
{
|
|
"id": "T064",
|
|
"description": "E2E: Ensure detail respects RBAC and field-level visibility",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F064"
|
|
]
|
|
},
|
|
{
|
|
"id": "T065",
|
|
"description": "E2E: Implement add-comment composer (multiline) with send action",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F065"
|
|
]
|
|
},
|
|
{
|
|
"id": "T066",
|
|
"description": "E2E: Support comment visibility selection (internal vs public)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F066"
|
|
]
|
|
},
|
|
{
|
|
"id": "T067",
|
|
"description": "E2E: Validate comment length and show inline errors",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F067"
|
|
]
|
|
},
|
|
{
|
|
"id": "T068",
|
|
"description": "E2E: Post comment and update timeline on success",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F068"
|
|
]
|
|
},
|
|
{
|
|
"id": "T069",
|
|
"description": "E2E: Preserve draft on failure/navigation and allow retry",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F069"
|
|
]
|
|
},
|
|
{
|
|
"id": "T070",
|
|
"description": "E2E: Prevent duplicate submissions while in-flight",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F070"
|
|
]
|
|
},
|
|
{
|
|
"id": "T071",
|
|
"description": "E2E: Implement status picker using server-provided allowed statuses",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F071"
|
|
]
|
|
},
|
|
{
|
|
"id": "T072",
|
|
"description": "E2E: Submit status change and update ticket header/list badges",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F072"
|
|
]
|
|
},
|
|
{
|
|
"id": "T073",
|
|
"description": "E2E: Handle 409 conflicts (ticket changed elsewhere) with refresh + retry UX",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F073"
|
|
]
|
|
},
|
|
{
|
|
"id": "T074",
|
|
"description": "E2E: Include mobile client metadata on update calls (audit)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F074"
|
|
]
|
|
},
|
|
{
|
|
"id": "T075",
|
|
"description": "E2E: Ensure updates respect RBAC and server-side validation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F075"
|
|
]
|
|
},
|
|
{
|
|
"id": "T076",
|
|
"description": "E2E: Implement assign-to-me action and reflect in UI",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F076"
|
|
]
|
|
},
|
|
{
|
|
"id": "T077",
|
|
"description": "E2E: Implement unassign action when permitted",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F077"
|
|
]
|
|
},
|
|
{
|
|
"id": "T078",
|
|
"description": "E2E: Implement priority update via picker",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F078"
|
|
]
|
|
},
|
|
{
|
|
"id": "T079",
|
|
"description": "E2E: Implement due date update (if supported by API)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F079"
|
|
]
|
|
},
|
|
{
|
|
"id": "T080",
|
|
"description": "E2E: Implement watchers/subscribers add/remove (if supported by API)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F080"
|
|
]
|
|
},
|
|
{
|
|
"id": "T081",
|
|
"description": "E2E: Implement time entry creation from ticket (if supported by API)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F081"
|
|
]
|
|
},
|
|
{
|
|
"id": "T082",
|
|
"description": "E2E: Surface validation errors clearly for partial updates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F082"
|
|
]
|
|
},
|
|
{
|
|
"id": "T083",
|
|
"description": "E2E: Support field-level loading indicators for partial updates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F083"
|
|
]
|
|
},
|
|
{
|
|
"id": "T084",
|
|
"description": "Unit: Implement Settings screen showing current user identity and tenant",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F084"
|
|
]
|
|
},
|
|
{
|
|
"id": "T085",
|
|
"description": "Unit: Add “clear cache” action",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F085"
|
|
]
|
|
},
|
|
{
|
|
"id": "T086",
|
|
"description": "Unit: Add “logout” action",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F086"
|
|
]
|
|
},
|
|
{
|
|
"id": "T087",
|
|
"description": "Unit: Add “about/legal” screens (privacy policy/terms)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F087"
|
|
]
|
|
},
|
|
{
|
|
"id": "T088",
|
|
"description": "Unit: Add toggles: biometric gate, hide sensitive info in notifications (future)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F088"
|
|
]
|
|
},
|
|
{
|
|
"id": "T089",
|
|
"description": "Unit: Optimize list rendering (virtualized list, avoid re-renders)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F089"
|
|
]
|
|
},
|
|
{
|
|
"id": "T090",
|
|
"description": "Unit: Optimize payload sizes via slim DTOs / field selection (server support)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F090"
|
|
]
|
|
},
|
|
{
|
|
"id": "T091",
|
|
"description": "Unit: Handle timezone/locale formatting consistently",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F091"
|
|
]
|
|
},
|
|
{
|
|
"id": "T092",
|
|
"description": "Unit: Add privacy review checklist and PII inventory for mobile data flows",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F092"
|
|
]
|
|
},
|
|
{
|
|
"id": "T093",
|
|
"description": "Unit: Add observability events for auth success/failure and API error rates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F093"
|
|
]
|
|
},
|
|
{
|
|
"id": "T094",
|
|
"description": "Checklist: Set up iOS TestFlight and Android internal testing pipelines",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F094"
|
|
]
|
|
},
|
|
{
|
|
"id": "T095",
|
|
"description": "Checklist: Define signing, versioning, and release notes process",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F095"
|
|
]
|
|
},
|
|
{
|
|
"id": "T096",
|
|
"description": "Checklist: Add app icon/splash assets",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F096"
|
|
]
|
|
},
|
|
{
|
|
"id": "T097",
|
|
"description": "Checklist: Add rollout checklist and rollback plan",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F097"
|
|
]
|
|
},
|
|
{
|
|
"id": "T098",
|
|
"description": "Integration: Add mobile handoff endpoint/page that issues a short-lived, single-use OTT for authenticated web sessions",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F098"
|
|
]
|
|
},
|
|
{
|
|
"id": "T099",
|
|
"description": "Integration: Add storage for mobile OTTs with expiry, single-use semantics, and tenant/user binding",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F099"
|
|
]
|
|
},
|
|
{
|
|
"id": "T100",
|
|
"description": "Integration: Add API endpoint to exchange OTT for mobile API credential (short-lived) and refresh token/rotation mechanism",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F100"
|
|
]
|
|
},
|
|
{
|
|
"id": "T101",
|
|
"description": "Integration: Integrate with existing Microsoft/Google SSO configurations used by web login",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F101"
|
|
]
|
|
},
|
|
{
|
|
"id": "T102",
|
|
"description": "Integration: Add API endpoint to refresh/rotate mobile credentials and invalidate old tokens",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F102"
|
|
]
|
|
},
|
|
{
|
|
"id": "T103",
|
|
"description": "Integration: Add API endpoint to revoke mobile sessions (logout)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F103"
|
|
]
|
|
},
|
|
{
|
|
"id": "T104",
|
|
"description": "Integration: Add endpoint for mobile capability discovery (mobile enabled, providers available, TTLs)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F104"
|
|
]
|
|
},
|
|
{
|
|
"id": "T105",
|
|
"description": "Integration: Add rate limiting for OTT issue/exchange/refresh endpoints",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F105"
|
|
]
|
|
},
|
|
{
|
|
"id": "T106",
|
|
"description": "Integration: Add audit logging for mobile session issue/refresh/revoke events",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F106"
|
|
]
|
|
},
|
|
{
|
|
"id": "T107",
|
|
"description": "Integration: Ensure ticket APIs used by mobile are available and documented (list/search/detail/comments/status/assignment/stats)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F107"
|
|
]
|
|
},
|
|
{
|
|
"id": "T108",
|
|
"description": "Integration: Ensure ticket comment create API supports internal/public visibility flag",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F108"
|
|
]
|
|
},
|
|
{
|
|
"id": "T109",
|
|
"description": "Integration: Ensure consistent error shape for validation/auth errors for mobile clients",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F109"
|
|
]
|
|
},
|
|
{
|
|
"id": "T110",
|
|
"description": "Integration: Add migrations for new tables/columns used by mobile auth",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F110"
|
|
]
|
|
},
|
|
{
|
|
"id": "T111",
|
|
"description": "Integration: Add tests for OTT single-use + expiry and credential rotation",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F111"
|
|
]
|
|
},
|
|
{
|
|
"id": "T112",
|
|
"description": "Integration: Add documentation for mobile auth configuration and hosted domain allowlist",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F112"
|
|
]
|
|
},
|
|
{
|
|
"id": "T113",
|
|
"description": "Deferred: Implement push notification registration (APNs/FCM) and device token management",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F113"
|
|
]
|
|
},
|
|
{
|
|
"id": "T114",
|
|
"description": "Deferred: Add server endpoints to register/unregister device tokens",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F114"
|
|
]
|
|
},
|
|
{
|
|
"id": "T115",
|
|
"description": "Deferred: Send push notifications for assignment/status/mention events",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F115"
|
|
]
|
|
},
|
|
{
|
|
"id": "T116",
|
|
"description": "Deferred: Deep link from push notification into ticket detail",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F116"
|
|
]
|
|
},
|
|
{
|
|
"id": "T117",
|
|
"description": "Deferred: Add notification preferences screen",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F117"
|
|
]
|
|
},
|
|
{
|
|
"id": "T118",
|
|
"description": "Deferred: Add base URL selection and self-hosted domain onboarding UX",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F118"
|
|
]
|
|
},
|
|
{
|
|
"id": "T119",
|
|
"description": "Deferred: Document self-hosted requirements for mobile handoff URLs and SSO callback domains",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F119"
|
|
]
|
|
},
|
|
{
|
|
"id": "T120",
|
|
"description": "Deferred: Add self-hosted connectivity diagnostics and TLS certificate troubleshooting UX",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F120"
|
|
]
|
|
},
|
|
{
|
|
"id": "T121",
|
|
"description": "Unit: Implement standardized API error mapping: network vs validation vs auth vs permission vs server error",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F121"
|
|
]
|
|
},
|
|
{
|
|
"id": "T122",
|
|
"description": "Unit: Implement global HTTP 401 handler (attempt refresh once then force sign-in)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F122"
|
|
]
|
|
},
|
|
{
|
|
"id": "T123",
|
|
"description": "Unit: Implement global HTTP 403 handler (show no-access UX)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F123"
|
|
]
|
|
},
|
|
{
|
|
"id": "T124",
|
|
"description": "Unit: Implement request cancellation for superseded ticket search queries",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F124"
|
|
]
|
|
},
|
|
{
|
|
"id": "T125",
|
|
"description": "Unit: Implement request deduplication for concurrent identical GETs",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F125"
|
|
]
|
|
},
|
|
{
|
|
"id": "T126",
|
|
"description": "Unit: Implement app-level telemetry correlation id on every request",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F126"
|
|
]
|
|
},
|
|
{
|
|
"id": "T127",
|
|
"description": "Unit: Implement secure handling of deep link URLs (reject unexpected hosts/paths)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F127"
|
|
]
|
|
},
|
|
{
|
|
"id": "T128",
|
|
"description": "Unit: Implement “open in web” URL builder for hosted environments",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F128"
|
|
]
|
|
},
|
|
{
|
|
"id": "T129",
|
|
"description": "Unit: Implement clipboard helper that redacts sensitive fields by default (configurable)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F129"
|
|
]
|
|
},
|
|
{
|
|
"id": "T130",
|
|
"description": "Unit: Implement app state restoration for last-viewed tab and last-opened ticket (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F130"
|
|
]
|
|
},
|
|
{
|
|
"id": "T131",
|
|
"description": "Unit: Implement memory leak guardrails for large lists (profiling checklist)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F131"
|
|
]
|
|
},
|
|
{
|
|
"id": "T132",
|
|
"description": "Unit: Implement startup performance budget and measurement",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F132"
|
|
]
|
|
},
|
|
{
|
|
"id": "T133",
|
|
"description": "E2E: Implement OTT exchange retry with exponential backoff and single-flight guard",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F133"
|
|
]
|
|
},
|
|
{
|
|
"id": "T134",
|
|
"description": "E2E: Implement refresh token rotation handling with safe rollback on failures",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F134"
|
|
]
|
|
},
|
|
{
|
|
"id": "T135",
|
|
"description": "E2E: Implement session revocation check on app resume (throttled)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F135"
|
|
]
|
|
},
|
|
{
|
|
"id": "T136",
|
|
"description": "E2E: Implement sign-in error UX for invalid tenant/provider configuration",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F136"
|
|
]
|
|
},
|
|
{
|
|
"id": "T137",
|
|
"description": "E2E: Implement sign-in error UX for user without required ticket permissions",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F137"
|
|
]
|
|
},
|
|
{
|
|
"id": "T138",
|
|
"description": "E2E: Implement sign-in UX copy that clearly indicates “internal users only”",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F138"
|
|
]
|
|
},
|
|
{
|
|
"id": "T139",
|
|
"description": "E2E: Implement List:Filters - status multi-select",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F139"
|
|
]
|
|
},
|
|
{
|
|
"id": "T140",
|
|
"description": "E2E: Implement List:Filters - assignee (me/unassigned) selector",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F140"
|
|
]
|
|
},
|
|
{
|
|
"id": "T141",
|
|
"description": "E2E: Implement List:Filters - priority selector",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F141"
|
|
]
|
|
},
|
|
{
|
|
"id": "T142",
|
|
"description": "E2E: Implement List:Filters - updated-since date picker",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F142"
|
|
]
|
|
},
|
|
{
|
|
"id": "T143",
|
|
"description": "E2E: Implement List:Filters - sort selector",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F143"
|
|
]
|
|
},
|
|
{
|
|
"id": "T144",
|
|
"description": "E2E: Implement List:UX - filter chip summary bar",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F144"
|
|
]
|
|
},
|
|
{
|
|
"id": "T145",
|
|
"description": "E2E: Implement List:UX - clear-all filters CTA",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F145"
|
|
]
|
|
},
|
|
{
|
|
"id": "T146",
|
|
"description": "E2E: Implement List:UX - last refreshed timestamp",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F146"
|
|
]
|
|
},
|
|
{
|
|
"id": "T147",
|
|
"description": "E2E: Implement List:UX - pull-to-refresh haptics (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F147"
|
|
]
|
|
},
|
|
{
|
|
"id": "T148",
|
|
"description": "E2E: Implement List:Errors - 401 handling (refresh then sign-in)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F148"
|
|
]
|
|
},
|
|
{
|
|
"id": "T149",
|
|
"description": "E2E: Implement List:Errors - 403 handling (no access)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F149"
|
|
]
|
|
},
|
|
{
|
|
"id": "T150",
|
|
"description": "E2E: Implement List:Errors - 5xx retry with backoff",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F150"
|
|
]
|
|
},
|
|
{
|
|
"id": "T151",
|
|
"description": "E2E: Implement List:Errors - network offline retry",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F151"
|
|
]
|
|
},
|
|
{
|
|
"id": "T152",
|
|
"description": "E2E: Implement List:Perf - prefetch next page threshold tuning",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F152"
|
|
]
|
|
},
|
|
{
|
|
"id": "T153",
|
|
"description": "E2E: Implement List:Perf - cache invalidation on updates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F153"
|
|
]
|
|
},
|
|
{
|
|
"id": "T154",
|
|
"description": "E2E: Implement ticket detail - sectioned layout (header/details/comments)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F154"
|
|
]
|
|
},
|
|
{
|
|
"id": "T155",
|
|
"description": "E2E: Implement ticket detail - pull-to-refresh indicator states",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F155"
|
|
]
|
|
},
|
|
{
|
|
"id": "T156",
|
|
"description": "E2E: Implement ticket detail - open-in-web uses stable URL format",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F156"
|
|
]
|
|
},
|
|
{
|
|
"id": "T157",
|
|
"description": "E2E: Implement ticket detail - copy actions for id/number",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F157"
|
|
]
|
|
},
|
|
{
|
|
"id": "T158",
|
|
"description": "E2E: Implement ticket detail - link handling opens external browser with confirmation (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F158"
|
|
]
|
|
},
|
|
{
|
|
"id": "T159",
|
|
"description": "E2E: Implement ticket detail - comment pagination (load more)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F159"
|
|
]
|
|
},
|
|
{
|
|
"id": "T160",
|
|
"description": "E2E: Implement ticket detail - internal/public comment badges",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F160"
|
|
]
|
|
},
|
|
{
|
|
"id": "T161",
|
|
"description": "E2E: Implement ticket detail - render system events (status/assignee changes) distinctly (if present)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F161"
|
|
]
|
|
},
|
|
{
|
|
"id": "T162",
|
|
"description": "E2E: Implement ticket detail - cache invalidation after posting comment/status change",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F162"
|
|
]
|
|
},
|
|
{
|
|
"id": "T163",
|
|
"description": "E2E: Implement ticket detail - optimistic UI for comment post with rollback on failure",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F163"
|
|
]
|
|
},
|
|
{
|
|
"id": "T164",
|
|
"description": "E2E: Implement ticket detail - optimistic UI for status change with rollback on failure",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F164"
|
|
]
|
|
},
|
|
{
|
|
"id": "T165",
|
|
"description": "E2E: Implement ticket detail - conflict resolution prompt on 409",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F165"
|
|
]
|
|
},
|
|
{
|
|
"id": "T166",
|
|
"description": "E2E: Implement ticket detail - consistent date formatting per locale",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F166"
|
|
]
|
|
},
|
|
{
|
|
"id": "T167",
|
|
"description": "E2E: Implement ticket detail - accessibility: headings for sections",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F167"
|
|
]
|
|
},
|
|
{
|
|
"id": "T168",
|
|
"description": "E2E: Implement ticket detail - accessibility: timeline entries read in sensible order",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F168"
|
|
]
|
|
},
|
|
{
|
|
"id": "T169",
|
|
"description": "E2E: Implement ticket detail - scroll-to-latest comment quick action (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F169"
|
|
]
|
|
},
|
|
{
|
|
"id": "T170",
|
|
"description": "E2E: Implement ticket detail - jump-to-top button on long timelines (optional)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F170"
|
|
]
|
|
},
|
|
{
|
|
"id": "T171",
|
|
"description": "E2E: Implement updates - draft persistence per ticket",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F171"
|
|
]
|
|
},
|
|
{
|
|
"id": "T172",
|
|
"description": "E2E: Implement updates - draft cleared on successful send",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F172"
|
|
]
|
|
},
|
|
{
|
|
"id": "T173",
|
|
"description": "E2E: Implement updates - comment length limit enforcement matches server",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F173"
|
|
]
|
|
},
|
|
{
|
|
"id": "T174",
|
|
"description": "E2E: Implement updates - comment visibility default (internal) and remembered per user",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F174"
|
|
]
|
|
},
|
|
{
|
|
"id": "T175",
|
|
"description": "E2E: Implement updates - status list fetched and cached with TTL",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F175"
|
|
]
|
|
},
|
|
{
|
|
"id": "T176",
|
|
"description": "E2E: Implement updates - status transitions validated server-side with friendly error messages",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F176"
|
|
]
|
|
},
|
|
{
|
|
"id": "T177",
|
|
"description": "E2E: Implement updates - disable send while offline with queued draft (no offline send)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F177"
|
|
]
|
|
},
|
|
{
|
|
"id": "T178",
|
|
"description": "E2E: Implement updates - toast feedback for success/failure",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F178"
|
|
]
|
|
},
|
|
{
|
|
"id": "T179",
|
|
"description": "E2E: Implement updates - field-level spinners for partial updates",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F179"
|
|
]
|
|
},
|
|
{
|
|
"id": "T180",
|
|
"description": "E2E: Implement updates - retry mechanism for transient failures",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F180"
|
|
]
|
|
},
|
|
{
|
|
"id": "T181",
|
|
"description": "E2E: Implement updates - prevent double-tap submits",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F181"
|
|
]
|
|
},
|
|
{
|
|
"id": "T182",
|
|
"description": "E2E: Implement updates - include app version/device id headers on mutations",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F182"
|
|
]
|
|
},
|
|
{
|
|
"id": "T183",
|
|
"description": "E2E: Implement updates - assign-to-me button shows disabled state when already assignee",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F183"
|
|
]
|
|
},
|
|
{
|
|
"id": "T184",
|
|
"description": "E2E: Implement updates - priority picker disables invalid choices (if server provides)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F184"
|
|
]
|
|
},
|
|
{
|
|
"id": "T185",
|
|
"description": "E2E: Implement updates - due date picker supports clearing due date (if allowed)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F185"
|
|
]
|
|
},
|
|
{
|
|
"id": "T186",
|
|
"description": "E2E: Implement updates - time entry form validates required fields and rounds durations per policy",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F186"
|
|
]
|
|
},
|
|
{
|
|
"id": "T187",
|
|
"description": "Integration: Implement server mobile auth - OTT is bound to user session id to prevent replay across sessions",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F187"
|
|
]
|
|
},
|
|
{
|
|
"id": "T188",
|
|
"description": "Integration: Implement server mobile auth - OTT includes nonce/state and is single-use",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F188"
|
|
]
|
|
},
|
|
{
|
|
"id": "T189",
|
|
"description": "Integration: Implement server mobile auth - OTT expiry configurable (default short, e.g., 60s)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F189"
|
|
]
|
|
},
|
|
{
|
|
"id": "T190",
|
|
"description": "Integration: Implement server mobile auth - exchange endpoint validates OTT + state + device metadata shape",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F190"
|
|
]
|
|
},
|
|
{
|
|
"id": "T191",
|
|
"description": "Integration: Implement server mobile auth - refresh token rotation with immediate invalidation of prior refresh token",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F191"
|
|
]
|
|
},
|
|
{
|
|
"id": "T192",
|
|
"description": "Integration: Implement server mobile auth - capabilities endpoint returns providers enabled and mobile auth enabled flag",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F192"
|
|
]
|
|
},
|
|
{
|
|
"id": "T193",
|
|
"description": "Integration: Implement server mobile auth - capabilities endpoint returns hosted domain allowlist",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F193"
|
|
]
|
|
},
|
|
{
|
|
"id": "T194",
|
|
"description": "Integration: Implement server mobile auth - rate limiting per IP and per user for exchange/refresh",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F194"
|
|
]
|
|
},
|
|
{
|
|
"id": "T195",
|
|
"description": "Integration: Implement server mobile auth - audit logs include device id, app version, user id, tenant, action",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F195"
|
|
]
|
|
},
|
|
{
|
|
"id": "T196",
|
|
"description": "Integration: Implement server mobile auth - consistent error response schema for auth errors",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F196"
|
|
]
|
|
},
|
|
{
|
|
"id": "T197",
|
|
"description": "Integration: Implement server mobile auth - ticket comment visibility enforcement matches permissions (public vs internal)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F197"
|
|
]
|
|
},
|
|
{
|
|
"id": "T198",
|
|
"description": "Integration: Implement server mobile auth - ticket list endpoint supports updated-since filter used by mobile",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F198"
|
|
]
|
|
},
|
|
{
|
|
"id": "T199",
|
|
"description": "Integration: Implement server mobile auth - ticket list endpoint supports assignee=me and assignee=unassigned filters",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F199"
|
|
]
|
|
},
|
|
{
|
|
"id": "T200",
|
|
"description": "Integration: Implement server mobile auth - ticket detail endpoint returns enough fields for header + detail sections",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F200"
|
|
]
|
|
},
|
|
{
|
|
"id": "T201",
|
|
"description": "Integration: Implement server mobile auth - ticket comments endpoint supports pagination and ordering",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F201"
|
|
]
|
|
},
|
|
{
|
|
"id": "T202",
|
|
"description": "Integration: Implement server mobile auth - ticket status update endpoint validates transitions and returns updated summary",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F202"
|
|
]
|
|
},
|
|
{
|
|
"id": "T203",
|
|
"description": "Integration: Implement server mobile auth - ticket assignment update endpoint supports assign-to-self without separate user lookup",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F203"
|
|
]
|
|
},
|
|
{
|
|
"id": "T204",
|
|
"description": "Integration: Implement server mobile auth - time entry create endpoint validates ticket association and permissions",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F204"
|
|
]
|
|
},
|
|
{
|
|
"id": "T205",
|
|
"description": "Unit: Quality/Ops - end-to-end analytics event names cataloged and versioned",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F205"
|
|
]
|
|
},
|
|
{
|
|
"id": "T206",
|
|
"description": "Unit: Quality/Ops - crash reporting excludes request/response bodies by default",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F206"
|
|
]
|
|
},
|
|
{
|
|
"id": "T207",
|
|
"description": "Unit: Quality/Ops - redaction rules cover ticket subjects and comment bodies",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F207"
|
|
]
|
|
},
|
|
{
|
|
"id": "T208",
|
|
"description": "Unit: Quality/Ops - API latency measurement per route",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F208"
|
|
]
|
|
},
|
|
{
|
|
"id": "T209",
|
|
"description": "Unit: Quality/Ops - SLOs defined for key endpoints (list/detail/mutate)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F209"
|
|
]
|
|
},
|
|
{
|
|
"id": "T210",
|
|
"description": "Unit: Quality/Ops - accessibility audit checklist executed pre-release",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F210"
|
|
]
|
|
},
|
|
{
|
|
"id": "T211",
|
|
"description": "Unit: Quality/Ops - security review checklist executed pre-release",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F211"
|
|
]
|
|
},
|
|
{
|
|
"id": "T212",
|
|
"description": "Unit: Quality/Ops - dependency vulnerability scanning enabled for mobile package",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F212"
|
|
]
|
|
},
|
|
{
|
|
"id": "T213",
|
|
"description": "Unit: Quality/Ops - mobile build reproducibility checks in CI",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F213"
|
|
]
|
|
},
|
|
{
|
|
"id": "T214",
|
|
"description": "Checklist: Release - store listing draft (Phase 1)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F214"
|
|
]
|
|
},
|
|
{
|
|
"id": "T215",
|
|
"description": "Checklist: Release - screenshot capture plan for App Store / Play Store",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F215"
|
|
]
|
|
},
|
|
{
|
|
"id": "T216",
|
|
"description": "Checklist: Release - internal beta distribution runbook",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F216"
|
|
]
|
|
},
|
|
{
|
|
"id": "T217",
|
|
"description": "Checklist: Release - support escalation runbook for auth issues",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F217"
|
|
]
|
|
},
|
|
{
|
|
"id": "T218",
|
|
"description": "Checklist: Release - minimum OS support policy documented",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F218"
|
|
]
|
|
},
|
|
{
|
|
"id": "T219",
|
|
"description": "Checklist: Release - feature gating to disable Phase 2 modules in production builds",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F219"
|
|
]
|
|
},
|
|
{
|
|
"id": "T220",
|
|
"description": "E2E: Login handoff -> exchange OTT -> land on ticket list",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023",
|
|
"F024",
|
|
"F025",
|
|
"F038"
|
|
]
|
|
},
|
|
{
|
|
"id": "T221",
|
|
"description": "E2E: Open ticket -> add INTERNAL comment -> verify shown as internal",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053",
|
|
"F068",
|
|
"F066"
|
|
]
|
|
},
|
|
{
|
|
"id": "T222",
|
|
"description": "E2E: Open ticket -> add PUBLIC comment -> verify shown as public",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053",
|
|
"F068",
|
|
"F066"
|
|
]
|
|
},
|
|
{
|
|
"id": "T223",
|
|
"description": "E2E: Open ticket -> change status -> verify reflected in header and list",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053",
|
|
"F072",
|
|
"F072"
|
|
]
|
|
},
|
|
{
|
|
"id": "T224",
|
|
"description": "E2E: Assign to me -> set priority -> verify list badges update",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F053",
|
|
"F076",
|
|
"F078",
|
|
"F072"
|
|
]
|
|
},
|
|
{
|
|
"id": "T225",
|
|
"description": "Integration: OTT single-use and expiry enforced",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F099",
|
|
"F188"
|
|
]
|
|
},
|
|
{
|
|
"id": "T226",
|
|
"description": "Integration: Mobile credential rotation invalidates prior token",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F102",
|
|
"F134"
|
|
]
|
|
},
|
|
{
|
|
"id": "T227",
|
|
"description": "Security: Mobile mutation endpoints enforce same RBAC as web",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F052",
|
|
"F075"
|
|
]
|
|
}
|
|
]
|