Actions and results
What each AI Assistant button and automatic behaviour does, with worked numbers and what the system refuses.
On this page (13)
Assistant landing page
| Action | When | What you do | What happens |
|---|---|---|---|
| Landing page loads for a normal user | Test user with ai.use and a sales role; built-in engine | Open AI Assistant | Greeting with your name; capability and module cards; 'Try these' chips; MCP badge shows connected/total; Your access lists the tools you can use; Recent chats (up to 12, pinned first) |
| First use seeds the company | A fresh test company that never opened the assistant | Open AI Assistant; then Agents, MCP Servers, Knowledge | Settings row created; 16 standard agents (General, Sales, Purchase, Inventory, Accounting, Bank Reconciliation, HR, Payroll, Projects, Omnichannel, Marketing, Fleet, Manufacturing, CRM, Reporting, Admin); the a2NSoft ERP server Connected with its tools; 'a2NSoft User Guide' collection with one indexed document; 6 shared saved prompts |
Conversation
| Action | When | What you do | What happens |
|---|---|---|---|
| Ask a question answered from your own data | 3 posted test sales invoices this month: AED 1,000, 2,500 and 4,000 (total 7,500) | Ask 'Show sales this month' | Status 'Adding up sales'; answer gives total AED 7,500.00 from 3 invoices with a table; figures match Reporting for the same period; nothing from another company |
| Group sales by customer | Invoices above: Customer A 1,000 + 2,500; Customer B 4,000 | Ask 'Show sales this month by customer' | Table: Customer A 3,500.00, Customer B 4,000.00; total 7,500.00 |
| Overdue invoices with a threshold | Posted invoices: INV-A AED 12,000 due 10 days ago with 3,000 paid; INV-B AED 15,000 due 40 days ago unpaid; INV-C AED 11,000 due tomorrow | Ask 'Show overdue invoices above AED 10,000' | The filter uses the amount still owed: INV-A 9,000 left (below 10,000) excluded, INV-C not yet due excluded; 'Found 1 overdue invoices of AED 10,000.00 or more, AED 15,000.00 outstanding in all.'; KPI Oldest 40 days |
| Explain a document by number | A posted invoice INV-00032 | Ask 'Explain INV-00032' | Record card with partner, dates, total, paid/outstanding and lines; an 'Open' action links to the document |
| Ambiguous name asks back | Two customers 'Gulf Retail LLC' and 'Gulf Retail Trading' | Ask 'Show the card for Gulf Retail' | Error block 'I found 2 customers matching "Gulf Retail". Which one?' with both as candidates; picking one answers; it never picks on its own |
| Unknown record | Ask 'Show the card for ZZZ Nobody' | 'No active customer matches "ZZZ Nobody".' with the suggestion to check spelling; nothing created | |
| Stock questions | Product LAPTOP-T with 7 on hand, reorder level 10 | Ask 'Show low stock' then 'Stock of LAPTOP-T' | Low stock lists LAPTOP-T (7 against 10); stock answer gives 7 per warehouse |
| Pending approvals | User holds hr.employee.manage and journal.approve; 2 pending leave requests, 1 submitted journal | Click chip 'List pending approvals' | '3 items waiting for your approval.' table with Type, Reference, Requested by, Amount; types you cannot approve are not listed |
| My own profile and leave | Login linked to a test employee with 30 days annual leave, 5 taken | Ask 'What is my leave balance?' | Record card 'You · <number>' with position, department, manager; leave table Annual 25 days; only your own record |
| Login not linked to an employee | Test user without an employee link | Ask 'my leave balance' | 'Your login is not linked to an employee record.' with the hint to link it in Administration > Users > Employee |
| Profit and loss | User with report.view; posted revenue 50,000, expenses 32,000 this month | Ask 'Profit and loss this month' | Revenue 50,000.00, costs 32,000.00, net profit 18,000.00 - same as Reporting > Profit & Loss |
| Built-in engine help | Built-in engine | Ask 'tell me a joke' | Help text listing what it understands ('Show today's sales...', 'Explain INV-00032'...) plus the line about configuring a model |
| Smart routing saves the model | Claude engine with a test key; Token saving = Smart | Ask 'Show low stock' then ask 'Which of those is the biggest?' | First answer model 'a2N built-in' (Usage: Answered without the model +1, no tokens); the follow-up goes to Claude (tokens counted) |
| Arabic question goes to the model | Claude engine; Smart | Ask 'اعرض المبيعات هذا الشهر' | Not answered by the built-in engine; Claude answers in Arabic; amounts and 'AED' kept exactly as the tools gave them |
| Response language | Settings language = Arabic; composer language Auto | Ask in English 'Show overdue invoices' | Answer written in Arabic; switch composer to English and ask again -> English (composer wins) |
| Model outage | Claude engine with an invalid test key | Ask any free-form question | Message 'The AI assistant is temporarily unavailable. Your ERP remains fully available.' with a Retry; the ERP screens keep working |
| Stop while answering | Claude engine | Ask a long question; press Stop | Streaming stops; the composer is free again; no proposal half-made |
| Rate limit per user | Settings Messages per minute = 3 | Send 4 messages within one minute | 4th refused: 'You are sending messages faster than the company allows. Wait a moment and try again.'; after a minute it works |
| Rename, pin, archive | An existing chat | More > Rename to 'Oct review'; Pin; Archive; open Archived chats | Title saved (160 max); chat in Pinned; archived chat leaves Recent and shows under Archived chats |
| Delete a chat | Chat A with only questions; chat B where a proposal was confirmed | Delete chat A; Delete chat B | A disappears with its messages and unconfirmed proposals; B is archived instead (evidence kept) and still in the activity log |
| Duplicate a chat | A chat with a confirmation card | More > Duplicate | New chat '<title> (copy)', private, same messages; confirmation cards are NOT copied |
| Export | A chat with a table answer | Export as Markdown; Export as text; Print / save as PDF | Files '<title>.md' / '.txt' with You / a2N Assistant and time per message; tables up to 200 rows; print dialog opens |
| Feedback | An answer | Click Not helpful, choose 'wrong_record'; then Helpful | Stored; Usage feedback counts update (down then up) |
| Advanced mode trace | An answer that used tools | More > Advanced mode (trace) | Steps show tool label, status and ms (e.g. 'Reading invoices · ok · 120 ms'); never the model's reasoning |
| Read aloud | Click Read aloud on an answer; then Stop reading | Answer is spoken in the chosen language; if no voice exists: 'No voice for this language on this device' |
Composer
| Action | When | What you do | What happens |
|---|---|---|---|
| Attach a file and ask | A CSV with columns Customer, Amount and rows 1,200.50 / 800 / 999.50 | Plus > Upload file; ask 'Summarize this file' | Columns listed; 'Totals of the first rows: Amount 3,000.00'; table of the first 20 rows; file appears in My Files linked to this chat |
| Attach an ERP record | A test customer | Plus > Customer; pick it; ask 'What does this customer owe?' | Answer about that customer only (outstanding and overdue) |
| Screenshot | Chrome | Plus > Take screenshot; choose a window | Image attached; cancel the picker -> 'The screenshot was cancelled.' |
| Dictation | Chrome with a microphone | Click Voice; speak 'show low stock'; right-click Voice and choose Arabic | 'Listening... speak now, then edit and send.'; words appear in the box for editing; not sent automatically; Firefox: 'This browser cannot transcribe speech. Try Chrome or Edge.' |
Confirmation card
| Action | When | What you do | What happens |
|---|---|---|---|
| Propose a customer | User with ai.act and partner.manage | Ask 'Create a customer named Test Gulf Retail with email test@example.com' | Card 'Create customer': Name, Role customer, Market business, Email, Phone -, Payment days 0; status 'Waiting for you'; NO customer exists yet in Contacts |
| Confirm a customer | The card above | Click Confirm & Create | Card turns 'Done' with 'Test Gulf Retail created' and its code; Open contact works; activity log shows the tool with records; action status executed with your name as confirmer |
| Duplicate customer refused at proposal | Test Gulf Retail exists | Ask again to create 'test gulf retail' | No card: 'Test Gulf Retail already exists as <code>.' with 'Open the existing record instead of creating a duplicate.' |
| Propose and confirm a quotation | Customer Test Gulf Retail; Laptop price 3,500, Mouse price 45, both 5% VAT | Ask 'Create a quotation for Test Gulf Retail with 5 x Laptop, 2 x Mouse'; check card; Confirm | Card lines: Laptop 5 x 3,500.00 = 17,500.00; Mouse 2 x 45.00 = 90.00; Estimated untaxed AED 17,590.00. After confirm: draft quotation created, total incl. tax AED 18,469.50; card shows the number and 'Open quotation' |
| Price override on a line | As above | Ask 'Create a quotation for Test Gulf Retail with 3 x Laptop at 3,200' | Line 3 x 3,200.00 = 9,600.00; draft saved with that price after confirm |
| Quotation without lines | Ask 'Create a quotation for Test Gulf Retail' | No card; reply asks 'Which products and quantities should the quotation have? For example...' | |
| Zero quantity refused | Ask for a purchase order with '0 x Laptop' (Claude engine) | Refused: 'The quantity for Laptop must be more than zero.'; no card | |
| Purchase order | Supplier Test Supplier; Laptop cost 3,000 | Ask 'Create a purchase order to Test Supplier with 4 x Laptop'; Confirm | Card untaxed 12,000.00 (product cost used); confirmed -> draft purchase order; nothing posted, no stock moved |
| Cancel a proposal | A waiting card | Click Cancel | Card 'Cancelled'; nothing created; Confirm no longer offered |
| Double click lands once | A waiting quotation card | Click Confirm & Create twice quickly (or send the confirm call twice) | Exactly ONE draft quotation is created; second call returns the same result |
| Proposal expires after 24 hours | A card proposed more than 24 hours ago (test DB time shift or wait) | Click Confirm & Create | Refused 'This proposal expired. Ask again for a fresh one.'; nothing created; action status rejected with 'Expired after 24 hours.' |
| Permission removed between proposal and confirm | Card proposed by user U; admin then removes partner.manage from U's role | U clicks Confirm & Create | Card 'Failed' with 'You no longer have permission for this action.'; no record created |
| ai.act removed between proposal and confirm | Card waiting; remove ai.act from the role | Confirm | Refused (403 / no permission); nothing created |
| Write actions switched off after proposal | Card waiting; Settings > Write actions enabled off | Confirm | Refused 'Write actions are switched off in AI Settings.'; nothing created |
| Edit a proposal | A waiting card | Click Edit; complete 'Change the proposal: make it 6 x Laptop'; send | A new card with the changed line; the old one stays waiting (cancel it) - only the confirmed one creates a record |
| CRM lead propose and update | User with crm.manage | Ask 'Create a lead for Test Co, expected value 25,000'; confirm; then 'Update CRM-xxxx expected value to 30,000'; confirm | Lead created; update card shows the change; confirmed -> 30,000; if somebody edited the lead in between, the save is refused (revision check) |
| Role without ai.act | A Viewer-role test user (ai.use only) | Ask 'Create a customer named X' | Reply 'Your role may use the assistant but not ask it to make changes.'; no card |
Live voice
| Action | When | What you do | What happens |
|---|---|---|---|
| Live voice conversation | Settings: Voice + Live on, a TEST Google key; Chrome with microphone | Click Live; say 'What are today's sales?'; interrupt while it speaks; End | Connecting -> Listening; 'Checking the ERP...'; spoken answer with the same figures as the typed answer; question and answer saved in the chat; interrupting stops speech |
| Live not set up | No Google key saved | Click Live | 'Live voice is not set up. An administrator adds a Google Gemini key in AI Settings > Live voice.' |
| Live confirmation stays a card | Live voice running | Say 'Create a customer named Test Voice LLC' | Spoken reply says a confirmation card is on screen; nothing saved until you click Confirm & Create |
Knowledge
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a collection and add a typed document | ai.configure | New collection 'HR policies (test)', Company; Add document: title 'Annual leave', paste 3 paragraphs (~3,000 characters); Add and index | 'Indexed.'; document Search ready with 3 passages (about 1,200 characters each, cut at paragraph ends) |
| Upload a document | A PDF with text | Add document; choose the PDF; leave title blank | Title = file name; Source = file name; passages counted; status Search ready |
| Search and cite | Document above mentions 'gratuity' once and 'leave' often | Search 'gratuity leave'; then in chat ask 'What is our gratuity rule?' | Passage with 'gratuity' ranks first (rarer word weighs more); chat answer shows a Sources block with the document title and collection |
| Delete document and collection | Remove a document; Delete the collection (confirm) | Document and its passages gone (search no longer finds it); collection and all its documents gone | |
| Knowledge switched off | Settings > Knowledge enabled off | Ask in chat 'What is the leave policy?' | The knowledge tool is not used (no Sources block); record whether the Knowledge screen search still answers |
My Files
| Action | When | What you do | What happens |
|---|---|---|---|
| Upload, preview, rename, share | Upload test-sales.csv; open it; Rename; Share; Make private | Preview shows rows and column count; name changes; visibility company then private | |
| Archive and restore | Archive a file; switch to Archived; Restore | Hidden from the main list, shown under Archived, back after Restore | |
| Delete a file | Your own file not used in knowledge | Delete (confirm 'Delete this file permanently?') | Removed from the list; a knowledge file is refused: 'This file is in the knowledge base. Remove it there first.' |
| Download | Download a file | Saved with a safe name; the browser does not open it inline (nosniff) | |
| Use in chat | Use in chat on a file | Chat opens with the file attached in the composer | |
| Formulas and macros not run | An .xlsx with =SUM() cells and a .xlsm with a macro (test files) | Upload both; preview | Values read as stored, formulas not evaluated, macro never runs |
Agents
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a custom agent | ai.configure | New agent 'Collections Agent', code blank; Allowed tools: overdue_invoices, get_customer; Save | 'Agent saved.'; code 'collections_agent'; tile Custom agent; 'Tools you can use' = 2 (or fewer if your role lacks one) |
| Effective tools = user's permissions intersected with the agent's list | Agent allows search_employees; user without hr.employee.view | Pick the agent in chat; ask 'search employees Test' | 'You don't have permission to see that, so I can't answer it.' - the agent never widens access |
| Blocked tool | Sales Agent with create_quotation blocked | In chat with Sales Agent ask for a quotation | 'The Sales Agent agent isn't allowed to use that. Try the General ERP Agent.' |
| Test console | Test console: 'Show overdue invoices above 5000' and 'Create customer Test' | Trace: overdue_invoices ok with result text; create_customer 'would propose (confirmation required)'; a tool outside the agent 'not allowed for this agent or user'; no record written | |
| Disable and delete | Disable a standard agent; try Delete on it; delete a custom agent | Disabled agent leaves the composer list (chats fall back to General); standard: no Delete button, API -> 'A standard agent can be disabled, not deleted.'; custom deleted | |
| Max steps | Claude engine; agent Max steps 1 | Ask a question needing two tools (e.g. a customer's card and then their overdue invoices) | Stops after one tool round; answer may be partial - no crash |
MCP Servers
| Action | When | What you do | What happens |
|---|---|---|---|
| Built-in server tools | Open a2NSoft ERP server > Tools | Every ERP tool listed with domain, risk, approval policy, calls, errors; read tools NEVER_REQUIRE_CONFIRMATION, writes CONFIRM_EVERY_TIME | |
| Switch off a built-in tool | Switch off overdue_invoices; in chat ask 'show overdue invoices' | Tool not used: the agent says it is not allowed; switch it on again -> works | |
| Add an outside server with the wizard | A test MCP server reachable over HTTPS | Add server: Custom API; name, URL; Bearer + test token; Save & test; Discover tools; enable one read tool; assign one agent; Activate | Connected with server name/version; tools discovered start OFF; write tools marked MEDIUM/HIGH; after Activate status Connected; log rows 'created', 'enabled', 'test' |
| Failing connection | Wrong URL or wrong token | Save & test | Step 'Test connection' shows ERROR: HTTP ... or AUTH_REQUIRED; Try again offered; Logs show the error; health 'Last failure' set |
| Use an outside read tool in chat | Server active, one read tool on, Claude engine | Ask something only that tool answers | Block titled '<server> · <tool>' with its text; activity log server column = that server |
| Outside write tool refused | Outside tool without readOnlyHint, switched on | Ask the model to use it | Refused '<tool> on <server> changes data and needs an approval flow that external tools do not have yet.' |
| Test tool runner | Server detail > Tools > Test tool on a read tool with {"query":"Test"} | Output shown; calls +1; runs with your own permissions | |
| Delete an outside server | Delete (confirm 'Delete this server and its tool registry?') | Server, its tools and logs gone; removed from every agent's Allowed MCP servers; built-in server: 'The a2NSoft ERP server can be restricted tool by tool, not deleted.' | |
| a2NSoft's own MCP endpoint | Signed-in session (cookie) of a test user | POST JSON-RPC 'initialize', 'tools/list', 'tools/call' to /api/v1/workspaces/<company>/ai/mcp | tools/list shows read tools only (readOnlyHint); tools/call returns the same data as chat for that user; unknown method -> error -32601 'Method not found' |
AI Settings
| Action | When | What you do | What happens |
|---|---|---|---|
| Switch the assistant off | General: untick AI enabled; Save; try New chat and send | 'The AI assistant is switched off for this company.'; existing chats still readable | |
| Engine and key | A TEST Anthropic key | Models: Engine Anthropic Claude, key, Save; Test connection; Remove key | 'claude-opus-5 answered: ready'; wrong key -> 'The API key was refused.'; Remove key -> engine back to built-in |
| Quick prompts | General: replace quick prompts with 2 lines; Save | Landing page chips show those prompts (personalised to tools you can use) | |
| Edit conflict | Two admins open Settings | Admin A saves; Admin B saves without reloading | B refused 'Somebody else changed these settings. Reload and try again.' |
AI Settings > Activity log
| Action | When | What you do | What happens |
|---|---|---|---|
| Activity log | Some chats with tool calls and a confirmed action | Open Activity log; sort by Duration; search a tool name | Each tool call: time, user, agent, server, tool, redacted input, result (300 chars), status ok / refused / error / proposed, records, duration; confirmations logged with {action_id} |
AI Settings > Usage
| Action | When | What you do | What happens |
|---|---|---|---|
| Usage and estimated cost | Claude claude-opus-5 answers this period: 10,000 input tokens, 2,000 output, 20,000 read from cache | Open Usage, Last 30 days | Estimated cost = (10,000 x 5 + 20,000 x 5 x 0.1 + 2,000 x 25) / 1,000,000 = USD 0.11; tokens 10,000 / 2,000; built-in answers counted under Answered without the model at no cost |
Feature switches
| Action | When | What you do | What happens |
|---|---|---|---|
| Turn off Agents feature | company.manage | Applications > AI Assistant > Features: Agents off; reopen the AI menu; try to save an agent | Agents menu hidden; save refused 'Agents is disabled for this company.'; existing agents still used in chat |
| Field rule Required | Fields: Agent purpose = Required; create an agent without purpose | '*' on Purpose; save refused 'Agent purpose is required by this company.' |