Agent Detection Lite
Versions
Current version
0.4.2 (2026060500)
0.4.2
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026060500
Version release name: 0.4.2
Maturity: Beta
Supported Moodle versions: 4.4, 4.5, 5.0, 5.1, 5.2
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect_lite
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Changelog
All notable changes to local_agentdetect (Lite) are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.4.2] - 2026-05-31
Security — Third-party security review remediation (MOO-12)
- 🔴 High — Stored XSS via client-controlled
verdict. The verdict field
was accepted asPARAM_RAWand rendered into the admin report's
default-case branch without escaping; an authenticated user could store a
JavaScript payload via a crafted beacon or AJAX call that fired when a
manager later viewed the report.signal_manager::store_signal()now
rejects any verdict outside theVERDICT_*allowlist with
invalid_parameter_exception.signaltypeis similarly enum-checked
(fingerprint/interaction/combined/unload). Both
report.phpandcoursereport.phpnow escape any unknown verdict in
their fallback render path as defense in depth for any legacy stored
rows. - 🟠 Medium — Course report & AJAX flag lookup did not enforce target-user
visibility or group boundaries. A teacher with
local/agentdetect:viewreportscould load the per-student detail page
for any user ID, and the AJAXlocal_agentdetect_get_user_flags
service trusted any user ID list the caller supplied. The detail path
now requires the target user to be enrolled in the course and visible
under the active group mode (is_enrolled+groups_user_groups_visible).
The AJAX service filters the input user-ID list to course-visible
participants before querying, and no longer returns NULL-context
(system-level) records to course-scoped callers. - 🟠 Medium — Course detail view could surface signal data from another
context with the same browser session ID. The second query that loaded
the highest-scoring combined record per session filtered only by
sessionid+userid. Browser session IDs persist for ~30 minutes and
can span multiple courses, so the query could pull a record tagged with
a context the viewer had no access to and render its verdict /
explanations on the current report. The query now also restricts
s.contextidto the course's context tree.
Added
- New language string
error:cannotviewuserfor the visibility-rejection
path in the course report detail view. - Regression tests covering verdict + signaltype allowlist rejection,
get_user_flagsparticipant filtering and NULL-context gating, and
course-report detail access control under enrolment + separate groups.
[0.4.1] - 2026-05-17
Fixed — Moodle 5.0 debugging warnings
fullname()debugging notice "name fields are missing from the user object"
on the Signals page. Addedfirstnamephonetic,lastnamephonetic,middlename,
andalternatenameto all user-record SELECTs feeding intofullname()
(admin signals report, course report, signal manager).Undefined property: stdClass::$valueandround(): Passing nullwarnings
on the Signals page details column. Anomaly fields are now guarded with
null-coalescing defaults before being passed toround().
Fixed — Third-party security audit
- Beacon endpoint missing context access check.
beacon.phpnow calls
require_login()against the course/cm derived from the submitted
contextid, mirroring the external function path. Prevents authenticated
users from posting signals tagged with contexts they have no access to. - Double HTML-escaping of course/module names in the context column
caused names containing&,<, or>to render as literal entities
(R&D 101instead ofR&D 101). Removed redundants()/format_string()
wrapping and now truncate raw values before single-encoding for output. - Dead
pageUrl/pageTitlereferences in the admin signals report
referenced fields the Lite client never emits. Removed the table column,
link-rendering block, JSON download keys, and the unused$string['page']
language string. update_user_flag()read-modify-write now runs inside a delegated
transaction. The(userid, contextid)unique index can't constrain
duplicate NULL-context rows on MySQL/MariaDB or PostgreSQL, so the
transaction provides atomicity against in-flight failures and partial
serialisation against concurrent writes.- Magic string
'low_suspicion'is now a class constant
(signal_manager::FLAG_LOW_SUSPICION) alongsideFLAG_SUSPECTED,
FLAG_CONFIRMED, andFLAG_CLEARED. PHP literals replaced; the JS
badge renderer and language key still match the string value.
Changed — Audit hardening (informational findings)
- Privacy provider no longer unconditionally adds the system context to
every user's contextlist.get_contexts_for_userid()checks for NULL-context
signals or flags before adding it, so privacy tooling no longer reports
"data exists at system context" for users with none. - Backup definition no longer carries
useragentoripaddressfields
in signal records. Personal identifiers do not need to travel with course
backups; per-user export and deletion of these fields on the live database
remains covered by the Privacy API.
Removed
fix-indent.js— one-off developer utility that was never executed at
runtime and not referenced from any other file. Should not have been in
distributable releases.
[0.4.0] - 2026-04-19
- Initial baseline used for this changelog.
0.4.2 (2026053100)
0.4.2
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026053100
Version release name: 0.4.2
Maturity: Beta
Supported Moodle versions: 4.4, 4.5, 5.0, 5.1, 5.2
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect_lite
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Changelog
All notable changes to local_agentdetect (Lite) are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.4.2] - 2026-05-31
Security — Third-party security review remediation (MOO-12)
- 🔴 High — Stored XSS via client-controlled
verdict. The verdict field
was accepted asPARAM_RAWand rendered into the admin report's
default-case branch without escaping; an authenticated user could store a
JavaScript payload via a crafted beacon or AJAX call that fired when a
manager later viewed the report.signal_manager::store_signal()now
rejects any verdict outside theVERDICT_*allowlist with
invalid_parameter_exception.signaltypeis similarly enum-checked
(fingerprint/interaction/combined/unload). Both
report.phpandcoursereport.phpnow escape any unknown verdict in
their fallback render path as defense in depth for any legacy stored
rows. - 🟠 Medium — Course report & AJAX flag lookup did not enforce target-user
visibility or group boundaries. A teacher with
local/agentdetect:viewreportscould load the per-student detail page
for any user ID, and the AJAXlocal_agentdetect_get_user_flags
service trusted any user ID list the caller supplied. The detail path
now requires the target user to be enrolled in the course and visible
under the active group mode (is_enrolled+groups_user_groups_visible).
The AJAX service filters the input user-ID list to course-visible
participants before querying, and no longer returns NULL-context
(system-level) records to course-scoped callers. - 🟠 Medium — Course detail view could surface signal data from another
context with the same browser session ID. The second query that loaded
the highest-scoring combined record per session filtered only by
sessionid+userid. Browser session IDs persist for ~30 minutes and
can span multiple courses, so the query could pull a record tagged with
a context the viewer had no access to and render its verdict /
explanations on the current report. The query now also restricts
s.contextidto the course's context tree.
Added
- New language string
error:cannotviewuserfor the visibility-rejection
path in the course report detail view. - Regression tests covering verdict + signaltype allowlist rejection,
get_user_flagsparticipant filtering and NULL-context gating, and
course-report detail access control under enrolment + separate groups.
[0.4.1] - 2026-05-17
Fixed — Moodle 5.0 debugging warnings
fullname()debugging notice "name fields are missing from the user object"
on the Signals page. Addedfirstnamephonetic,lastnamephonetic,middlename,
andalternatenameto all user-record SELECTs feeding intofullname()
(admin signals report, course report, signal manager).Undefined property: stdClass::$valueandround(): Passing nullwarnings
on the Signals page details column. Anomaly fields are now guarded with
null-coalescing defaults before being passed toround().
Fixed — Third-party security audit
- Beacon endpoint missing context access check.
beacon.phpnow calls
require_login()against the course/cm derived from the submitted
contextid, mirroring the external function path. Prevents authenticated
users from posting signals tagged with contexts they have no access to. - Double HTML-escaping of course/module names in the context column
caused names containing&,<, or>to render as literal entities
(R&D 101instead ofR&D 101). Removed redundants()/format_string()
wrapping and now truncate raw values before single-encoding for output. - Dead
pageUrl/pageTitlereferences in the admin signals report
referenced fields the Lite client never emits. Removed the table column,
link-rendering block, JSON download keys, and the unused$string['page']
language string. update_user_flag()read-modify-write now runs inside a delegated
transaction. The(userid, contextid)unique index can't constrain
duplicate NULL-context rows on MySQL/MariaDB or PostgreSQL, so the
transaction provides atomicity against in-flight failures and partial
serialisation against concurrent writes.- Magic string
'low_suspicion'is now a class constant
(signal_manager::FLAG_LOW_SUSPICION) alongsideFLAG_SUSPECTED,
FLAG_CONFIRMED, andFLAG_CLEARED. PHP literals replaced; the JS
badge renderer and language key still match the string value.
Changed — Audit hardening (informational findings)
- Privacy provider no longer unconditionally adds the system context to
every user's contextlist.get_contexts_for_userid()checks for NULL-context
signals or flags before adding it, so privacy tooling no longer reports
"data exists at system context" for users with none. - Backup definition no longer carries
useragentoripaddressfields
in signal records. Personal identifiers do not need to travel with course
backups; per-user export and deletion of these fields on the live database
remains covered by the Privacy API.
Removed
fix-indent.js— one-off developer utility that was never executed at
runtime and not referenced from any other file. Should not have been in
distributable releases.
[0.4.0] - 2026-04-19
- Initial baseline used for this changelog.
0.4.1 (2026051700)
0.4.1
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026051700
Version release name: 0.4.1
Maturity: Beta
Supported Moodle versions: 4.4, 4.5, 5.0, 5.1, 5.2
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect_lite
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Changelog
All notable changes to local_agentdetect (Lite) are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.4.1] - 2026-05-17
Fixed — Moodle 5.0 debugging warnings
fullname()debugging notice "name fields are missing from the user object"
on the Signals page. Addedfirstnamephonetic,lastnamephonetic,middlename,
andalternatenameto all user-record SELECTs feeding intofullname()
(admin signals report, course report, signal manager).Undefined property: stdClass::$valueandround(): Passing nullwarnings
on the Signals page details column. Anomaly fields are now guarded with
null-coalescing defaults before being passed toround().
Fixed — Third-party security audit
- Beacon endpoint missing context access check.
beacon.phpnow calls
require_login()against the course/cm derived from the submitted
contextid, mirroring the external function path. Prevents authenticated
users from posting signals tagged with contexts they have no access to. - Double HTML-escaping of course/module names in the context column
caused names containing&,<, or>to render as literal entities
(R&D 101instead ofR&D 101). Removed redundants()/format_string()
wrapping and now truncate raw values before single-encoding for output. - Dead
pageUrl/pageTitlereferences in the admin signals report
referenced fields the Lite client never emits. Removed the table column,
link-rendering block, JSON download keys, and the unused$string['page']
language string. update_user_flag()read-modify-write now runs inside a delegated
transaction. The(userid, contextid)unique index can't constrain
duplicate NULL-context rows on MySQL/MariaDB or PostgreSQL, so the
transaction provides atomicity against in-flight failures and partial
serialisation against concurrent writes.- Magic string
'low_suspicion'is now a class constant
(signal_manager::FLAG_LOW_SUSPICION) alongsideFLAG_SUSPECTED,
FLAG_CONFIRMED, andFLAG_CLEARED. PHP literals replaced; the JS
badge renderer and language key still match the string value.
Changed — Audit hardening (informational findings)
- Privacy provider no longer unconditionally adds the system context to
every user's contextlist.get_contexts_for_userid()checks for NULL-context
signals or flags before adding it, so privacy tooling no longer reports
"data exists at system context" for users with none. - Backup definition no longer carries
useragentoripaddressfields
in signal records. Personal identifiers do not need to travel with course
backups; per-user export and deletion of these fields on the live database
remains covered by the Privacy API.
Removed
fix-indent.js— one-off developer utility that was never executed at
runtime and not referenced from any other file. Should not have been in
distributable releases.
[0.4.0] - 2026-04-19
- Initial baseline used for this changelog.
0.4.0 (2026041900)
0.4.0
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026041900
Version release name: 0.4.0
Maturity: Beta
Supported Moodle versions: 4.4, 4.5, 5.0, 5.1, 5.2
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect_lite
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Agent Detection Lite (local_agentdetect)
A lightweight Moodle local plugin that detects automated browser agents (e.g. Perplexity Comet, Claude in Chrome) during quizzes.
This is the Lite edition: quiz-only, no DOM mutation observer, compact data collection and storage. A commercial Pro edition adds page mutation detection (AI helper extensions), Open Claw detection, autotyper identification, and expanded surface coverage.
Detection approach
- Browser fingerprinting
- Interaction analysis
- Agentic signals
Requirements
- Moodle 4.5 or later (uses the
core\hook\output\before_footer_html_generationhook). - PHP 8.1 or later.
Installation
- Copy the plugin directory into
local/agentdetect/in your Moodle installation. - Visit Site Administration ' Notifications to trigger the database install.
- Configure at Site Administration ' Plugins ' Local plugins ' Agent Detection.
What Lite does not include
| Feature | Lite | Pro |
|---|---|---|
| Quiz interaction + fingerprint detection | " | " |
| Agentic Browser signals | " | " |
| Open Claw signals | — | " |
| DOM mutation observer (AI helper extensions) | — | " |
| Autotyper identification | — | " |
| Assignment / forum / broader coverage | — | " |
| Expanded fingerprint surface + extension probing | — | " |
Settings
| Setting | Description | Default |
|---|---|---|
| Enable agent detection | Master switch | Off |
| Detection threshold | Score above which sessions are flagged | 70 |
| Minimum report score | Only report signals at or above this score | 10 |
| Report interval (ms) | How often the browser reports to the server | 30000 |
| Debug mode | Browser console logging | Off |
Lite monitors quiz pages only (mod-quiz-*) by design.
Capabilities
| Capability | Context | Default roles |
|---|---|---|
| local/agentdetect:viewreports | Course | Teacher, Editing teacher, Manager |
| local/agentdetect:manageflags | Course | Editing teacher, Manager |
| local/agentdetect:viewsignals | System | Manager |
| local/agentdetect:configure | System | Manager |
Reports
- Admin report: Site Administration ' Reports ' Agent Detection (requires
viewsignals). - Course report: Course navigation ' Reports ' Agent Detection Report (requires
viewreports). - Quiz badges: Appear next to student names on quiz review pages when flags exist.
Privacy
Stores user IDs, IP addresses, user agent strings, summary scores, and top-weighted anomaly names. Implements the Moodle privacy API for GDPR data export and deletion.
Building the JS bundle
The plugin ships with pre-built amd/build/*.min.js files. To rebuild after editing amd/src/*.js:
npm install
node build.js
CI rebuilds via moodle-plugin-ci grunt on each push.
License
GNU GPL v3 or later — see COPYING.
0.3.2 (2026022500)
0.3.2
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026022500
Version release name: 0.3.2
Maturity: Beta
Supported Moodle versions: 4.4, 4.5, 5.0, 5.1
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Agent Detection (local_agentdetect)
A Moodle local plugin that detects automated browser agents (e.g., Perplexity Comet) during quizzes and assessments.
Description
Agent Detection monitors browser fingerprints and user interaction patterns to identify sessions driven by AI-powered browser agents rather than human users. It uses a multi-layered detection approach:
- Browser fingerprinting - Detects WebDriver flags, headless browser indicators, and known automation extensions.
- Interaction analysis - Monitors mouse movement, click patterns, keystroke timing, and scroll behaviour to identify non-human interaction patterns.
- DOM injection detection - (Coming soon )Uses MutationObserver to detect elements injected by AI helper browser extensions.
- Comet-specific signals - Targeted detection for Perplexity's Comet agentic browser including centre-precision clicks, teleport patterns, zero keystrokes, and per-page mouse ratio analysis.
Requirements
- Moodle 4.3 or later
- PHP 8.0 or later
Installation
- Copy the
agentdetectdirectory intolocal/in your Moodle installation. - Visit Site Administration > Notifications to trigger the database installation.
- Configure the plugin at Site Administration > Plugins > Local plugins > Agent Detection.
Configuration
| Setting | Description | Default |
|---------|-------------|---------|
| Enable agent detection | Master on/off switch | Off |
| Detection threshold | Score (0-100) above which sessions are flagged | 70 |
| Minimum report score | Only report signals at or above this score | 10 |
| Report interval | How often to send detection reports (ms) | 30000 |
| Page types to monitor | Comma-separated page types with wildcard support | mod-assign-*,mod-quiz-* |
| Collect interaction data | Enable behavioural analysis | On |
| Debug mode | Enable browser console logging | Off |
Capabilities
| Capability | Context | Default roles | Description |
|------------|---------|---------------|-------------|
| local/agentdetect:viewreports | Course | Teacher, Editing teacher, Manager | View agent detection reports for a course |
| local/agentdetect:manageflags | Course | Editing teacher, Manager | Manage user detection flags |
| local/agentdetect:viewsignals | System | Manager | View detailed signal data (admin report) |
| local/agentdetect:configure | System | Manager | Configure plugin settings |
Reports
- Admin report: Available at Site Administration > Reports > Agent Detection. Shows all signals and flags across the site. Requires
viewsignalscapability. - Course report: Available in the course navigation Reports section. Shows flagged students enrolled in the course. Requires
viewreportscapability. - Quiz badges: Visual indicators appear next to student names on quiz review pages when flags exist.
Privacy
This plugin stores personal data including user IDs, IP addresses, user agent strings, and behavioural interaction signals. It implements the Moodle privacy API (GDPR) with full support for data export and deletion.
License
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
See COPYING for details.
0.3.1 (2026021800)
0.3.1
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026021800
Version release name: 0.3.1
Maturity: Beta
Supported Moodle versions: 4.5, 5.0, 5.1
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Agent Detection (local_agentdetect)
A Moodle local plugin that detects automated browser agents (e.g., Perplexity Comet) during quizzes and assessments.
Description
Agent Detection monitors browser fingerprints and user interaction patterns to identify sessions driven by AI-powered browser agents rather than human users. It uses a multi-layered detection approach:
- Browser fingerprinting - Detects WebDriver flags, headless browser indicators, and known automation extensions.
- Interaction analysis - Monitors mouse movement, click patterns, keystroke timing, and scroll behaviour to identify non-human interaction patterns.
- DOM injection detection - (Coming soon )Uses MutationObserver to detect elements injected by AI helper browser extensions.
- Comet-specific signals - Targeted detection for Perplexity's Comet agentic browser including centre-precision clicks, teleport patterns, zero keystrokes, and per-page mouse ratio analysis.
Requirements
- Moodle 4.3 or later
- PHP 8.0 or later
Installation
- Copy the
agentdetectdirectory intolocal/in your Moodle installation. - Visit Site Administration > Notifications to trigger the database installation.
- Configure the plugin at Site Administration > Plugins > Local plugins > Agent Detection.
Configuration
| Setting | Description | Default |
|---------|-------------|---------|
| Enable agent detection | Master on/off switch | Off |
| Detection threshold | Score (0-100) above which sessions are flagged | 70 |
| Minimum report score | Only report signals at or above this score | 10 |
| Report interval | How often to send detection reports (ms) | 30000 |
| Page types to monitor | Comma-separated page types with wildcard support | mod-assign-*,mod-quiz-* |
| Collect interaction data | Enable behavioural analysis | On |
| Debug mode | Enable browser console logging | Off |
Capabilities
| Capability | Context | Default roles | Description |
|------------|---------|---------------|-------------|
| local/agentdetect:viewreports | Course | Teacher, Editing teacher, Manager | View agent detection reports for a course |
| local/agentdetect:manageflags | Course | Editing teacher, Manager | Manage user detection flags |
| local/agentdetect:viewsignals | System | Manager | View detailed signal data (admin report) |
| local/agentdetect:configure | System | Manager | Configure plugin settings |
Reports
- Admin report: Available at Site Administration > Reports > Agent Detection. Shows all signals and flags across the site. Requires
viewsignalscapability. - Course report: Available in the course navigation Reports section. Shows flagged students enrolled in the course. Requires
viewreportscapability. - Quiz badges: Visual indicators appear next to student names on quiz review pages when flags exist.
Privacy
This plugin stores personal data including user IDs, IP addresses, user agent strings, and behavioural interaction signals. It implements the Moodle privacy API (GDPR) with full support for data export and deletion.
License
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
See COPYING for details.
0.3.0 (2026021700)
0.3.0
Plugin type: Local plugins
Frankenstyle component name: local_agentdetect
Version build number: 2026021700
Version release name: 0.3.0
Maturity: Beta
Supported Moodle versions: 4.5, 5.0
Repository URL (Git): https://github.com/cursiveinc/moodle-local_agentdetect
Repository branch:
Repository tag:
Issue/bug tracker URL: https://github.com/cursiveinc/moodle-local_agentdetect_lite/issues
Agent Detection (local_agentdetect)
A Moodle local plugin that detects automated browser agents (e.g., Perplexity Comet) during quizzes and assessments.
Description
Agent Detection monitors browser fingerprints and user interaction patterns to identify sessions driven by AI-powered browser agents rather than human users. It uses a multi-layered detection approach:
- Browser fingerprinting - Detects WebDriver flags, headless browser indicators, and known automation extensions.
- Interaction analysis - Monitors mouse movement, click patterns, keystroke timing, and scroll behaviour to identify non-human interaction patterns.
- DOM injection detection - (Coming soon )Uses MutationObserver to detect elements injected by AI helper browser extensions.
- Comet-specific signals - Targeted detection for Perplexity's Comet agentic browser including centre-precision clicks, teleport patterns, zero keystrokes, and per-page mouse ratio analysis.
Requirements
- Moodle 4.3 or later
- PHP 8.0 or later
Installation
- Copy the
agentdetectdirectory intolocal/in your Moodle installation. - Visit Site Administration > Notifications to trigger the database installation.
- Configure the plugin at Site Administration > Plugins > Local plugins > Agent Detection.
Configuration
| Setting | Description | Default |
|---------|-------------|---------|
| Enable agent detection | Master on/off switch | Off |
| Detection threshold | Score (0-100) above which sessions are flagged | 70 |
| Minimum report score | Only report signals at or above this score | 10 |
| Report interval | How often to send detection reports (ms) | 30000 |
| Page types to monitor | Comma-separated page types with wildcard support | mod-assign-*,mod-quiz-* |
| Collect interaction data | Enable behavioural analysis | On |
| Debug mode | Enable browser console logging | Off |
Capabilities
| Capability | Context | Default roles | Description |
|------------|---------|---------------|-------------|
| local/agentdetect:viewreports | Course | Teacher, Editing teacher, Manager | View agent detection reports for a course |
| local/agentdetect:manageflags | Course | Editing teacher, Manager | Manage user detection flags |
| local/agentdetect:viewsignals | System | Manager | View detailed signal data (admin report) |
| local/agentdetect:configure | System | Manager | Configure plugin settings |
Reports
- Admin report: Available at Site Administration > Reports > Agent Detection. Shows all signals and flags across the site. Requires
viewsignalscapability. - Course report: Available in the course navigation Reports section. Shows flagged students enrolled in the course. Requires
viewreportscapability. - Quiz badges: Visual indicators appear next to student names on quiz review pages when flags exist.
Privacy
This plugin stores personal data including user IDs, IP addresses, user agent strings, and behavioural interaction signals. It implements the Moodle privacy API (GDPR) with full support for data export and deletion.
License
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
See COPYING for details.