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
655 lines
15 KiB
JSON
655 lines
15 KiB
JSON
[
|
|
{
|
|
"id": "T001",
|
|
"description": "Migration: `reports_to` column exists on `users` table and is nullable UUID",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F001"
|
|
]
|
|
},
|
|
{
|
|
"id": "T002",
|
|
"description": "Migration: `reports_to` FK references `users(user_id)` — inserting invalid UUID fails",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F001"
|
|
]
|
|
},
|
|
{
|
|
"id": "T003",
|
|
"description": "Migration seed: users who are team members get `reports_to` set to their team's `manager_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T004",
|
|
"description": "Migration seed: team managers do not get `reports_to` set to themselves",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T005",
|
|
"description": "Migration seed: users in multiple teams (same manager) get correct `reports_to` value",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T006",
|
|
"description": "Migration seed: users not in any team have `reports_to = NULL`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F002"
|
|
]
|
|
},
|
|
{
|
|
"id": "T007",
|
|
"description": "Cycle prevention: setting A.reports_to = B where B.reports_to = A is rejected",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T008",
|
|
"description": "Cycle prevention: setting A.reports_to = A (self-reference) is rejected",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T009",
|
|
"description": "Cycle prevention: deep chain cycle (A→B→C→D→A) is detected and rejected",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T010",
|
|
"description": "Cycle prevention: valid chain (A→B→C, setting D→C) is accepted",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T011",
|
|
"description": "`IUser` interface includes optional `reports_to` field",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F004"
|
|
]
|
|
},
|
|
{
|
|
"id": "T012",
|
|
"description": "User edit form: 'Reports To' dropdown is visible when `teams-v2` flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F005"
|
|
]
|
|
},
|
|
{
|
|
"id": "T013",
|
|
"description": "User edit form: 'Reports To' dropdown is hidden when `teams-v2` flag is off",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F007"
|
|
]
|
|
},
|
|
{
|
|
"id": "T014",
|
|
"description": "User edit form: 'Reports To' dropdown lists all users in the tenant except the current user",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F005"
|
|
]
|
|
},
|
|
{
|
|
"id": "T015",
|
|
"description": "User edit form: saving a valid `reports_to` value persists to database",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T016",
|
|
"description": "User edit form: saving a `reports_to` value that creates a cycle shows error",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T017",
|
|
"description": "User edit form: clearing `reports_to` (set to NULL) persists correctly",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F006"
|
|
]
|
|
},
|
|
{
|
|
"id": "T018",
|
|
"description": "Org chart: displays tree with correct parent-child relationships based on `reports_to`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008"
|
|
]
|
|
},
|
|
{
|
|
"id": "T019",
|
|
"description": "Org chart: users with `reports_to = NULL` appear as top-level root nodes",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F009"
|
|
]
|
|
},
|
|
{
|
|
"id": "T020",
|
|
"description": "Org chart: hidden when `teams-v2` flag is off",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F010"
|
|
]
|
|
},
|
|
{
|
|
"id": "T021",
|
|
"description": "`isInReportsToChain(B, A)` returns true when A.reports_to = B (direct report)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T022",
|
|
"description": "`isInReportsToChain(C, A)` returns true when A→B→C (transitive — two levels)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T023",
|
|
"description": "`isInReportsToChain(D, A)` returns true for deep chain A→B→C→D (three+ levels)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T024",
|
|
"description": "`isInReportsToChain(X, A)` returns false when X is not in A's reporting chain",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T025",
|
|
"description": "`isInReportsToChain` handles arbitrarily deep chains without stack overflow",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T026",
|
|
"description": "Timesheet approval: manager can approve direct report's timesheet via `reports_to` chain when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012",
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T027",
|
|
"description": "Timesheet approval: manager-of-manager can approve indirect report's timesheet via `reports_to` chain when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012",
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T028",
|
|
"description": "Timesheet approval: existing team-manager approval still works regardless of flag state",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T029",
|
|
"description": "Timesheet approval: `reports_to` chain check is NOT active when flag is off",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012"
|
|
]
|
|
},
|
|
{
|
|
"id": "T030",
|
|
"description": "Timesheet approval: user with `timesheet:read_all` can still approve anyone (unchanged)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T031",
|
|
"description": "`fetchTimeSheetsForApproval` returns timesheets from `reports_to` subordinates when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T032",
|
|
"description": "AvailabilitySettings: shows `reports_to` subordinates in user list when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F015"
|
|
]
|
|
},
|
|
{
|
|
"id": "T033",
|
|
"description": "SchedulePage: includes `reports_to` subordinates in managed users scope when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T034",
|
|
"description": "Migration: `role` column exists on `team_members` with default value 'member'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F017"
|
|
]
|
|
},
|
|
{
|
|
"id": "T035",
|
|
"description": "Migration: existing team members matching `teams.manager_id` have `role = 'lead'`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F018"
|
|
]
|
|
},
|
|
{
|
|
"id": "T036",
|
|
"description": "Migration: `assigned_team_id` column exists on `tickets` table and is nullable",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F020"
|
|
]
|
|
},
|
|
{
|
|
"id": "T037",
|
|
"description": "Migration: `assigned_team_id` column exists on `project_tasks` table and is nullable",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F021"
|
|
]
|
|
},
|
|
{
|
|
"id": "T038",
|
|
"description": "`ITicket` interface includes optional `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F022"
|
|
]
|
|
},
|
|
{
|
|
"id": "T039",
|
|
"description": "`IProjectTask` interface includes optional `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023"
|
|
]
|
|
},
|
|
{
|
|
"id": "T040",
|
|
"description": "Team assignment to ticket (no primary): sets `assigned_team_id`, sets lead as `assigned_to`, adds other members as `ticket_resources`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T041",
|
|
"description": "Team assignment to ticket (no primary): lead is NOT added as `ticket_resources` (would violate DB constraint)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F026"
|
|
]
|
|
},
|
|
{
|
|
"id": "T042",
|
|
"description": "Team assignment to ticket (existing primary): `assigned_to` stays unchanged, all team members added as resources except current `assigned_to`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025"
|
|
]
|
|
},
|
|
{
|
|
"id": "T043",
|
|
"description": "Team assignment to ticket (existing primary is the lead): lead not double-assigned, other members added as resources",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025",
|
|
"F026"
|
|
]
|
|
},
|
|
{
|
|
"id": "T044",
|
|
"description": "Team assignment: resources added via team have `role = 'team_member'` in `ticket_resources`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T045",
|
|
"description": "Team assignment: members already present as individual `ticket_resources` are not duplicated",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T046",
|
|
"description": "Team assignment to project task: same logic works for `project_tasks`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F027"
|
|
]
|
|
},
|
|
{
|
|
"id": "T047",
|
|
"description": "`UserAndTeamPicker`: renders users section and teams section with visible separator",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F028"
|
|
]
|
|
},
|
|
{
|
|
"id": "T048",
|
|
"description": "`UserAndTeamPicker`: typing in search filters both users and teams",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F029"
|
|
]
|
|
},
|
|
{
|
|
"id": "T049",
|
|
"description": "`UserAndTeamPicker`: teams display member count and lead name",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F030"
|
|
]
|
|
},
|
|
{
|
|
"id": "T050",
|
|
"description": "`UserAndTeamPicker`: teams use generic team icon, users use avatar",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F031"
|
|
]
|
|
},
|
|
{
|
|
"id": "T051",
|
|
"description": "`UserAndTeamPicker`: selecting a team triggers team assignment action",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F032"
|
|
]
|
|
},
|
|
{
|
|
"id": "T052",
|
|
"description": "`UserAndTeamPicker`: selecting a user works identically to existing `UserPicker`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F033"
|
|
]
|
|
},
|
|
{
|
|
"id": "T053",
|
|
"description": "Feature flag swap: `UserAndTeamPicker` renders on ticket detail when `teams-v2` is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F034"
|
|
]
|
|
},
|
|
{
|
|
"id": "T054",
|
|
"description": "Feature flag swap: `UserAndTeamPicker` renders on task detail when `teams-v2` is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F035"
|
|
]
|
|
},
|
|
{
|
|
"id": "T055",
|
|
"description": "Feature flag swap: `UserPicker` renders unchanged when `teams-v2` is off",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F036"
|
|
]
|
|
},
|
|
{
|
|
"id": "T056",
|
|
"description": "Team badge: chip appears on 'Agent team' card when `assigned_team_id` is set and flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T057",
|
|
"description": "Team badge: chip shows generic team icon + team name + x button",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T058",
|
|
"description": "Team badge: chip follows same styling as Additional Agents chips",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T059",
|
|
"description": "Team badge: hidden when `teams-v2` flag is off even if `assigned_team_id` has a value",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F038"
|
|
]
|
|
},
|
|
{
|
|
"id": "T060",
|
|
"description": "Team removal: clicking x on team badge opens confirmation dialog",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F039"
|
|
]
|
|
},
|
|
{
|
|
"id": "T061",
|
|
"description": "Team removal: 'Remove all' removes `ticket_resources` with `role = 'team_member'` and clears `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T062",
|
|
"description": "Team removal: 'Keep all' clears `assigned_team_id` only, all resources stay",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F041"
|
|
]
|
|
},
|
|
{
|
|
"id": "T063",
|
|
"description": "Team removal: individual checkboxes allow selective member removal",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F042"
|
|
]
|
|
},
|
|
{
|
|
"id": "T064",
|
|
"description": "Team removal: primary `assigned_to` is never automatically removed",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F043"
|
|
]
|
|
},
|
|
{
|
|
"id": "T065",
|
|
"description": "Team removal: manually-added agents (not `role = 'team_member'`) are not affected by 'Remove all'",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T066",
|
|
"description": "Independence: adding a new individual agent does not affect team badge or `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F044"
|
|
]
|
|
},
|
|
{
|
|
"id": "T067",
|
|
"description": "Independence: removing an individual agent does not affect team badge or `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F044"
|
|
]
|
|
},
|
|
{
|
|
"id": "T068",
|
|
"description": "Independence: SLA escalation adding an agent does not trigger team removal",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F044"
|
|
]
|
|
},
|
|
{
|
|
"id": "T069",
|
|
"description": "Snapshot: changing team roster after assignment does not update existing ticket resources",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F045"
|
|
]
|
|
},
|
|
{
|
|
"id": "T070",
|
|
"description": "'Assigned To' filter: shows teams in dropdown alongside users when flag is on",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F046"
|
|
]
|
|
},
|
|
{
|
|
"id": "T071",
|
|
"description": "'Assigned To' filter: selecting a team filters tickets by `assigned_team_id`",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
},
|
|
{
|
|
"id": "T072",
|
|
"description": "'Assigned To' filter: selecting a user still filters by `assigned_to` (existing behavior preserved)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
},
|
|
{
|
|
"id": "T073",
|
|
"description": "'Assigned To' filter: shows only users (no teams) when flag is off",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F048"
|
|
]
|
|
},
|
|
{
|
|
"id": "T074",
|
|
"description": "Workflow: `tickets.create` with `assignee: { type: 'team', id: teamId }` assigns team correctly",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F049"
|
|
]
|
|
},
|
|
{
|
|
"id": "T075",
|
|
"description": "Workflow: `tickets.create` with `assignee: { type: 'user', id: userId }` still works (existing behavior)",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F049"
|
|
]
|
|
},
|
|
{
|
|
"id": "T076",
|
|
"description": "Tenant export includes `reports_to` column from users",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T077",
|
|
"description": "Tenant export includes `assigned_team_id` from tickets and project_tasks",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T078",
|
|
"description": "Tenant export includes `role` from team_members",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F050"
|
|
]
|
|
},
|
|
{
|
|
"id": "T079",
|
|
"description": "Multi-tenant: `reports_to` queries are tenant-scoped",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F001",
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T080",
|
|
"description": "Multi-tenant: team assignment queries are tenant-scoped",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T081",
|
|
"description": "Multi-tenant: `assigned_team_id` filter queries are tenant-scoped",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F047"
|
|
]
|
|
}
|
|
]
|