AI engineer·Durban, South Africa·UTC+2

Darrshan Govender Industrial AI, built to be evaluated, audited and trusted.

I build AI systems that engineering and operations teams can defend. My current focus is heavy industry: predictive maintenance, knowledge assistants that answer only from controlled documents, and agents that draft work and stop for human approval before anything is acted on.

  • Predictive maintenanceAnomalies and remaining useful life
  • Knowledge assistantsCited, bilingual, access-controlled
  • Supervised agentsRule-based verifier, human approval

Available for contract and fractional work. I am in Durban (UTC+2), one hour behind Riyadh, so the working day overlaps almost entirely with Gulf hours.

Selected results

All on synthetic data or a simulated model. What each number cannot show is written next to it in the repository.

  • 79 / 80injected failures warned 3+ days ahead, against 70 for the better of two tuned fixed alarm limits, at about two-thirds of the cost.asset-health · 8 held-out seeds
  • 0 / 4,603access-control leaks across probes of the document store. Authentication itself is out of scope.plant-copilot · synthetic corpus
  • 99.5%of seeded unsafe work-order drafts blocked (1,195 of 1,201). The six it misses are listed.maintenance-agent · rule-based verifier
  • 15 / 15scripted approval-gate bypass attempts refused, and 0 of 55 correct drafts wrongly blocked.maintenance-agent · scripted attacks

01/Industrial AI

Three systems for the maintenance loop, each built to be checked.

An alert is raised, the controlled procedure is found and quoted, a work order is drafted, and a person decides. Each repository runs offline with no API keys, states what its results were measured on, and lists its limitations.

asset-healthraises the alert, with remaining useful life as an interval
plant-copilotsupplies the controlled procedure, cited by clause and revision
maintenance-agentdrafts the work order and waits for a person

The three are separate repositories that share no code. The hand-offs are adapter interfaces, not a tested integration, and the README of each says so.

asset-healthSynthetic data

Predictive maintenance, scored one failure at a time

Regime-aware anomaly detection, remaining useful life with an uncertainty interval, cost-aware alerting and structured work-order recommendations for mining and processing assets, run on a seeded synthetic fleet.

Key result
On 80 held-out synthetic failures: 79 warned 3+ days ahead vs 70 for the better of two tuned fixed-limit baselines, at about two-thirds of that baseline's illustrative cost. Still ahead when failure signatures are scaled to 30%; behind at 15%, and the README shows that curve.
Cannot show
Anything about a real plant. The fleet is simulated, so the results describe the method, not a site.

Source and results on GitHub →

plant-copilotSynthetic corpus

A bilingual procedures assistant that refuses when the documents are silent

Arabic and English assistant for SOPs and HSE procedures. Answers only from controlled documents, cites the exact clause and revision, applies access control before retrieval, and refuses when the answer is not there.

Key result
0 access-control leaks in 4,603 probes; every safety-critical clause quoted verbatim (64 of 64, against a simulated model that rewords everything); 68% correct on held-out questions it was never tuned on.
Cannot show
Real documents: the corpus is 37 synthetic documents. The groundedness check catches 99.5% of the error types it was designed for and 15.7% of those it was not.

Source and results on GitHub →

maintenance-agentSynthetic data

A supervised maintenance-planning agent with a safety case

Takes an asset-health alert, retrieves the relevant procedures with citations, drafts a work order, checks it with a rule-based safety verifier, and stops at a human approval gate. Every tool call is logged and replayable.

Key result
Blocked 99.5% of seeded unsafe drafts, with the six it misses listed; 0 of 55 correct drafts wrongly blocked; 15 of 15 approval-gate bypass attempts refused.
Cannot show
That the rules are complete. A fully cited draft for the wrong failure mode still passes, which is why a person signs.

Source and results on GitHub →

02/Replays

Run the evidence yourself.

Both replays are driven by real output from the repositories, exported by the scripts in this site's tools/ folder. Nothing is hand-drawn, and everything is synthetic.

asset-health: a pump impeller wearing out

Synthetic data

A slice of the committed example (seed 42, replayed as of 28 July 2025). Press play: the fused detection score rises through its alert threshold, the pipeline opens an alert and starts issuing remaining-useful-life intervals, and at the snapshot it drafts a work order. Then the simulator's hidden answer key is revealed, so you can see where the injected failure actually fell.

Synthetic

Source: asset-health, simulate --seed 42 then report --as-of 2025-07-28, exported by tools/export_asset_health.py. PMP-03 is the second pump in the same run: its injected failure lands just outside its interval, and the README reports that too.

maintenance-agent: from alert to a human-gated work order

Synthetic data

A real run of the agent on a synthetic alert, replayed from its own hash-chained audit log. The planner is rule-based, with no model in the loop, and the verifier is 16 rules. Step through it, then click Approve to open the gate. Switch to the seeded unsafe draft to see a final isolation step removed, the verifier's own reason for blocking it, and the gate refusing.

Synthetic
  1. plan
  2. gather
  3. draft
  4. verify
  5. await approval
  6. release

Audit log, hash-chained

    each record stores the previous record's SHA-256, shortened to 8 hex characters here
    AWAITING APPROVALneeds a signature
    CMMSno work order

    Approve reveals the recorded, signed approval from the real run. Your browser signs nothing.

    Source: maintenance-agent, alert ALR-1004 (synthetic slurry pump), fixed clock, rule-based planner, exported by tools/export_maintenance_agent.py. Approver keys were generated for the export and nothing here is plant data. Timestamps are omitted from the log; hashes are shortened.

    03/LLM infrastructure

    Cost, safety and reliability controls around the model.

    The parts a model should not be trusted to do for itself. Each repository runs offline and says what its number was measured on.

    guardrailexternal benchmark

    Safety gateway for model inputs and outputs: prompt-injection detection, PII redaction, groundedness checks and structured-output repair behind one policy layer. Saudi National ID/Iqama, IBAN and mobile detection with checksums.

    On the held-out test splits of two public datasets (whose training splits informed its patterns)59.6%of 193 labelled attacks flagged (95% CI 52.5 to 66.3), with 0 false alarms on 178 benign prompts (upper bound 2.1%).
    Limitation, as written in the READMEThe detector is 46 regular expressions. Paraphrase, translation and encoded attacks pass, so it is one layer of defence, never the only control.

    cascade

    Verifier-gated model cascade: answer with the cheapest model first, escalate only when verification fails, fit the thresholds offline. Benchmarked on a simulated model.

    ResultCounts every verifier call, priced from the list prices in the repo. A 2-tier cascade is 5% cheaper at 99% of the strong model's accuracy; the 3-tier one costs more, and the README shows why.

    context-compress

    Prompt and RAG context compression with a fact-recall evaluator, so savings are reported next to what was lost.

    Result48% fewer tokens with every fact kept, where naive truncation saves 57% but keeps 21.7%. Synthetic RAG set.

    sql-guardrails

    Makes LLM-written SQL safe to execute: sqlglot AST allowlisting, read-only enforcement and optional EXPLAIN cost limits. Ships an adversarial corpus.

    ResultExecutes only the guard's own normalised SQL, so a parser disagreement between guard and database cannot become a bypass. 22 functions blocked permanently, beyond the reach of config.

    mcp-gateway

    MCP server wrapper with API-key auth, tenant isolation, per-tool guardrails, rate limits and an audit log. Serves the 2026-07-28 MCP revision and the 2025 revisions side by side.

    ResultSTRIDE threat model; 253 tests.

    agent-runtime

    Checkpointed state-machine executor for agents: resume after a crash, identical-call loop breaker, model fallback chain, schema self-correction.

    StatusDesign reference; no headline number.

    thinking-loop

    Published test-time reasoning strategies behind one interface, adjudicated by a critic, under hard token, time and cost budgets.

    StatusBenchmark harness; a real-model run needs your own key.

    rag-eval-harness

    Faithfulness, answer relevance and recall@k for RAG pipelines, wired into CI so a regression fails the build.

    StatusA CI gate, not a benchmark.

    More on GitHub: domain work such as South African lease abstraction and tenant affordability scoring, a WhatsApp agent kit with POPIA-aware redaction, and smaller RAG, routing and evaluation libraries.

    04/How I work

    Four habits that make the work checkable.

    1. Offline by default

      Tests, examples and benchmarks need no API keys and no network. Hosted-model paths are optional extras, so data can stay inside the client environment.

      no key, no network: pip install, then run
    2. Every number has a script

      Results are regenerated by a script in the repository and say what they were measured on: synthetic data, a simulated model, or a bundled corpus.

      e.g. python benchmarks/run.py rewrites the README tables
    3. Controls sit outside the model

      Rule-based verifiers, AST allowlists, access control before retrieval and human approval gates, not instructions in a prompt.

      the verifier above is a pure function of two JSON documents
    4. Limitations are written down

      Each README has a Limitations section that says what changes on real data.

      and a known-gaps list that stays in the denominator
    An adversarial review found that the earlier verifier passed a pump-seal draft with no lock-out and a mill entry with no confined-space permit. None of these were in the seed space, so the earlier 100% said nothing about them. They are fixed.
    From the maintenance-agent README. The point of writing it down is that you can check the fix, and the figure to quote is now 99.5%, not 100%.

    05/Contact

    If your engineers will ask “how do you know?”, let’s talk.

    I am available for contract and fractional work: predictive maintenance, document assistants and supervised agents where the evaluation and the controls matter as much as the model. I run Agulhas Code, an AI engineering studio in Durban.