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
2391 lines
64 KiB
JSON
2391 lines
64 KiB
JSON
[
|
|
{
|
|
"id": "F001",
|
|
"description": "Microsoft profiles: tenant-owned named Microsoft profiles exist as the shared credential model for Teams.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F002",
|
|
"description": "Microsoft profiles: profile persistence stores tenant-scoped profile ID, display name, client ID, client secret reference, tenant ID, and readiness metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F003",
|
|
"description": "Microsoft profiles: profile names are unique within a tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F004",
|
|
"description": "Microsoft profiles: one profile can be marked as the tenant default for legacy Microsoft consumers.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F005",
|
|
"description": "Microsoft profiles: migrating from the singleton Microsoft configuration creates a default named profile automatically.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F006",
|
|
"description": "Microsoft profiles: migration preserves the current `microsoft_client_id` value for the default profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F007",
|
|
"description": "Microsoft profiles: migration preserves the current `microsoft_client_secret` value for the default profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F008",
|
|
"description": "Microsoft profiles: migration preserves the current `microsoft_tenant_id` value for the default profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F009",
|
|
"description": "Microsoft profiles: profile reads return masked secret state instead of raw secret material.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F010",
|
|
"description": "Microsoft profiles: profile readiness captures whether required credentials exist and whether consumer-specific setup can proceed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F011",
|
|
"description": "Microsoft profiles: profile records can be archived without destroying historical consumer bindings.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F012",
|
|
"description": "Microsoft profiles: profile listing returns only the current tenant's profiles.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F013",
|
|
"description": "Microsoft profiles: profile creation validates required display name, client ID, client secret, and tenant ID fields.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F014",
|
|
"description": "Microsoft profiles: profile update supports rotating the client secret without forcing the UI to display the previous secret.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F015",
|
|
"description": "Microsoft profiles: deleting or archiving a profile that is still actively bound to a consumer is blocked until the binding is changed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F016",
|
|
"description": "Microsoft profiles: the secret provider remains the storage system of record for profile credential material.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F017",
|
|
"description": "Microsoft profiles: profile reads and writes remain fully tenant-scoped.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F018",
|
|
"description": "Microsoft profiles: helper resolution returns the tenant default profile for compatibility paths when a consumer has no explicit binding.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F019",
|
|
"description": "Microsoft settings UI: the existing singleton Microsoft settings screen becomes a profile manager.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F020",
|
|
"description": "Microsoft settings UI: the profile manager lists all profiles with display name, tenant ID, default state, and readiness state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F021",
|
|
"description": "Microsoft settings UI: admins can create a new named Microsoft profile from the settings screen.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F022",
|
|
"description": "Microsoft settings UI: admins can edit an existing named Microsoft profile from the settings screen.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F023",
|
|
"description": "Microsoft settings UI: admins can archive an existing named Microsoft profile from the settings screen.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F024",
|
|
"description": "Microsoft settings UI: admins can mark a named Microsoft profile as the default profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F025",
|
|
"description": "Microsoft settings UI: the form captures display name, client ID, client secret, and tenant ID.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F026",
|
|
"description": "Microsoft settings UI: the form preserves the existing client secret when the admin edits metadata without rotating the secret.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F027",
|
|
"description": "Microsoft settings UI: the screen continues to show the Microsoft Entra outbound link.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F028",
|
|
"description": "Microsoft settings UI: the screen shows Teams-required redirect URIs for each profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F029",
|
|
"description": "Microsoft settings UI: the screen shows existing email, calendar, and MSP SSO redirect URIs for each profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F030",
|
|
"description": "Microsoft settings UI: the screen shows Teams-required scope guidance for each profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F031",
|
|
"description": "Microsoft settings UI: the screen shows which consumers are currently bound to each profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F032",
|
|
"description": "Microsoft settings UI: the screen surfaces readiness or validation errors inline per profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F033",
|
|
"description": "Microsoft settings UI: the screen has an explicit empty state when no Microsoft profiles exist.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F034",
|
|
"description": "Microsoft settings UI: the screen retains a refresh path for reloading readiness and masked secret state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F035",
|
|
"description": "Microsoft settings UI: destructive archive or delete actions require confirmation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F036",
|
|
"description": "Microsoft settings UI: the Teams setup surface can be reached directly from profile management.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F037",
|
|
"description": "Consumer bindings: a tenant-scoped consumer binding model exists for Microsoft-profile consumers.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F038",
|
|
"description": "Consumer bindings: the model supports at least MSP SSO, email, calendar, and Teams as consumer types.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F039",
|
|
"description": "Consumer bindings: each consumer can reference exactly one selected Microsoft profile per tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F040",
|
|
"description": "Consumer bindings: migration creates compatibility bindings so existing Microsoft consumers continue to work after profile introduction.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F041",
|
|
"description": "Consumer bindings: Teams requires an explicit selected profile instead of silently falling back to unrelated global Microsoft credentials.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F042",
|
|
"description": "Teams setup: a tenant-scoped Teams integration record exists.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F043",
|
|
"description": "Teams setup: the Teams integration record stores the selected Microsoft profile ID.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F044",
|
|
"description": "Teams setup: the Teams integration record stores install/configuration status for the tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F045",
|
|
"description": "Teams setup: the Teams integration record stores enabled Teams capabilities for the tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F046",
|
|
"description": "Teams setup: the Teams integration record stores personal-notification category preferences for the tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F047",
|
|
"description": "Teams setup: the Teams integration record stores allowed action configuration for Teams quick actions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F048",
|
|
"description": "Teams setup: a tenant-admin Teams setup UI exists.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F049",
|
|
"description": "Teams setup: the UI requires selecting one Microsoft profile before Teams can be activated.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F050",
|
|
"description": "Teams setup: the UI shows the selected profile's app-registration values, redirect URIs, and scope guidance.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F051",
|
|
"description": "Teams setup: the UI shows install / consent / readiness checklist state for Teams.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F052",
|
|
"description": "Teams setup: the UI can save draft setup progress before Teams is fully activated.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F053",
|
|
"description": "Teams setup: the UI can activate Teams once required setup is complete.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F054",
|
|
"description": "Teams setup: the UI can deactivate Teams without deleting the underlying Microsoft profile.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F055",
|
|
"description": "Teams setup: the UI shows the currently selected profile, current capability toggles, and notification categories.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F056",
|
|
"description": "Teams setup: the UI links back to Microsoft profile management when no eligible profile exists or the selected profile is invalid.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F057",
|
|
"description": "Teams setup: the settings navigation includes a Teams integration entry.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F058",
|
|
"description": "Teams setup: a tenant without an eligible Microsoft profile receives a guided setup state instead of a blank error.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F059",
|
|
"description": "Teams app package: a Teams app manifest/package model exists for PSA.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F060",
|
|
"description": "Teams app package: the manifest declares a personal tab.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F061",
|
|
"description": "Teams app package: the manifest declares a personal-scope bot.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F062",
|
|
"description": "Teams app package: the manifest declares a message extension.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F063",
|
|
"description": "Teams app package: the manifest declares activity-feed notification capability.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F064",
|
|
"description": "Teams app package: the manifest uses the selected Microsoft profile's application identity and `webApplicationInfo` metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F065",
|
|
"description": "Teams app package: the manifest supports personal scope for the tab and bot.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F066",
|
|
"description": "Teams app package: the manifest supports message and compose contexts needed for message-extension flows.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F067",
|
|
"description": "Teams app package: the manifest omits channel-routing-specific notification requirements in v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F068",
|
|
"description": "Teams app package: tenant install state supports at least not-configured, install-pending, active, and error states.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F069",
|
|
"description": "Teams app package: setup surfaces can retrieve the tenant's current package/install metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F070",
|
|
"description": "Teams app package: bot IDs, app IDs, and package metadata are stored with the Teams integration record as needed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F071",
|
|
"description": "Teams app package: environment-specific base URLs are generated correctly for local, staging, and production packaging flows.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F072",
|
|
"description": "Teams app package: changing the selected Teams profile invalidates stale package/install readiness state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F073",
|
|
"description": "Teams app package: setup surfaces can present a package download or install handoff for the tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F074",
|
|
"description": "Teams app package: deep-link targets used by notifications and action results stay consistent with the manifest capabilities.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F075",
|
|
"description": "Teams identity: Teams authentication uses the tenant-selected Microsoft profile instead of an unrelated global Microsoft credential path.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F076",
|
|
"description": "Teams identity: tab SSO resolves PSA tenant and MSP user context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F077",
|
|
"description": "Teams identity: bot SSO resolves PSA tenant and MSP user context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F078",
|
|
"description": "Teams identity: message extension SSO resolves PSA tenant and MSP user context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F079",
|
|
"description": "Teams identity: only MSP users are accepted into Teams flows in v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F080",
|
|
"description": "Teams identity: client-portal users are rejected from Teams flows in v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F081",
|
|
"description": "Teams identity: Teams-authenticated requests reuse existing NextAuth/MSP SSO user resolution patterns where possible.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F082",
|
|
"description": "Teams identity: missing, inactive, or unready selected profiles block Teams auth with admin-readable remediation state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F083",
|
|
"description": "Teams identity: user mapping can associate a Teams user identity to the correct PSA user within the tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F084",
|
|
"description": "Teams identity: requests from the wrong Microsoft / Teams tenant are rejected for the PSA tenant.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F085",
|
|
"description": "Teams identity: deep-link entry points can bootstrap the destination without a separate PSA sign-in prompt inside Teams.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F086",
|
|
"description": "Teams identity: expired or invalid sessions return a Teams-safe reauthentication path instead of raw OAuth errors.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F087",
|
|
"description": "Teams identity: tenant resolution works correctly for Teams entry points across multiple vanity hosts or tenant slugs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F088",
|
|
"description": "Teams identity: rebinding Teams to a new Microsoft profile invalidates stale auth assumptions for future requests.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F089",
|
|
"description": "Teams identity: authorization checks still run after Teams authentication before entity access is granted.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F090",
|
|
"description": "Teams identity: the selected profile takes precedence over broad app/global Microsoft env credentials for Teams-specific flows.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F091",
|
|
"description": "Teams identity: Teams surface handlers can distinguish unauthenticated, unauthorized, and not-configured tenant states.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F092",
|
|
"description": "Teams identity: Teams-facing auth errors remain safe to show inside Teams UI constraints.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Security / Permissions",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F093",
|
|
"description": "Personal tab: a Teams personal tab entry point exists for PSA.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F094",
|
|
"description": "Personal tab: the default landing view opens a PSA \u201cmy work\u201d style starting point for technicians.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F095",
|
|
"description": "Personal tab: deep links can open a specific ticket view.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F096",
|
|
"description": "Personal tab: deep links can open a specific project task view.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F097",
|
|
"description": "Personal tab: deep links can open a specific approval view.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F098",
|
|
"description": "Personal tab: deep links can open a specific time-entry-related workflow view.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F099",
|
|
"description": "Personal tab: deep links can open related contact or client context when invoked from Teams message workflows.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F100",
|
|
"description": "Personal tab: the initial tab load shows enough record context to confirm the user landed on the intended PSA entity.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F101",
|
|
"description": "Personal tab: inaccessible or deleted entities fall back to a safe PSA landing state with an explanatory message.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F102",
|
|
"description": "Personal tab: the tab offers an \u201copen in full PSA\u201d path when the user needs richer context or unsupported functionality.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F103",
|
|
"description": "Personal tab: the Teams tab preserves PSA authorization semantics for every rendered entity or action.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F104",
|
|
"description": "Personal tab: the tab prefers reusing existing PSA screens/components instead of building parallel Teams-only record UIs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F105",
|
|
"description": "Personal tab: Teams bootstrap passes user and tenant context into existing PSA UI composition safely.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F106",
|
|
"description": "Personal tab: activity-feed notification deep links open the correct tab destination.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F107",
|
|
"description": "Personal tab: bot action results can open the correct tab destination.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F108",
|
|
"description": "Personal tab: message extension results can open the correct tab destination.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F109",
|
|
"description": "Personal tab: the landing experience handles cold-start setup or not-configured tenants gracefully.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F110",
|
|
"description": "Personal tab: the tab remains the escalation path for workflows that are too complex for cards or dialogs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F111",
|
|
"description": "Teams action layer: a shared Teams action registry exists for bot commands, message-extension actions, and card/dialog submits.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F112",
|
|
"description": "Teams action layer: each supported action declares its required inputs and target entity types.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F113",
|
|
"description": "Teams action layer: shared entity resolvers handle tickets, tasks, contacts, approvals, and time-entry targets.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F114",
|
|
"description": "Teams action layer: shared authorization checks wrap the underlying PSA services or server actions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F115",
|
|
"description": "Teams action layer: shared result mappers return Teams-safe summaries, buttons, and deep links.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F116",
|
|
"description": "Teams action layer: validation errors use one consistent response shape across bot, message extension, and cards/dialogs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F117",
|
|
"description": "Teams action layer: action execution records the invoking surface so downstream PSA behavior can distinguish bot, message extension, and tab contexts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F118",
|
|
"description": "Teams action layer: deep-link generation reuses existing PSA deep-link helpers instead of building Teams-specific URL logic.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F119",
|
|
"description": "Teams action layer: actions can distinguish read-only lookups from mutating operations.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F120",
|
|
"description": "Teams action layer: actions reuse existing PSA ticket, task, approval, contact, and time-entry business operations where possible.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F121",
|
|
"description": "Teams action layer: actions can expose allowed-action metadata for a user and entity.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F122",
|
|
"description": "Teams action layer: Teams input payloads are normalized into PSA-ready requests before execution.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F123",
|
|
"description": "Teams action layer: duplicate card/dialog submissions can be handled safely without creating duplicate mutations.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F124",
|
|
"description": "Teams action layer: partial-failure results return user-readable remediation guidance.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F125",
|
|
"description": "Teams action layer: Teams capability gating can disable unsupported actions centrally.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F126",
|
|
"description": "Teams action layer: action definitions are reused instead of reimplementing each workflow per Teams surface.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements",
|
|
"Data / API / Integrations",
|
|
"Security / Permissions"
|
|
]
|
|
},
|
|
{
|
|
"id": "F127",
|
|
"description": "Personal bot: a Teams personal-scope bot exists for PSA.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F128",
|
|
"description": "Personal bot: a command router parses supported bot commands.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F129",
|
|
"description": "Personal bot: unsupported commands return a help-oriented response instead of silently failing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F130",
|
|
"description": "Personal bot: a welcome/help response lists the supported v1 commands.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F131",
|
|
"description": "Personal bot: bot responses can render buttons or cards that open the tab or quick actions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F132",
|
|
"description": "Personal bot: the bot respects tenant-level allowed-action configuration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F133",
|
|
"description": "Personal bot: explicit entity references in commands are resolved consistently.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F134",
|
|
"description": "Personal bot: unsupported non-personal contexts return a clear \u201cpersonal scope only\u201d response for v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F135",
|
|
"description": "Personal bot command `my tickets`: returns the technician's relevant tickets.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F136",
|
|
"description": "Personal bot command `my tickets`: response items include enough summary data to act or click through.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F137",
|
|
"description": "Personal bot command `my tickets`: response items include deep links into the Teams tab or PSA web app.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F138",
|
|
"description": "Personal bot command `ticket <id>`: returns a ticket summary for a valid ticket reference.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F139",
|
|
"description": "Personal bot command `ticket <id>`: returns a clear not-found or not-authorized response for invalid references.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F140",
|
|
"description": "Personal bot command `assign ticket`: supports assigning a ticket to a technician.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F141",
|
|
"description": "Personal bot command `assign ticket`: can resolve the target ticket from command input or current bot workflow context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F142",
|
|
"description": "Personal bot command `assign ticket`: can resolve the target assignee from available PSA users.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F143",
|
|
"description": "Personal bot command `assign ticket`: returns the updated assignment summary after success.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F144",
|
|
"description": "Personal bot command `add note`: supports appending an internal note to a target ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F145",
|
|
"description": "Personal bot command `add note`: can resolve the target ticket from explicit input or current workflow context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F146",
|
|
"description": "Personal bot command `add note`: returns the saved note result and deep link after success.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F147",
|
|
"description": "Personal bot command `reply to contact`: supports adding a customer-facing reply for a target ticket/contact context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F148",
|
|
"description": "Personal bot command `reply to contact`: can prefill or resolve the ticket/contact context before submit.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F149",
|
|
"description": "Personal bot command `reply to contact`: returns the reply result and follow-up deep link after success.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F150",
|
|
"description": "Personal bot command `log time`: supports creating a time entry against a ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F151",
|
|
"description": "Personal bot command `log time`: supports creating a time entry against a project task.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F152",
|
|
"description": "Personal bot command `log time`: collects minimal duration, note, and work-context data.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F153",
|
|
"description": "Personal bot command approvals: returns the technician's pending approvals.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F154",
|
|
"description": "Personal bot command approvals: can execute approve/reject or request-change actions for supported approval items.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F155",
|
|
"description": "Message extension: a Teams message extension exists for PSA.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F156",
|
|
"description": "Message extension: search commands can look up PSA tickets.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F157",
|
|
"description": "Message extension: search commands can look up PSA tasks.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F158",
|
|
"description": "Message extension: search commands can look up PSA contacts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F159",
|
|
"description": "Message extension: search commands can look up approval-related work items needed for v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F160",
|
|
"description": "Message extension: search commands work from compose and command-box contexts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F161",
|
|
"description": "Message extension: action commands work from message context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F162",
|
|
"description": "Message extension: search queries remain tenant-scoped.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F163",
|
|
"description": "Message extension: search queries respect the invoking user's PSA permissions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F164",
|
|
"description": "Message extension: search results support pagination or continuation for longer result sets.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F165",
|
|
"description": "Message extension: search results show compact summary information appropriate to Teams.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F166",
|
|
"description": "Message extension: search results include deep links to open the selected record in the Teams tab or PSA web app.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F167",
|
|
"description": "Message extension: search results can surface allowed quick actions where supported.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F168",
|
|
"description": "Message extension: unsupported message types or contexts return a clear, recoverable response.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F169",
|
|
"description": "Message extension: the extension is unavailable when the tenant Teams integration is not active.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F170",
|
|
"description": "Message extension: the extension respects tenant-level allowed-action configuration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F171",
|
|
"description": "Message extension: Teams-authenticated context is available to search and action commands.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F172",
|
|
"description": "Message extension: users can open a matching ticket directly from search results.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F173",
|
|
"description": "Message extension: users can open a matching task directly from search results.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F174",
|
|
"description": "Message extension: users can open a matching contact or approval directly from search results when permitted.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F175",
|
|
"description": "Message extension: command definitions remain focused on lookup and message-driven actions rather than general chat.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F176",
|
|
"description": "Message extension: result rendering reuses the shared Teams action/result model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F177",
|
|
"description": "Message extension: command invocation records which surface triggered the action for downstream processing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F178",
|
|
"description": "Message extension: search behavior prefers existing PSA data-access patterns rather than Teams-specific record indexes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F179",
|
|
"description": "Message action `create ticket from message`: supports creating a new PSA ticket from a Teams message.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F180",
|
|
"description": "Message action `create ticket from message`: captures subject/summary/body data from the Teams message context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F181",
|
|
"description": "Message action `create ticket from message`: supports minimal admin-approved ticket fields such as board, status, and client/contact context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F182",
|
|
"description": "Message action `create ticket from message`: stores Teams source-message reference metadata with the created work item.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F183",
|
|
"description": "Message action `create ticket from message`: confirms success with a deep link to the created ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F184",
|
|
"description": "Message action `create ticket from message`: guards against duplicate submit behavior.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F185",
|
|
"description": "Message action `update from message`: supports targeting an existing ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F186",
|
|
"description": "Message action `update from message`: supports targeting an existing task when appropriate.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F187",
|
|
"description": "Message action `update from message`: supports appending an internal note derived from the Teams message.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F188",
|
|
"description": "Message action `update from message`: supports appending a customer-visible reply when the user has permission and the record state allows it.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F189",
|
|
"description": "Message action `update from message`: stores Teams source-message reference metadata with the update.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F190",
|
|
"description": "Message action `update from message`: confirms success with a deep link to the updated record.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F191",
|
|
"description": "Message action `update from message`: validates target-record permission before mutating PSA data.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F192",
|
|
"description": "Message action `update from message`: supports dialog handoff when more fields are needed than fit a one-click action.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F193",
|
|
"description": "Message action `update from message`: prefills action forms from the selected Teams message context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F194",
|
|
"description": "Message action `create ticket from message`: can hand off to a richer tab flow when the selected message needs more complex ticket creation context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F195",
|
|
"description": "Message action `update from message`: can hand off to the personal tab when the mutation is too complex for a dialog.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F196",
|
|
"description": "Message-driven actions: both create and update flows reuse the shared Teams action layer instead of bespoke handlers.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F197",
|
|
"description": "Quick actions: a shared adaptive-card/dialog submission path exists for Teams quick actions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F198",
|
|
"description": "Quick actions: assign-ticket cards/dialogs collect the minimum required assignee and note inputs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F199",
|
|
"description": "Quick actions: add-note cards/dialogs collect the minimum required note inputs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F200",
|
|
"description": "Quick actions: reply-to-contact cards/dialogs collect the minimum required reply inputs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F201",
|
|
"description": "Quick actions: log-time cards/dialogs collect the minimum required time-entry inputs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F202",
|
|
"description": "Quick actions: approval cards/dialogs collect approval outcome and optional comment inputs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F203",
|
|
"description": "Quick actions: forms can prefill fields from the invoking entity or Teams message context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F204",
|
|
"description": "Quick actions: forms validate required fields before submission.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F205",
|
|
"description": "Quick actions: forms submit through the shared Teams action layer.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F206",
|
|
"description": "Quick actions: forms return success confirmations in Teams after submit.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F207",
|
|
"description": "Quick actions: forms return recoverable validation or state errors in Teams after submit.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F208",
|
|
"description": "Quick actions: forms support cancel/dismiss without side effects.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F209",
|
|
"description": "Quick actions: users only see quick actions they are allowed to perform.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F210",
|
|
"description": "Quick actions: the UI can redirect the user into the tab when the action exceeds quick-action complexity limits.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"UX / UI Notes",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F211",
|
|
"description": "Teams notifications: a Teams delivery channel exists alongside existing PSA notification generation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F212",
|
|
"description": "Teams notifications: tenant Teams setup stores category preferences for supported personal notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F213",
|
|
"description": "Teams notifications: Teams delivery reuses existing notification payload generation rather than introducing a separate trigger catalog.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F214",
|
|
"description": "Teams notifications: Teams delivery reuses existing PSA deep-link resolution rather than building a second link system.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F215",
|
|
"description": "Teams notifications: recipient resolution can map an eligible PSA MSP user to a Teams user identity.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F216",
|
|
"description": "Teams notifications: delivery only targets users who have a valid Teams linkage/setup state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F217",
|
|
"description": "Teams notifications: assignment-related events can trigger personal activity-feed notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F218",
|
|
"description": "Teams notifications: customer-reply events can trigger personal activity-feed notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F219",
|
|
"description": "Teams notifications: approval-request events can trigger personal activity-feed notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F220",
|
|
"description": "Teams notifications: escalation events can trigger personal activity-feed notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F221",
|
|
"description": "Teams notifications: SLA-risk events can trigger personal activity-feed notifications.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F222",
|
|
"description": "Teams notifications: payloads include enough title/body/entity context to identify the work item in Teams.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F223",
|
|
"description": "Teams notifications: payloads include deep links to the exact PSA record or workflow destination.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F224",
|
|
"description": "Teams notifications: category disablement at the tenant level suppresses Teams delivery for that category.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F225",
|
|
"description": "Teams notifications: missing user linkage suppresses Teams delivery without breaking the underlying PSA event.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F226",
|
|
"description": "Teams notifications: delivery state is captured in a reusable sent/delivered/failed model where available.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F227",
|
|
"description": "Teams notifications: clicking a notification opens the intended Teams tab or PSA web deep link destination.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F228",
|
|
"description": "Teams notifications: no queue-to-channel or board-to-channel mapping is required in v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F229",
|
|
"description": "Teams notifications: Teams delivery remains personal-notification-only in v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F230",
|
|
"description": "Teams notifications: the existing event bus/workflow infrastructure remains the notification trigger source.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Users and Primary Flows",
|
|
"Requirements",
|
|
"Data / API / Integrations"
|
|
]
|
|
},
|
|
{
|
|
"id": "F231",
|
|
"description": "Permissions: only authorized tenant admins can manage Microsoft profiles and Teams setup.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F232",
|
|
"description": "Permissions: tab, bot, message extension, and quick actions all enforce existing PSA authorization rules for the target entity/action.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F233",
|
|
"description": "Permissions: read-only users cannot execute mutating Teams actions.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F234",
|
|
"description": "Permissions: records outside the user's tenant or scope never appear in Teams search or lookup results.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F235",
|
|
"description": "Compatibility: migrating to named Microsoft profiles preserves current email, calendar, and MSP SSO behavior.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F236",
|
|
"description": "Compatibility: a default Microsoft profile binding exists immediately after migration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F237",
|
|
"description": "Compatibility: rebinding Teams to a different Microsoft profile does not silently rebind unrelated Microsoft consumers.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F238",
|
|
"description": "Compatibility: archiving the currently selected Teams profile is blocked until Teams is rebound or deactivated.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F239",
|
|
"description": "Compatibility: deleting the currently selected Teams profile is blocked until Teams is rebound or deactivated.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F240",
|
|
"description": "Compatibility: switching the selected Teams profile invalidates stale Teams auth or install readiness state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F241",
|
|
"description": "Permissions: client-portal user sign-in attempts are rejected explicitly for Teams v1.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F242",
|
|
"description": "Fallback: a tenant without Teams install/setup receives guided readiness messaging instead of raw errors in Teams surfaces.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F243",
|
|
"description": "Fallback: unsupported bot contexts return a clear personal-scope guidance response.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F244",
|
|
"description": "Fallback: unsupported commands return a help response rather than a dead end.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F245",
|
|
"description": "Fallback: selected profiles missing required Teams setup or consent show actionable admin remediation state.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F246",
|
|
"description": "Fallback: Teams actions are unavailable when the selected profile or Teams integration is inactive.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F247",
|
|
"description": "Fallback: both bot and message extension respect the tenant's allowed-action configuration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
},
|
|
{
|
|
"id": "F248",
|
|
"description": "Compatibility: legacy singleton Microsoft settings APIs keep a migration-safe compatibility path while profile-based consumers are introduced.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Security / Permissions",
|
|
"Rollout / Migration",
|
|
"Requirements"
|
|
]
|
|
}
|
|
]
|