A year of customer and partner evidence
The management brief now combines the supplied 50,000 synthetic transaction attempts with 1,981 synthetic customer cases and 69 synthetic partner cases. There are 6,158 messages within 9,901 timestamped events, covering 11 September 2025 to 11 September 2026. All times are presented in East Africa Time.
A management walkthrough
• Open Brief. Select a review date and a reporting period. The clock is the evidence cutoff: later messages, case links, outcomes and promises are unavailable until time advances.
• Read the payment value, volume and acceptance measures, then review the leading customer themes. Theme bars compare new case starts with the preceding equal period; distinct requesters show breadth separately from repeat messages.
• Click a theme or Review customer conversations. Read the messages, status history and recorded promises. Search by wording or case reference, filter customer/partner activity, and use Back/Next to browse the cases.
• Review overdue updates. These are explicit promises to provide an update, not assumed contractual SLAs. A case may be resolved while a promised update has no fulfillment record; neither proves recipient credit.
• Open connected transactions or related partner discussions where an authored link is available. The evidence pane identifies these as synthetic relationships.
• Record a management follow-up with an owner, next action and review date. This is a browser-local record; it does not assign a task externally or send a message.
• Ask about customer themes, overdue commitments, partner enquiries, open cases or resolutions. Answers are calculated from the selected report period and evidence cutoff. The question box states that live AI is not connected.
• Create a Weekly, Monthly or Quarterly snapshot under Reports. Open its conversations, inspect sources or ask about it. Its period, cutoff, source fault state and management notes remain frozen. Today's score does not appear inside reports.
For a compact example, review 27 August 2026 / Last 7 days. The annual corpus has 36 new customer cases and 2 new partner cases in 20–26 August. Compare financial enquiries and payment-status questions, then read a customer thread. Move one week forward and revisit the saved weekly report to demonstrate the distinction between current knowledge and a preserved management record.
Partner Bank views
Use Partner Bank to select Equity Bank or any of the ten banks in the supplied transaction file. All partner banks restores the network view. A bank brief brings Business Performance, Customer Issues and Partner Issues together, with questions and supporting records in the same bank context. The review date and reporting period remain independent controls.
Financial measures include transactions where the bank is either sender or receiver. Self-transfers count once in the combined total; sender and receiver figures are also shown. Current-period totals, preceding-period comparisons, evidence rows and exports use the same bank rule. Zero attempts with source coverage is shown as zero, with no invented acceptance rate. Missing sources remain unavailable.
Partner cases retain the original synthetic partner_alias field. The bank dictionary is recovered by matching all 50,000 exact IDs between the safe synthetic catalog and supplied transaction data; every alias has one consistent bank. Partner04 maps to Equity. This restores synthetic affiliations, not identities from the actual app report.
Customer cases have no bank field. They enter a bank view only when an authored transaction link is available at the review cutoff and that transaction involves the bank. Of the full 1,981-case customer corpus, 203 cases have links and 1,778 remain unassigned. A case can concern two banks; do not sum bank case counts to get network totals. These relationships do not establish bank membership or fault.
Example: at 27 August 2026, 10:42 EAT, Last 7 days / Equity has 185 unique attempts, 180 accepted and 5 rejected; accepted value is KES 2,882,125.56. Sending has 101 attempts and receiving 94, including 10 self-transfers. The preceding seven days have 167 attempts. Four attributed customer cases opened in the selected period. Twenty attributed customer cases and seven partner cases opened by period end remain open at the review cutoff. No new partner cases arrived that week; this does not remove the older open work.
Questions about bank performance, open customer cases, partner issues and overdue updates use the visible bank, period and cutoff. Explicit today payment questions use midnight through that cutoff and link to their own calculation. Revenue and root cause remain unsupported. Saved reports preserve their bank even after the live bank changes. To ask about a different bank, return to the live view and change Partner Bank. The separate presenter incident exercise uses its original simulated participants and leaves the bank scope behind.
What is grounded and what is assumed
The actual app export supplies 27 aggregate topic rows, aggregate service measures and 30 feedback records. It does not contain message-level customer or partner transcripts. The all-time period has no known start date. Therefore topic proportions inform the synthetic customer mix, but source totals are not presented as annual workload, observed response performance, resolution rates or conversation language.
All dialogue, actors, times, outcomes, repeat-contact patterns and partner workflows are newly authored synthetic examples. The chosen 1,981 customer and 69 partner cases are illustrative dataset sizes. Partner support exists in the report, but its actual dialogue and topics were not supplied. No actual workbook, raw feedback or identity map is bundled with the website.
The original report's channel totals do not reconcile with overall sessions. Its 5.17 rating is a simple mean, not an independently verified NPS. Neither is used as a live performance target. Session endings and case resolutions are different measurements.
There are 203 authored transaction links referring to 202 distinct supplied synthetic transactions. These are not verified joins between real customers and payments. An accepted switch status is not recipient credit; rejected attempted value is not a measured loss. Revenue, costs and contractual SLA data remain unavailable.
Period and time rules
New cases are counted by availability time within the report period. Message totals count message events received in that period. Case status and commitments use all events that occurred and became available by the review cutoff, for cases opened by the period end. Open work is therefore a backlog as of review, not just new work in the period.
Resolution totals count distinct cases with a resolution event in the period, including cases that later reopened. The evidence view shows their current state at the report cutoff. Previous theme counts use an equal-length preceding window and are withheld if coverage is incomplete; this is separate from the transaction metric comparison selector.
The underlying static corpus is downloaded to the browser. The evidence cutoff is a deterministic presentation and analysis rule for this simulation, not a security boundary hiding future records from someone inspecting the bundle. Source failures remain explicit. Rewinding discards management actions and reports from the abandoned future.
Implementation and validation
scripts/build_conversation_data.py verifies the synthetic package hashes and bundles only cases, events and the safe topic taxonomy. annual-engine.js folds eligible events into case histories and report summaries. annual-ui.js renders evidence, comparisons and local follow-ups. The existing operational incident exercise remains separately labelled under Today's disclosure and presenter controls.
The automated suite has 84 passing tests, including source totals, cutoff boundaries, late links, reopened cases, unavailable sources, frozen report projections, safe text rendering and separate frozen management notes. Local browser checks cover report → sources → conversations, omitted Today in reports, contextual questions, filters and date changes. No live model, production ChatSasa connection or external communication is exercised.
Executive Management Brief
The homepage is a short management briefing, not a dashboard. Its order is overall status, visible selected-period performance, up to three material stories, six Business Health rows, up to two persistent watches, one strategic observation, and contextual Ask. Empty editorial slots remain empty. Today’s CSV score and the active/resolved issue carousel are under Today so far. Presenter controls and walkthrough notes remain in their own dialog.
Performance and periods
Yesterday is the default. Last 7 days, This month, Last month, 90 days and Custom recalculate the same brief. Headline transaction value is accepted value, volume counts attempts, and success rate means accepted attempts divided by all attempts. Acceptance does not prove receipt or settlement. Financial and period metrics come from the supplied CSV; fee income, revenue, profit and loss are unavailable.
Yesterday uses the previous four same weekdays. Seven days uses the preceding seven complete days. Month to date uses equivalent dates and elapsed time last month; a missing equivalent day withholds comparison. Last month uses the prior calendar month. Ninety days and custom use preceding equal windows. Missing or partial coverage withholds comparisons. Recall SLA appears as a fourth headline only when a relevant completed sample or missing-guidance condition exists, and is labelled simulated.
Management views
Business Health covers Business Performance, Customers, Partners, Product & Service, Operations, and Risk, Compliance & Standards. Each row leads to a focused area brief. Explore lists these six dimensions before any data explorer. The existing transaction, conversation and case records remain supporting evidence.
One incident owns its customer, partner, operational and SLA references. Material resolved events remain visible in the next morning’s brief. Reports contain an executive summary, period performance, material history, the six management dimensions and strategic evidence. They do not include Today’s score or current issue carousel. Questions opened from a report preserve its analytical window and generation cutoff.
Persistent intelligence
Participant watches calculate five complete seven-day windows from the supplied file. Peers exclude the selected sender. Each qualifying week requires at least 50 participant attempts, 3 rejects and 500 peer attempts, plus a rejection rate at least 1.25 times peers and 0.5 percentage points higher. Watch requires three qualifying weeks; Attention requires four and is promoted into weekly/monthly/strategic editorial. The latest week must qualify. This is an illustrative review rule, not a contractual SLA or a claim of causation.
Absa has 3/5 qualifying weeks on 20 July 2026, 4/5 on 3 August and 5/5 on 10 August. On 17 August its latest week no longer qualifies. Reason-code watches require three consecutive weekly windows above their preceding four-week rates, with at least three occurrences per window. These rules prevent a single comparison from being presented as a persistent trend.
Replay and provenance
The clock can start at the first supplied observation, use 10×, 100× or one day per second, and jump to meaningful scenes. Every source metric is bounded by the selected time. Supplied observations end on 11 September 2026; later dates are historical review, never fabricated traffic.
The dense 27 August incident remains a separately labelled simulated service scenario. It is not an anomaly measured in the supplied file. Its generated transactions support the existing human-confirmed incident, SOP and SLA demonstration. This remains a limitation relative to a fully CSV-driven incident detector. Source financial scores never merge those generated transactions.
Ask and persistence
Ask PesaLink uses OpenAI Responses to query the supplied synthetic transactions and annual customer/partner conversations. Answers preserve the selected bank, period and evidence cutoff, with supporting calculations and conversation references. The API runs separately in Kubernetes; no credential is embedded in the browser.
Saved actions, following and editorial observations are browser-local. Rewinding removes future actions and snapshots. Analytical results are deterministic at a cutoff; editorial observation timestamps record when that browser visited a state. Scheduled scenario snapshots retain their existing milestones; other period snapshots are created on demand rather than generated automatically for every historical calendar boundary.
Recommended executive demonstration — approximately 9 minutes
All walkthrough controls are under Presenter. Use Jump to for the named milestones, then return to management. A fresh Reset demo starts at 27 August, 08:00 EAT. Explain once that transaction scores use the supplied synthetic CSV; service incidents and operational records are separately simulated.
0:00–1:00 — The 60-second management picture
Open Brief. Read Operating normally, yesterday’s three transaction indicators and the one comparison. Scan What You Should Know and all six Business Health rows. Point out the measured participant watch and the transaction-size observation. Keep Today so far closed initially.
1:00–1:45 — Same brief, different perspective
Select See other periods, then Last 7 days and This month. Show the changed totals and comparison. Return to Yesterday. Open Today so far to show actual supplied attempts accumulated to the clock, financial details and the separate simulated issue count; close it again.
1:45–2:30 — Conversation adds value without a failure spike
Presenter → Jump to → 09:10 · Partner friction, normal service. Investigate the partner’s status-guidance request. Read the Web Chat evidence. Service is normal in the simulated operational window. The request establishes a communication gap, not a failed transfer or financial loss.
2:30–4:00 — One service story, several evidence sources
Jump to 10:42 · Connect the signals. Read the grouped transaction service item, then Investigate. Follow What we found → Why it matters → Show me → Breakdown → Related evidence. Open the customer and partner records. Explain that the dense failure spike is generated scenario evidence, while the financial score still uses the supplied CSV. The Bank D reconciliation query is a separate concurrent issue. Today so far retains Back/Next for these issues.
4:00–5:15 — Bring procedure to the work
Jump to 10:45 · Coordinate a response. Create Incident, acknowledge, assign an owner and complete the first three procedure steps. Read the sample SOP, required information, response deadlines and escalation point. Jump to 11:03 to show remaining time, then 11:15 if escalation is to be demonstrated. Record the escalation; no real message or financial action occurs.
5:15–6:00 — Recovery is not resolution
Jump to 11:52 · Recovery is not resolution. Eleven customer outcomes remain open. Jump to 13:50 · Close the loop; the generated confirmations have arrived. Complete the fourth procedure step and close the incident. The closure gate checks customer outcomes and required human response records.
6:00–7:00 — The next morning and reports
Jump to 08:00 · The next morning. Open Brief: yesterday’s closed event remains in What You Should Know. Open Reports → Daily Brief → Create snapshot. Show the executive summary, yesterday’s CSV results, customer/partner outcomes and operational review. Open Weekly Brief: Today’s score is absent, and its numbers use the report period. Saved report evidence remains frozen.
7:00–8:00 — Persistent participant intelligence
Jump to 10 Aug · Persistent participant pattern. This selects the weekly lens. Investigate Absa: 5/5 qualifying weeks, with full participant and peer denominators. It is persistent elevation, not monotonic deterioration or proven fault. Ask What supports this participant concern? and inspect evidence. Guided answers are explicitly labelled; live AI remains pending a valid credential.
8:00–9:00 — Strategic question
Return to Brief and open the transaction-size observation. Follow Measured fact → Interpretation → Question. Explore purpose, participant and time-of-day breakdowns. Ask about customer motives or payment alternatives: the available data cannot establish them. End with the management question, not an unsupported causal conclusion.
Optional extended replay
Presenter → Start supplied year, choose 1 day / sec and run. Source counts and selected-period metrics advance only through T. Pause before exploring. Jumping back branches browser-local history. Reports outside file coverage clearly disclose missing or partial observations.
Management UX principle
Do not make management analyze the dashboard. ChatSasa should analyze the business and communicate what management needs to know. Prioritize attention, changes, health, explanation and evidence. Never add information to Today simply because it is available.
Navigation and disclosure
Today, Attention, Explore and Reports are the four primary destinations. Ask PesaLink is global. Explore contains Transactions, Participants, Customers & Partners and Cases. Incident procedures are reached from the investigation. Presenter controls remain separate.
Today has no large chart or transaction table. It presents a service status, three compact previous-day transaction measures, a clearly labelled completed-recall SLA sample, no more than three open priorities, source-backed changes and a customer/partner narrative. Late review dates label the historic 27 August figures and never present them as current service health.
Attention has Open, Monitoring and Resolved views. Transaction WATCH, ACTION, customer theme, incident candidate and recovery are one evolving issue. Response obligations can be separately actionable; their ranking explanation makes clear they are not another transaction incident. Missing data, overdue response deadlines and material failures rank first. Customer reports, participant context and unresolved outcomes influence order. Priority reasons are visible. Positive changes and nonurgent opportunities sit in Monitoring.
Investigation follows fact, interpretation, suggested action, affected corridors, chart, evidence, procedure and cases. Technical root cause remains unconfirmed. Opening a finding never creates an incident; human confirmation starts the response clock. Evidence stays linked to the measurement and operational cutoffs it describes.
Customer & Partner Voice leads with themes, context and qualified relationships. Individual conversations are expandable. Cases leads with unresolved outcomes and actual response obligations; all records are expandable. Delayed-receipt cases have no case-level SLA; the demo does not invent deadlines or waiting-time categories.
Reports open as executive briefs. The full analysis is expandable, and the download includes the frozen underlying report. Ask about this report preserves its period, generation-time actions and faults. Source questions use the report's supplied metrics rather than a new seven-day analysis.
Analytics and provenance
Business Performance has Today, 7D, 30D, 90D and Custom selections, with a sender filter. Four headline charts show attempts, attempted value, acceptance and participant ranking. Daily buckets sum to the selected period, including partial boundary days. Failure reasons, corridors, narration labels and time-of-day details are expandable. Source coverage and assumptions remain explicit.
Supplied CSV comparisons are not evidence of the generated incident. No example figures from the UX brief were copied as data. The demo uses 11 related customer conversations and three participant reports at10:42, and independently measured source comparisons. Measured synthetic facts, simulated operational evidence, AI interpretation and suggested action have distinct labels.
Contextual Ask captures the selected finding or source range, participant, cutoff, actions and faults. Answers use that captured context even if the clock subsequently advances. Rewinding clears future context. The assistant remains deterministic, without a live model or production connection.
Architecture and isolation
The prototype is a new standalone static application. No existing ChatSasa repository, API configuration, database, authentication token, workflow or running service was modified. The local server binds to 127.0.0.1 on its own port. The hosted application has its own origin. There are no external API calls, CDN dependencies, analytics beacons or message sends.
Existing capabilities reused conceptually
ChatSasa's ictlife-frontend/packages/groups-frontend is a React/Vite application with API-backed chat retrieval, human assignment, conversation summaries, channel/organization metrics and workflow creation. Its workflow steps already carry descriptions, assigned users and estimated processing time. PesaLink WhatsApp guidelines distinguish delayed receipt from a terminal timeout and discourage unclear or duplicate payment actions.
This prototype reuses those conversation, organization, assignment, workflow-step and assistant concepts. It does not import production components or services. The existing API client automatically attaches a user token and was deliberately not reused. Existing workflow timing is not assumed to be an enforced SLA engine or an approved SOP registry. Current backend GitHub stage source was also inspected: contact CRUD/import/export, group channels, workflow routes, exports, local assistant profiles and Responses endpoints exist. This verifies source capabilities, not the current production deployment. No enforced scheme-policy or management-notification engine was verified.
Reference locations: src/redux/actions/chats/index.js, src/redux/actions/processWorkflows/index.js, src/hooks/useConversationSummary.js, src/utils/pesalinkWhatsappGuidelines.js, src/config/axiosConfig/index.js in groups-frontend.
Demo projections and new intelligence capabilities
DataSource → Transaction → Metric → Signal → IntelligenceItem → Evidence.
Conversation, organization, contact, assignment and workflow concepts align with existing ChatSasa functionality. The new isolated capabilities are evidence-linked management items, simulated SOP/SLA execution, executive snapshots, period comparisons, editorial memory and participant persistence.
engine.js owns the generated dataset, time eligibility, signal rules, case/incident projections, action validation, reports and deterministic answers. source-engine.js adapts the user-supplied dataset, calculates source metrics and adds source-backed positive findings. app.js renders the browser workspace, manages the clock, exports and human actions. supplied-data.js is the minimized browser data adapter output.
Only presentation branding and scenario configuration are PesaLink-specific. Generic IDs, evidence classes and action types are used instead of PesaLink-specific entity types.
Time and state
Events carry occurrence and availability times. Views derive from the clock cutoff. Human actions use simulated time and are append-only until a rewind branches history, at which point future actions and reports are removed. Future case outcomes are not returned in open-case projections. Scheduled reports are JSON snapshots at their generation time. Browser reload restores the demo state paused.
State is explicitly device-local. There is no shared multi-user state, server database or production persistence. A future integration would require authenticated APIs, durable event ingestion, tenant boundaries, policy versioning, authorization and a real language-model service. Those are future implementation requirements, not claims about this prototype.
Management presentation layer
dist/management.js projects the unchanged scenario into grouped, ranked management findings and Open/Monitoring/Resolved buckets. It also reconciles custom supplied-data selections and contextual Ask against captured evidence. dist/brief.js calculates period briefs. dist/executive.js adds six-area projections, persistent participant comparisons, period-scoped operational evidence and source-stream scores. dist/app.js renders Brief / Reports / Explore with global contextual Ask and retains the existing incident actions, replay controls and frozen reports. No new network requests, dependencies, backend or ChatSasa integration were introduced.
Verified backend alignment and pending live AI
Backend reference paths in mfereji-io/ictlife-backend, stage: app/apps/groups/app/web/api/sikio_contacts/endpoints.go; group_channels/endpoints.go; process_workflows/endpoints.go; conversation_exports/endpoints.go; openai/endpoints.go; app/apps/groups/app/services/ai_assistant_service.go; chat_conversation_query_service.go. A partner is represented as an organization/conversation role in this demo; a dedicated production partner entity was not verified.
The published static edition sends no API requests. A separate draft branch, feat/pesalink-data-agent, contains the isolated Responses Worker and read-only dataset tools. The local backend key was rejected with HTTP 401, so that draft is not represented as working live AI. No production assistant, vector store, conversation, service or database schema was changed.
Data model and migration boundary
No database migrations or production schema changes are applied. All entities exist in JavaScript memory; human actions and generated report snapshots persist under pesalink-standalone-simulation-v1 in localStorage on this demo origin.
| Entity | Relevant fields |
|---|
| DataSource | name, source type, SHA-256, row count, schema assumptions, coverage |
| Transaction | id, occurredAt, availableAt, amountMinor, currency, status, reason, origin, destination, purpose |
| Metric | window start/end, count, rejected, accepted, valueMinor, rates, baseline, denominator |
| Signal / IntelligenceItem | id, detectedAt, severity, type, description, provenance, evidence key, lifecycle status |
| Conversation | id, occurrence/availability, customer/partner type, organization, channel, text, theme, caseId |
| Organization | fictional Bank A–D for replay; original participant labels for supplied analytics |
| Customer Case | id, conversationId, createdAt, owner, status; resolvedAt/outcome only when available |
| Incident | id, createdAt, owner, status, steps, response timestamps, open-case count, closure gate |
| Procedure | sample OPS-04, ordered required steps, escalation chain |
| SLA | acknowledgement 10 minutes; escalation 30 minutes from actual incident creation |
| Action | id, simulated at, type, step/owner/item/status as applicable |
| Report | id, generation time, period, frozen metrics, supplied metrics, actions, conversations, faults, provenance |
| Evidence | source, cutoff/window, calculation or supporting records, provenance class |
Source mapping: unnamed CSV index → stable CSV-<index> ID; reception_time → occurredAt and availableAt (EAT assumed); payment_status ACCP/RJCT → accepted/rejected; payment_amount ×100 → integer amountMinor; sender_bank/receiver_bank → directed participants; narration → purpose. Currency is assumed KES. ACCP does not establish recipient receipt. Same-bank corridors are retained. Duplicate timestamps are valid; the unique source index, not timestamp, identifies a record.
Synthetic account numbers and customer account names are excluded from the browser data. Monetary import uses Python Decimal and rejects more than two decimal places. The source hash and independent totals are in SOURCE-MANIFEST.json.
Intelligence lifecycle: Detected → Reviewed → Investigating → Actioned → Resolved / Dismissed. WATCH can initially be Monitoring. The UI supports explicit human status changes and retains them at their simulation timestamp. This is an exploratory demo lifecycle, not a strict production state machine.
Executive scenarios A–D
A: retain the clearly labelled generated 27 August service incident, human confirmation, SOP/SLA, technical recovery and customer outcomes. B: measure Absa across five complete weeks; 20 July Watch, 3 August Attention, 10 August 5/5, 17 August latest-week improvement. C: PRT-2002 arrives by Web Chat from Bank D at 09:00 on 27 August, asking for acceptance-versus-receipt guidance while operational service is normal; it resolves at 09:40. No transaction failure is generated for this request. Existing independent reconciliation email PRT-2001 remains at 10:35–12:20. D: retain the computed median/mean distribution with fact, interpretation and strategic question. New generated events are fixed scenario configuration, not measured PesaLink facts.
The sections below document the underlying scenario model; the executive presentation rules in LIVE-BRIEF.md take precedence for the homepage.
Scenario specification
All times are EAT (UTC+3). Clock range: 27 August 2026 08:00 to 30 September 2026 08:00.
Generated transaction incident
60 attempts per minute. Each minute normally has one rejection. From 10:00–10:14 it has three; from 10:15–11:29 it has six. Extra rejections are TECH02 in Bank A→B/C. At 11:30 generation returns to one reject per minute. This generated source is separate from Ian's CSV.
| Time | Trigger / visible result |
|---|
| 08:00 | Normal baseline, zero related conversations or cases |
| 10:00 | Generated rejection rate starts rising |
| 10:11 | WATCH: 39 rejects / 900 trailing attempts, fifth qualifying evaluation |
| 10:24 | ACTION: 75 / 900, eighth evaluation at ≥6% |
| 10:27–10:37 | Eleven customer conversations/cases arrive via WhatsApp/web chat |
| 10:33 / 10:37 / 10:41 | Bank A/B/C partner reports via web chat/email/WhatsApp |
| 10:42 | Candidate requires transaction ACTION + ≥3 customer + ≥3 participant reports |
| 10:45 suggested | Human creates incident; actual creation time starts SLA |
| Creation +10m | Acknowledgement deadline |
| Creation +30m | Escalation deadline; 12m warning at 11:03 if created at 10:45 |
| 11:30 | Transaction generation normalizes; detection still waits for persistence |
| 11:52 | Recovery confirmed; eleven customer cases still unresolved |
| 12:00–13:40 | Individual simulated receipt-confirmation events resolve customer cases |
| 13:50 suggested | Human completes procedure and closes incident |
| 28 Aug 08:00 | Daily Brief snapshot |
| 31 Aug 08:00 | Weekly Review snapshot |
| 30 Sep 08:00 | September month-to-date Management Report and retrospective |
Closure requires acknowledged ownership response, four completed steps, technical recovery, no open customer cases and available procedure/SLA. Escalation performance is reported honestly; closing does not retroactively cure a missed deadline. No root cause is invented on closure.
Positive intelligence
Source-backed changes: Co-operative Bank outgoing attempts increase 384→412, while Absa rejections improve 15/387→9/381, comparing complete 28-day windows 2–29 July and 30 July–26 August. Findings are available from 27 August midnight. They describe observed changes without a causal claim.
School-fee guidance is an interpretation/opportunity from generated tagged records, not a claimed six-week source trend. Funds Recall is simulated operational evidence: 100 August cases averaging 20h /89 within24h versus 100 September cases averaging16.4h /94 within24h. Improvement appears after September records are complete. One earlier process-review action is scenario context; causality is not established.
Failure scenarios
Missing transactions or unavailable source suppress metrics and transaction conclusions. Unknown reason replaces TECH02 with UNMAPPED_99 while preserving counts. No-customer mode removes customer corroboration and prevents incident candidacy. Conflicting-partner mode adds Bank D's contradictory report. Missing SOP removes procedure guidance; missing SLA removes deadlines/compliance. Insufficient-evidence mode suppresses incident candidacy. These controls are explicitly session-wide source/policy fault simulations, not timestamped external outages.
Reset restores generated data and clears actions, reports, faults and clock. Backward jumps truncate abandoned future actions and report snapshots. Forward jumps process report schedule cutoffs; they do not auto-confirm incidents or fabricate employee actions.
Executive brief update
Headline and Today financial scores now use supplied CSV rows only. Source Today includes midnight through T, sums integer minor-unit amounts, and withholds acceptance when attempts are zero. See LIVE-BRIEF.md for period comparisons and the exact five-week participant persistence rule. Generated service incident calculations below remain a separate scenario model, never the supplied score. Business health uses plain status labels, not a numerical management score.
The sections below document the underlying scenario model; the executive presentation rules in LIVE-BRIEF.md take precedence for the homepage.
Analytics specification
Eligibility and sources
Every transaction calculation uses occurredAt ≤ T and availableAt ≤ T. Rolling windows are (start,end]; full calendar days use [midnight,next midnight). Source timestamps have no timezone, so EAT is an explicit assumption. Currency is assumed KES. Monetary calculations use integer minor units.
The supplied CSV and generated replay are never combined. Dense generated replay covers26–28 August; surrounding dates use a smaller daily generated historical sample. Absolute volume comparisons across those sampling regimes are not presented as real growth.
Formulas
| Metric | Formula / population |
|---|
| Attempts | Number of eligible unique transaction IDs |
| Accepted / rejected | Counts of ACCP / RJCT source status or their replay equivalents |
| Attempted value | Sum(amountMinor) /100 for all eligible attempts |
| Accepted value | Sum(amountMinor where accepted) /100 |
| Acceptance / rejection rate | Accepted or rejected count / eligible attempts |
| Participant rejection rate | Rejected sent transactions / all sent transactions for that participant |
| Corridor rate | Rejected origin→destination attempts / all attempts on that directed corridor |
| Reason count / share | Rejected count with code / all rejected count |
| Replay rolling metric | Trailing15 minutes ending at the simulated time |
| Replay baseline | Same15-minute window one day earlier |
| Source comparison | Same selected participant, immediately preceding equal-length window |
| Volume relative change | (Current count−prior count)/prior count ×100 |
| Rate percentage-point change | (Current rate−baseline rate)×100 |
| Rate relative change | (Current rate/baseline rate−1)×100 |
| WATCH | Rate ≥2×prior-day baseline AND ≥1pp higher for5 complete minute evaluations |
| ACTION | Rate ≥6% for8 complete minute evaluations |
| Recovery | Rate ≤2.5% for10 complete minute evaluations after ACTION |
| Open cases | Created byT and no available resolution byT |
| SLA remaining | ceil((creation+target−T)/minute) |
| SLA met | Recorded action time ≤deadline; missing action is not assumed compliant |
| Recall duration | Resolution time−creation time |
| Recall improvement | (20−16.4)/20=18% |
| Recall compliance | Resolved cases duration≤24h / resolved cases |
Missing data and zero-denominator rates show unavailable. Zero observed rejections with nonzero attempts yields0%. Relative change from a zero baseline is unavailable. A high rate on a small source sample is an observation, not proof of a material incident. Reason-code descriptions and terminal receipt status cannot be inferred from the source alone.
Independent reconciliation controls
Full supplied CSV:50,000 attempts;48,845 accepted;1,155 rejected;2.31% rejected;739,578,332.98 attempted value;723,879,134.67 accepted value (currency assumedKES). TECH02 count163. Absa outgoing:142/5,035. Absa→Absa:20/478.
27 August complete source day:132 attempts;8 rejects;6.060606%;2,320,600.83 value. At10:42 only62 attempts/two rejects are available; no TECH02. Between10:00–12:00 there are12 attempts/zero rejects. The only TECH02 that day occurs at18:30:34 and cannot support the morning replay.
Generated full27 August:86,400 attempts;1,845 rejected;84,555 accepted. Incident10:00–11:29:5,400 attempts;495 rejects;405 excess rejects relative to baseline. These are separate generated-scenario results.
Reports and assistant
Daily Brief at28 August08:00 covers the prior calendar day. Weekly Review at31 August08:00 covers the seven prior days plus the generation day's partial morning, with exact period timestamps included in its snapshot. Management Report at30 September08:00 is September month-to-date. Historical supplied coverage ends11 September and remains explicitly incomplete thereafter. Reports snapshot known actions at generation time; they do not update silently.
Ask PesaLink uses deterministic intent branches and the same time-aware calculations/evidence. It never asserts a confirmed technical cause. Source questions explicitly use a trailing7-day supplied-data window; replay questions identify generated source. The historical finale returns recorded response and available process outcomes rather than future or invented repeat incidents.
For overview dates later than the continuous replay end28 August08:00, transaction cards explicitly reference the completed27 August calendar day. Their evidence uses that same historic cutoff; they are not current-day observations. Day-level comparisons use the equivalent prior-day elapsed period, not a15-minute baseline. Current operational actions and reports keep their actual simulation cutoff. The optional latest-supplied-data view caps its analysis cutoff at min(simulationTime,lastSourceObservation); no future source rows are eligible.
Partner Bank filtering · 20 September 2026
npm test: 84 passed, 0 failed. Eleven bank checks cover alias restoration, sender/receiver union deduplication, independent Equity sums and previous-period fixtures, customer/partner attribution, late links, immutable scopes and reports, missing sources versus zero observations, scoped questions/evidence/exports, today versus weekly totals, and undefined acceptance. Local browser checks cover selecting Equity, financial evidence, switching the live bank to KCB, reopening a frozen Equity report, partner conversations and questions retaining the original bank/cutoff. The narrow 586px browser viewport has no horizontal overflow.
Annual conversation integration · 20 September 2026
npm test: 73 passed, 0 failed. The ten new annual-history checks cover exact corpus counts, occurrence/availability boundaries, late links, source-failure cache isolation, period denominators, reopened cases, frozen projections and notes, question routing, grounded health summaries and safe rendering. See CONVERSATION-HISTORY.md for the current walkthrough and limitations.
Executive release validation
The regression suite includes the original engine/scenario checks plus source-stream totals, exact Absa weekly denominators, editorial budgets, conversation-only timing, resolved history in the following morning, report-period exclusion of later events, source seek equivalence, frozen participant questions, future-outcome redaction, zero-denominator handling and provenance. Browser verification covers period switching, investigations, evidence, all six Explore dimensions, report omission of Today, contextual guided answers and mobile overflow. Live OpenAI answers remain unverified because the available local key returns HTTP 401. No production ChatSasa integration or communications are exercised.
The sections below document the underlying scenario model; the executive presentation rules in LIVE-BRIEF.md take precedence for the homepage.
Test report
Validated17 September2026. Automated command: node --test tests/engine.test.cjs. Result: 29 passed,0 failed.
Automated coverage
Threshold calculations and first-detection times; generated full-day totals; occurrence/availability cutoff including delayed ingestion; rewind state; cross-signal candidate prerequisites; future case-outcome redaction; deadlines anchored to actual human creation; recovery with11 open cases; complete incident workflow and late escalation; branch truncation; frozen reports and future-action exclusion; all eight requested failure states; unknown question and historical finale; full-source reconciliation; August27 intraday cutoff; source participant/corridor/reason denominators; positive-source comparisons; September source horizon; Funds Recall calculations; CSV export preservation.
Source totals were independently calculated directly from the original CSV using Python Decimal, separately from the JavaScript engine. The full-source values, August27 full-day values and morning cutoff are exact test fixtures. Generated daily counts are independently derived from the60-per-minute scenario and explicit rejection schedule.
Browser validation
Validated in the Codex browser: supplied-CSV participant filtering and evidence reconciliation; Create Incident; acknowledgement and procedure checkboxes;12-minute SLA warning; participant follow-up draft with current cutoff; escalation at threshold; recovery retaining11 unresolved cases; customer resolution; gated incident closure; generated Incident Summary; next-act navigation to the Daily Brief list; Daily Brief showing132 original-source attempts and6.06% rejection separately from replay; historical Ask PesaLink responses and month-end Funds Recall context; reset restoring08:00 with no incident; playback and speed controls. Responsive DOM checks show no page-level horizontal overflow at1440px and390px.
The read-only WebMCP context tool registered successfully, returned the current visible simulation state and rejected invalid extra input without mutation.
JavaScript syntax, static local asset references and absence of production-client/API/fetch dependencies were checked. The standalone bundle has no external runtime dependencies.
What is connected
• Ian's supplied synthetic CSV:50,000 imported rows, original measured fields, separately visible Business Performance/source evidence/exports/report context.
• Generated scenario:215,448 deterministic transaction rows, with dense incident replay and smaller historical samples.
• Simulated events:11 customer conversations/cases,3 participant communications, optional contradictory report, sample SOP/SLA, human-recorded incident actions and200 Funds Recall cases.
• Assistant: deterministic intent matching, calculation lookup and qualified interpretation text.
Not connected / known limitations
No live switching, bank, WhatsApp, email or real SLA data is connected. OpenAI answers use only the synthetic demo data. No actual messaging, incident escalation or scheduled email delivery occurs. Reports arrive inside the simulation only. The hosted demo is public.
The source file is sparse and does not support the specified27 August morning incident. That story therefore uses its separately labelled generated source. Original CSV coverage ends11 September2026; EAT and KES are assumptions. Reason meanings and recipient receipt cannot be inferred from ACCP/RJCT. Source positive findings use only supported28-day comparisons; the brief's illustrative six-week/four-week trend claims are not fabricated.
Sections1–23 were not supplied. The operating procedure, SLA deadlines and participant identities in the storyline are illustrative, not approved PesaLink policy. One transaction incident is modelled; recurring technical causation cannot be established. Root cause stays unconfirmed after operational closure.
State is browser-local, not shared across employees. Rewind intentionally abandons future user actions/reports. Failure toggles are session-wide test conditions rather than timestamped outage histories. Modern desktop Chromium was the interactive test target; Safari/Firefox and every mobile device were not separately exercised. Print/PDF and file exports use native browser capabilities; PDF pagination was not independently rendered. The guide and portable bundle are delivered alongside the app.
After publication
Open the private hosted demo and click Reset demo → Demo Story. At Act6, create and acknowledge the incident. At Act8, expect11 unresolved cases despite technical recovery. At Act9, completion of the last procedure step enables closure. The next morning's brief should retain the measured CSV count132/rejects8 and your recorded SLA outcome. Business Performance should show source-labelled metrics and the source cutoff, with no production network calls.
If the display is stale after a new publication, reload. If a rehearsal diverges, Reset demo restores the deterministic starting state. No ChatSasa rollback is needed because its files, services and data were never changed.
Coverage and playback fix
Reproduced the September retrospective displaying five Unavailable fields. Later overview dates now show the explicitly dated27 August complete-day metrics with matching evidence cutoffs. Continuous playback stops28 August08:00, hidden-page playback pauses, and timer gaps longer than2seconds are discarded. Existing late timestamps and employee actions are preserved. Active failure controls have a persistent explanation and Restore normal demo data action. The supplied-data view offers a historical cutoff at the last supplied observation without changing simulation time. Six regression tests cover these behaviors; browser checks cover the saved-date reload, historical evidence, latest-CSV view and fault recovery.
Management UX redesign verification
37 automated tests pass, including grouped priorities, actual SLA deadlines, the three-item budget, recovery versus closure, time-correct measurements, missing-data qualification, custom range reconciliation, contextual participant analysis, and frozen report questions.
Browser rehearsal covers Today → Investigate → human incident creation → acknowledgement and procedure →12-minute escalation warning → recovery with11 open customer outcomes → closure → next-day Daily Brief. The brief correctly records on-time acknowledgement and escalation. Asking about that report after advancing to30September retains its28August generation cutoff and132 supplied period attempts. A selected30-day Absa analysis retains380 attempts and its source dates in Ask. An invalid custom range after rewind gives guidance without crashing. Missing-source controls remain explicit and restorable.
Desktop and390px mobile layouts were visually checked. Today has no large charts. Explore has four headline analytics, with raw details collapsed. No horizontal page overflow at390px. Reports, evidence and incident response retain the synthetic-data boundary. All primary navigation and global Ask are reachable on mobile. The existing37 tests do not exercise a live language model or production APIs; these remain outside the standalone demo.
After publication, refresh the same Site, confirm the four-item navigation, reset to08:00 for a calm starting briefing, then jump to10:42 to see one connected issue. Use Investigate and Ask about this. A saved simulation state may reopen at a later date; Reset demo starts a fresh rehearsal. A restore-data banner indicates an intentionally saved failure-state test.
Live Brief validation
47 automated checks pass, including contextual weekday/week/month comparisons, independent quantiles and histogram reconciliation, all four frozen report horizons, editorial deduplication, follow source identity and cutoff handling, missing/partial coverage, operational question routing, and rewind protection. Existing incident/SOP/SLA and source-data checks remain passing.
Browser verification covers navigation, in-place periods, distribution drilldown, contextual Ask, participant following, incident investigation, recovery with 11 open customer outcomes, report snapshots and responsive layout.
Today score and issue browsing update
51 automated checks pass. New checks reconcile generated financial totals independently at opening, incident, recovery and replay end; enforce the exact live coverage boundary; retain cases when the transaction source is unavailable; gate the participant-support case by event time; group SLA obligations under their issue; and freeze Today answers to the original report snapshot. Browser checks cover two-issue Back/Next navigation without changing the clock, participant evidence, the optional watchlist, frozen scores and responsive layout.
Presenter panel update
All 51 existing automated checks still pass. Browser checks confirm that an older saved walkthrough state does not expose the panel on reload; milestone jumps update the score and close the panel; Next and Back step navigate to the corresponding scene; starting replay returns to the management view; reopening Presenter pauses it. Mobile verification at 390px shows no horizontal page overflow and all panel controls remain reachable.
After deployment, refresh the Site: the Brief should begin immediately below its header. Open Presenter to find the simulation clock and walkthrough; choose 10:42 and expect two active issues. Simulation time and state still persist locally. This change does not connect production data or alter the Site audience.
Report daily-snapshot removal
The existing 51 automated checks pass. Browser verification covers Weekly performance and its drilldown, a previously saved Morning Brief, and new Monthly and Quarterly reports: none displays the live Today score, service health, current issues or morning-today block. The shared report renderer also drives print and HTML download. The live Brief retains its Today score and issue navigation.
After publication, refresh, open Reports and select Weekly Brief. Its first content should be the last seven complete days and their figures, with no current-day snapshot above them. Existing saved reports receive this presentation automatically.