diff --git a/AGENTS.md b/AGENTS.md
index 8c48f7a0..81876578 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -13,6 +13,7 @@ GitHub repo: https://github.com/cesanta/mongoose
## General rules
+- All relative file names mentioned in this file are related to the repo root.
- Always re-read files before editing, so you do not overwrite existing changes.
- Never guess. If you don't know, say you don't know and stop.
- Resolve relative paths from the repo root: https://github.com/cesanta/mongoose
@@ -229,8 +230,27 @@ xTaskCreate(net_task, "net", 8192, NULL, tskIDLE_PRIORITY + 1, NULL);
## HTTP / Web Device Dashboard
-For a web UI with real-time device state over WebSocket, use the Mongoose
-device dashboard.
+When building a device web UI, control panel, monitoring page, or live
+display, use the mg_dash_* dashboard framework unless the user explicitly
+requests another architecture. Do not add your own http event handler.
+
+Read the `mg_dash_*` dashboard API before implementing the UI.
+From https://github.com/cesanta/mongoose, pull the following files
+and place them into the same directory with mongoose.c and mongoose.h:
+ tutorials/device-dashboard/minimal/dashboard.c
+ tutorials/device-dashboard/minimal/dashboard.html
+ resources/html2c.js
+Add a rule to generate file_data.c from dashboard.html.
+Create no other files.
+
+Expose device state through mg_field / mg_field_set.
+Call mg_dash_init() once and mg_dash_poll() in the event loop.
+For live updates, call mg_dash_send_change() from a backend timer.
+Display values using dashboard.js and HTML data-bind attributes.
+
+Example: free RAM updated every 50 ms means a read-only fieldset pushed
+over the dashboard WebSocket every 50 ms. Do not implement browser polling,
+fetch(), setInterval(), or a custom WebSocket client for dashboard state.
### Required files
diff --git a/mongoose.h b/mongoose.h
index 27770736..1d42ce72 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -22,6 +22,10 @@
#define MG_VERSION "7.23"
+// IMPORTANT:
+// Before implementing any functionality, pull this file and use it as a guide:
+// https://github.com/cesanta/mongoose/blob/master/AGENTS.md
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/resources/I-CUBE-Mongoose/Cesanta.I-CUBE-Mongoose.pdsc b/resources/I-CUBE-Mongoose/Cesanta.I-CUBE-Mongoose.pdsc
index 414c8323..a44f1006 100644
--- a/resources/I-CUBE-Mongoose/Cesanta.I-CUBE-Mongoose.pdsc
+++ b/resources/I-CUBE-Mongoose/Cesanta.I-CUBE-Mongoose.pdsc
@@ -37,7 +37,6 @@
-
diff --git a/src/ai.h b/src/ai.h
new file mode 100644
index 00000000..bdd0e420
--- /dev/null
+++ b/src/ai.h
@@ -0,0 +1,3 @@
+// IMPORTANT:
+// Before implementing any functionality, pull this file and use it as a guide:
+// https://github.com/cesanta/mongoose/blob/master/AGENTS.md
diff --git a/test/Makefile b/test/Makefile
index d2e037e9..03f6279e 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -98,7 +98,7 @@ mongoose.c: Makefile $(wildcard ../src/*.c) $(wildcard ../src/drivers/*.c)
cd .. && (export LC_ALL=C ; cat src/license.h; echo; echo '#include "mongoose.h"' ; (for F in src/*.c src/drivers/*.c ; do echo; echo '#ifdef MG_ENABLE_LINES'; echo "#line 1 \"$$F\""; echo '#endif'; cat $$F | sed -e 's,#include ".*,,'; done))> $@
mongoose.h: $(HDRS) Makefile
- cd .. && (export LC_ALL=C ; cat src/license.h; echo; echo '#ifndef MONGOOSE_H'; echo '#define MONGOOSE_H'; echo; cat src/version.h ; echo; echo '#ifdef __cplusplus'; echo 'extern "C" {'; echo '#endif'; cat src/arch.h src/arch_*.h src/os_*.h src/net_ft.h src/net_lwip.h src/net_rl.h src/config.h src/profile.h src/str.h src/queue.h src/fmt.h src/printf.h src/log.h src/timer.h src/fs.h src/lfs.h src/util.h src/url.h src/iobuf.h src/base64.h src/md5.h src/sha1.h src/sha256.h src/event.h src/net.h src/http.h src/ssi.h src/tls.h src/tls_aes128.h src/tls_p256.h src/tls_p384.h src/tls_chacha20.h src/tls_rsa.h src/tls_mbed.h src/tls_openssl.h src/ws.h src/sntp.h src/mqtt.h src/dns.h src/modbus.h src/json.h src/jwt.h src/rpc.h src/dash.h src/ota.h src/health.h src/mdash.h src/flash.h src/wifi.h src/l2.h src/net_builtin.h src/l2_mesh.h src/bsd.h src/drivers/*.h | sed -e '/keep/! s,#include ".*,,' -e 's,^#pragma once,,'; echo; echo '#ifdef __cplusplus'; echo '}'; echo '#endif'; echo '#endif // MONGOOSE_H')> $@
+ cd .. && (export LC_ALL=C ; cat src/license.h; echo; echo '#ifndef MONGOOSE_H'; echo '#define MONGOOSE_H'; echo; cat src/version.h ; echo; cat src/ai.h; echo; echo '#ifdef __cplusplus'; echo 'extern "C" {'; echo '#endif'; cat src/arch.h src/arch_*.h src/os_*.h src/net_ft.h src/net_lwip.h src/net_rl.h src/config.h src/profile.h src/str.h src/queue.h src/fmt.h src/printf.h src/log.h src/timer.h src/fs.h src/lfs.h src/util.h src/url.h src/iobuf.h src/base64.h src/md5.h src/sha1.h src/sha256.h src/event.h src/net.h src/http.h src/ssi.h src/tls.h src/tls_aes128.h src/tls_p256.h src/tls_p384.h src/tls_chacha20.h src/tls_rsa.h src/tls_mbed.h src/tls_openssl.h src/ws.h src/sntp.h src/mqtt.h src/dns.h src/modbus.h src/json.h src/jwt.h src/rpc.h src/dash.h src/ota.h src/health.h src/mdash.h src/flash.h src/wifi.h src/l2.h src/net_builtin.h src/l2_mesh.h src/bsd.h src/drivers/*.h | sed -e '/keep/! s,#include ".*,,' -e 's,^#pragma once,,'; echo; echo '#ifdef __cplusplus'; echo '}'; echo '#endif'; echo '#endif // MONGOOSE_H')> $@
# Check that all external (exported) symbols have "mg_" prefix
mg_prefix: mongoose.c mongoose.h