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

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