Security & Data Handling

Last updated: 1 October 2026

Your code is yours. Here is exactly what we see and keep.

Local-first by default. The developer tools and the installed Sofia app work on your machines. Sofia in Microsoft Teams and the company dashboard, TSE's LLM and the published index are options your admin turns on — and this page lists exactly what each one sends and keeps. We never store your source code.

This page describes how the Service works today. Our commitments to you are in the Terms of Service and, for company accounts, the Data Processing Agreement.

TSE-Assistant reaches your data in three different ways, and each handles it differently:

The sections below say, for each one, what stays with you, what reaches an AI model, and what we keep.

1. Developer tools in your IDE — on your developer's machine

For the person who approves software on developer machines or administers your GitHub organisation's Copilot policies: For IT administrators is the one-page version — what is installed, what leaves the machine, how to verify the installer, and the registry entry a GitHub Copilot Business or Enterprise organisation may need.

What happens on the machine. Setup builds the metadata index from your PackagesLocalDirectory on the developer's machine. The tools search, read and change your X++ on that machine, and builds, best-practice checks and tests run there too. Before any change, the agent keeps a backup of the file on that machine, encrypted on company seats.

What reaches an AI model. Whatever the tools return, X++ source included, goes to the AI model your IDE uses: GitHub Copilot in Visual Studio, VS Code or the Copilot CLI, Cursor, Claude Code or Claude Desktop. That happens under your agreement with that provider. We don't choose the model, and that traffic doesn't pass through us.

What we receive and keep.

2. The published index — company plans, for consultant and super-user seats

Consultant and super-user seats answer from a copy of the environment's index that a developer machine (the environment's producer) publishes. It is published only when the environment is set to "Publish index" on the dashboard; a new environment does not publish until an admin says so.

What it holds: the metadata of your custom models — objects and their structure, such as tables, fields, relations and methods — and the environment's label texts. That includes the text of Microsoft's standard labels, generated on your own machine from your licensed environment.

What it never holds: source code, code snippets, comments, usage examples or descriptions. The publish step refuses to upload an index that carries any of them.

Where it is kept: in your account's private storage area on our Azure storage in UK South. Only your account's seats can download it, and Sofia in the dashboard, Teams and Slack reads it on your behalf. The Microsoft standard half comes from a shared prebuilt we publish for every customer; it carries no source and no label text.

3. The installed Sofia app — on the consultant's or super-user's machine

What happens on the machine. Sofia runs on the machine and reads the downloaded published index. With live data connected, she also reads your environment through the person's own Microsoft sign-in, so your Dynamics 365 security applies to what she can see. On a consultant seat she can propose record changes and business operations, and nothing changes until the person confirms. A super-user seat never changes anything. Conversations and memories are kept on that machine.

What reaches an AI model. Each question goes to the model the seat uses, together with what the tools found, which can include record values from live data. The seat uses one of two routes:

4. Sofia in the dashboard, in Microsoft Teams and in Slack — hosted by us, when your admin switches it on

Off until your admin switches it on (Configuration → Sofia → "Enable Sofia in Teams, Slack and the Company dashboard"). Switched off, she answers every message in Teams, in Slack and on the dashboard with a sentence saying so; she stores nothing and nothing is charged. Switching it off later stops her at once, and what is already stored stays under the retention schedule (section 6). Your account owner can also delete all of your company's Sofia data at once, from the same place.

What she does. Sofia answers from the environment's published index — metadata, security objects and label texts. She doesn't read source code here. Without live data she changes nothing; with it (below) a consultant seat can have her propose a change, which happens only on that person's confirmation. A person must have a seat, and must have signed in to the dashboard once, before Sofia answers them in Teams; in Slack, the person signs in with their Microsoft work account once from the chat, which links their Slack user to their seat.

Live data in Teams, in Slack and on the Chat tab — off until your admin switches it on (Configuration → Sofia → "Live data in Teams, Slack and the Chat tab"). Switched on, Sofia also reads records from your environment, under each person's own D365 permissions: Teams signs the person in silently, the Chat tab and Slack ask once for a Microsoft sign-in, all against the TSE-Assistant Live Data app your organisation approved. The token Microsoft issues for that person is held in the Sofia service's memory, never written to disk, and the records Sofia reads go to the AI model and to the person, and nowhere else; every such answer says "read N rows from <entity> under your permissions — not stored". A consultant seat can also ask Sofia to propose a record change (create, update, delete) or an operation (an OData action, such as posting a journal). The proposal is shown with the records it touches, and nothing is written or run until that person clicks Apply — a delete or an operation also needs the word "confirm" typed; it then runs under the person's own D365 permissions, and our audit keeps a value-free record of it (the entity or action, the outcome — no record values). Super-user seats stay read-only. With this switch on, conversations in Teams, in Slack and on the Chat tab are no longer stored: they are held in the service's memory for the conversation only — the last 20 turns, gone after 30 minutes of quiet or an update of the service — and never reach our database or a backup (Teams and Slack keep their own copy of the chat in your organisation and your workspace). Your company's stored conversations, and the feedback records that quote an answer, are deleted the moment the switch goes on. Documents and memories are kept as before. Switching it off stores conversations again from the next message; what was held in memory is not written.

Where the model runs. Always on TSE's LLM: gpt-4.1-mini on our Azure OpenAI resource in UK South, or gpt-5.6-terra on OpenAI's API in the United States under OpenAI's API data terms. A new account's seats use gpt-4.1-mini until your admin allows the US model; your admin chooses which models seats may use, and the default.

What we keep, for your account and each person.

Storage. Sofia's data counts against your account's storage allowance, together with the published indexes (1 GB included; more in +2 GB packs), and your admins see how much each person's conversations, memories and documents take on the Storage tab. Above the allowance Sofia keeps answering, and only saving a new document waits until storage is added or data deleted.

Microsoft Teams. Messages reach Sofia through Microsoft's Bot Framework. A file you attach in Teams is downloaded by Sofia from Teams' own link, and only a text file's contents are kept, as part of your message. The chat itself also stays in Microsoft Teams, under your organisation's Teams settings: when a conversation is deleted on our side, our copy goes, not the chat in Teams.

Slack. Messages reach Sofia through Slack's Events API, each one signed by Slack and checked by us. Sofia answers in the thread of your message, and a file you attach in Slack is downloaded by Sofia from Slack's own link under the bot token your admin granted; only a text file's contents are kept, as part of your message. The chat itself stays in Slack, under your workspace's retention settings. Your admin's Disconnect revokes the token and forgets every person's link.

5. Microsoft standard code

Microsoft licenses the standard D365 F&O source to your environment. We never store it. What TSE-Assistant does with it:

6. What we keep, and for how long

A daily sweep deletes each record when its period ends. "While the account exists" means until the account's data is deleted, 90 days after it closes.

RecordWhat it containsKept
Account and seatsnames, e-mail addresses, Microsoft or GitHub account ids, roles, tiers, seat environmentswhile the account exists; deleted 90 days after the account closes, or earlier on request
Billingplan, seats, trial and renewal dates, Paddle customer and subscription ids (card details stay with Paddle)while the account exists, then as accounting law requires
Registration tokensa hash of the token, with the seat, tier and environments it registersexpire after 15 minutes; removed by the daily clean-up
Activation codes (individual plans)the code, the account and the plan chosenuntil redeemed; unredeemed codes expire after 24 hours and go at the daily clean-up
Machines (company plans)host name, Windows user name, machine id, agent version, index status, check-in timesuntil an admin revokes the machine (uninstalling does not), then 14 days; a developer install that never checks in, 48 hours
Individual licencesthe licence, the plan and a one-way hash of the machine it is bound towhile the account exists
Trial checks (individual plans)a one-way hash of a machine's identifiers and the account that used a trial on it24 months after the trial
Licence revocationsa refunded or charged-back licence's identity, so it cannot start a new trial24 months
Admin actionsprivileged dashboard actions, such as an ownership change: who, what, when6 years, including after the account is deleted
Audit records (company plans)tool, seat, time, argument fingerprint, response size; change events add object and model namesreads 90 days, changes 180 days
Published indexcustom-model metadata without source; the environment's label textswhile the environment publishes; when it stops, the published copy is retired and deleted 7 days later (restorable until then), together with the copy Sofia composes from it; the account's standard label-text pack once no environment publishes; all of it within 90 days of the account closing
Team instructions and configurationwhat your admins write for your teamwhile the account exists
Sofia conversationsyour messages (with attached file text) and Sofia's answerswhile live data in Teams, Slack and the Chat tab is off: 12 months after the last message, or when you delete them — each conversation has a delete button
Sofia conversations (live data on)your messages and Sofia's answers in Teams, in Slack and on the Chat tab, which can quote records read under your own permissionsnever stored — held in memory for the conversation (the last 20 turns, gone after 30 minutes of quiet or an update of the service); the company's stored conversations and feedback records are deleted when the switch goes on
Answer feedbackyour 👍 or 👎 on one of Sofia's answers, with the question, the answer, the tools and the model it names, so we can improve her12 months after the verdict, or when you delete the conversation or take the verdict back; none is recorded while live data in Teams, Slack and the Chat tab is on
Live-data sign-in tokenthe token Microsoft issues for you to the TSE-Assistant Live Data app, and the ones exchanged from it for your environmentsnever stored — held in the Sofia service's memory, dropped after 12 hours without a read, or when you disconnect
Sofia memorieswhat you asked Sofia to rememberuntil you forget them (at most 200; past that the oldest drop out)
Sofia documentsthe documents Sofia wroteuntil their author or your account owner deletes them
Model choicethe model each person pickedwhile the account exists
Teams chat linkTeams' reference to the chat and to you, and the chosen environmentdeleted with its conversation
Slack workspace and person linksthe workspace's id and name, the bot token your admin granted (encrypted), who connected it and when; each linked person's Slack user id against their seatuntil your admin disconnects the workspace, or the person sends /sofia unlink; the thread's reference is deleted with its conversation
Model usageper call: seat, model, tokens, cost — never the prompt12 months
Sofia credit purchasesthe Paddle transaction reference and the amountas the billing records
Security eventsrefused requests and tamper signals (for example a modified bundle or a changed producer): time, kind, account, machine, IP address12 months
Mail we sendrecipients, subject, delivery status90 days
Payment notificationsPaddle's event ids, types, dates and outcomes — no payment details12 months; the latest one per subscription while the account exists
Data protection requeststhe reference, when it arrived, how it was answered (our log, outside the Service)2 years after it is closed; a complaint's, 6 years
Relay snippetyour own custom-model code passed from your dev box to your consultant's app for one request (off until your admin switches it on)never stored — held in memory for that request

Memories, documents, model choices, the published index and every other row above that says "while the account exists" go when the account's data is deleted, 90 days after it closes — except the billing records and credit purchases, which follow accounting law. Our database backups are kept for 7 days, so a deleted record leaves them within 7 days; our service logs are kept 30 days.

7. Isolation, access and licensing

8. Transport and storage security

9. Responsible disclosure

Found something? Please write to security@tse-assistant.com. We welcome good-faith security research and will work with you on any valid finding. Good faith means: you don't access, change or delete data that isn't yours, you don't disrupt the Service or other customers, and you report promptly and give us reasonable time to fix before you publish.