diff --git a/README.md b/README.md index c8fb55e..8322cea 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,27 @@ [](https://chrbailey.github.io/SAP-Transaction-Forensics/) +## The Core Insight + +> **Structured data tells you *what happened*. Unstructured text tells you *why*.** + +Every enterprise system generates two kinds of data. Structured transactions — +timestamps, amounts, stage changes, user IDs — tell you the official story. +Unstructured text — the emails, Slack threads, tickets, meeting notes, timesheets, +SOWs, and order notes that surround those transactions — tell you what *actually* +happened. **The gap between them is where fraud, waste, and dysfunction hide.** + +| Structured data says | Unstructured text reveals | +|---|---| +| "Deal in Negotiation for 6 months" | *"Customer said not ready — Sales moved it forward anyway. No sign-off."* | +| "Purchase Order created 03/15" | *"Requisition wasn't approved yet. Create the PO now, paperwork later."* | +| "Phase 2: On Track, Green" | *"We're 3 weeks behind. Tell the client we're on track while we figure it out."* | + +This tool correlates both sides and surfaces the contradictions. It has been used +on real engagements — see **[Field Case Studies](docs/CASE_STUDIES.md)** (3M+ ERP +records, $103K in waste found, ITGC/SOX violations) — and ships a synthetic demo so +you can watch the same detector classes fire without touching a real system. + ## The Problem Existing forensic tools ship with hardcoded rules. "Flag invoices over $X." "Alert on vendor master changes." These rules miss new patterns and fire on irrelevant ones. Every ERP is different. Every client's fraud signature is different. A static rule engine cannot keep up. @@ -59,6 +80,21 @@ Then ask Claude: *"Run a conformance check against the o2c-simple reference mode Full walkthrough: **[QUICKSTART.md](QUICKSTART.md)** · Five-question demo: **[scripts/demo-walkthrough.md](scripts/demo-walkthrough.md)** · Pattern discovery: **[pattern-discovery/README.md](pattern-discovery/README.md)** +## Proven in the Field + +Three real consulting engagements motivated this tool. Anonymized, but the figures +are actual. Full write-ups in **[docs/CASE_STUDIES.md](docs/CASE_STUDIES.md)**. + +| Engagement | What structured data showed | What the text/forensics revealed | Result | +|---|---|---|---| +| **Healthcare — NetSuite license audit** (289 users) | A clean user list | 8 dormant full-access licenses, ~53 departed employees still licensed, 4 "approve-only" users | **$103,896/yr** savings · 14.4× ROI · 0.8-mo payback | +| **MedTech — ticket forensics during acquisition** (2,525 tickets) | Normal operations | Dummy MRP transactions, mutating item numbers, "URGENT" escalation culture, 257 access-request tickets | Organizational stress invisible in the ERP, surfaced from text | +| **Connected hardware — high-growth ERP + ITGC** (3M+ records) | Orders shipped, invoiced, cleared | Credit holds overridden to ship anyway, **28.6%** account return rate, 7 admin users (one terminated), broken approval chains | SOX-relevant control gaps documented with evidence | + +Each maps to a detector class in this repo (segregation-of-duties, policy override, +temporal impossibility, reality-gap). The synthetic demo plants these same patterns +so you can see them fire with no access to a real system. + ## What This Is Not - **Not a governance tool.** For pre-execution approval of AI agent actions, see [PromptSpeak](https://github.com/chrbailey/promptspeak-mcp-server). diff --git a/demo/index.html b/demo/index.html index 33bdbd4..f4528c1 100644 --- a/demo/index.html +++ b/demo/index.html @@ -204,6 +204,25 @@ .cursor { display: inline-block; width: 8px; background: var(--low); animation: cur .9s steps(1) infinite; } @keyframes cur { 50% { opacity: 0; } } + /* Case studies */ + .case-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; } + .case { background: var(--surface); border: 1px solid var(--border); border-top: 3px solid var(--accent); border-radius: 14px; + padding: 20px; backdrop-filter: blur(6px); transition: transform .18s, box-shadow .18s; } + .case:hover { transform: translateY(-3px); box-shadow: 0 12px 40px rgba(0,0,0,0.4); } + .case.c-border-critical { border-top-color: var(--critical); } + .case.c-border-high { border-top-color: var(--high); } + .case.c-border-medium { border-top-color: var(--medium); } + .case-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 12px; } + .case-tag { font-family: var(--mono); font-size: 11px; color: var(--muted); } + .case-title { font-size: 16px; font-weight: 750; } + .case-headline { color: var(--text); font-size: 13.5px; margin-top: 6px; font-weight: 600; } + .case-stats { display: grid; grid-template-columns: repeat(2,1fr); gap: 8px; margin: 16px 0; } + .case-stats div { background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 9px; padding: 9px 10px; } + .case-stats b { display: block; font-size: 18px; font-weight: 800; font-variant-numeric: tabular-nums; } + .case-stats span { font-size: 10.5px; color: var(--dim); text-transform: uppercase; letter-spacing: 0.04em; } + .case-body { color: var(--muted); font-size: 12.5px; line-height: 1.7; } + .case-note { text-align: center; color: var(--dim); font-size: 12px; margin-top: 20px; font-style: italic; } + /* CTA */ .cta { text-align: center; padding: 60px 0; } .cta h3 { font-size: 30px; font-weight: 850; margin-bottom: 12px; } @@ -562,6 +581,60 @@
${esc(c.headline)}
+${esc(c.body)}
+The synthetic demo above shows the detectors firing on generated data. These are the actual consulting engagements that motivated them — anonymized, but the figures are real. Full write-ups →
+Company, individual, and email identifiers removed. Financial figures, ticket counts, and category distributions are actual. Used with permission for educational purposes.
+