How do I know? Because I’ve done it.
Blackboard published a post late in 2025 which concluded (emphasis is mine):
AI Agents don’t show up as separate apps or users—they look identical to normal student activity in the LMS. Because they operate at the web interaction and automation layers—filling in forms, clicking buttons, making API calls, etc.—they fall outside what the LMS itself can control. Many are completely invisible to the platform.
It is true that current/standard LMS log data that Blackboard collects cannot differentiate between users. This is as true for Student A and Student B as it is for Student A and Agent A. In fact, this is why we built Cursive (ensuring the right student is the learner is an essential foundation for assessment validity).
But this is untrue when log data are expanded. This plugin expands log data locally to capture and finger print users using their browser and page interaction data (mouse movements, key presses, clicks), and identifies AI-mitigated access to your LMS by systems and agents like OpenClaw and it's derivatives.
- All data remains local (no API required)
- User sessions are not impacted
- Thresholds can be set by an administrator
Note:
- for operational security, the best version of this plugin is not available for download so please contact us for the best and latest version.
- a paid, more robust version of this plugin is available that covers AI extensions, Quiz Solvers, Open Claw, and more: contact us.
- this plugin can be part of a set, including an Authentication and Cursive Text Editor plugin which can be used to take automatic actions against Agents on the LMS.
- if you intend to use this to protect integrity of an examination please consider alternative/additional means (proctoring, in class exams, lockdown browsers).
Callback before_footer in local_agentdetect component should be migrated to new hook callback for core\hook\output\before_footer_html_generation
line 7229 of /lib/moodlelib.php: call to debugging()
line 7296 of /lib/moodlelib.php: call to {closure}()
line 71 of /lib/classes/hook/output/before_footer_html_generation.php: call to get_plugins_with_function()
line 974 of /lib/classes/output/core_renderer.php: call to core\hook\output\before_footer_html_generation->process_legacy_callbacks()
line ? of unknownfile: call to core\output\core_renderer->footer()
line 130 of /lib/classes/output/plugin_renderer_base.php: call to call_user_func_array()
line 325 of /admin/renderer.php: call to core\output\plugin_renderer_base->__call()
line 944 of /admin/index.php: call to core_admin_renderer->admin_notifications_page()
When I translated the english language strings for this plugin in AMOS,
I did not really know what the meaning of two English language strings:
report:fp | local_agentdetect , currently 'FP'
report:int | local_agentdetect , currently 'Int'
FP = fingerprint
Int = interaction
Hope that helps!