diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 9d91db2..e8c40c6 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -199,6 +199,8 @@ Run sequence:
https://www.kernel.org/doc/html/latest/
- Project docs:
`docs/*.md`
+- System architecture diagram (Mermaid, procfs flow + kernel data sources):
+ `README.md` — Architecture Diagram section
---
diff --git a/README.md b/README.md
index 59778d0..e42fcde 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,7 @@
- [Release Binaries](#release-binaries)
- [Makefile Targets](#makefile-targets)
- [Testing](#testing)
+- [Architecture Diagram](#architecture-diagram)
- [Project Structure](#project-structure)
- [Output Notes](#output-notes)
- [Code Quality](#code-quality)
@@ -192,6 +193,68 @@ sudo ./e2e/qemu-run.sh # Start VM
sudo ./e2e/qemu-test.sh # Run automated tests
```
+## Architecture Diagram
+
+```mermaid
+flowchart TB
+ subgraph UserSpace[User Space]
+ User[User]
+ CLI["proclens CLI
one-shot · live dashboard"]
+ Tests[Unit tests and QEMU E2E]
+ User --> CLI
+ Tests --> CLI
+ end
+
+ subgraph ProcFS[ProcFS Interface]
+ PID["/proc/proclens_module/pid
write target PID"]
+ DET["/proc/proclens_module/det
read process details"]
+ THR["/proc/proclens_module/threads
read thread details"]
+ end
+
+ subgraph KernelModule[Kernel Module: proclens_module]
+ PIDBuf[PID buffer and proc write handler]
+ Show["proclens_module_show
seq_file render path"]
+ ThreadShow["proclens_module_threads_show
thread listing render path"]
+ Memory["Memory section builders
pressure · layout · visualization"]
+ Network["Network + socket builders
brief stats · open sockets"]
+ IO[I/O stats builder]
+ ThreadInfo[Thread info line builder]
+ end
+
+ subgraph KernelData[Kernel Data Sources]
+ Task["task_struct
pid · comm · utime · stime · faults"]
+ MM["mm_struct + VMA maple tree
code · data · bss
heap · stack · ELF base"]
+ Signal["signal_struct
oom_score_adj"]
+ Files["files_struct + fdtable
process file descriptors"]
+ Sock["socket / sock
tcp_sock / inet_sock
protocol · state · addresses · traffic"]
+ IOAcct["task I/O accounting
rchar · wchar · syscr · syscw
storage bytes"]
+ Threads["thread group + sched state
priority · nice · cpumask"]
+ end
+
+ CLI -->|write selected PID| PID
+ CLI -->|read details| DET
+ CLI -->|read thread list| THR
+ PID --> PIDBuf
+ DET --> Show
+ THR --> ThreadShow
+ PIDBuf --> Show
+ PIDBuf --> ThreadShow
+ Show --> Memory
+ Show --> Network
+ Show --> IO
+ ThreadShow --> ThreadInfo
+ Memory --> Task
+ Memory --> MM
+ Memory --> Signal
+ Network --> Files
+ Network --> Sock
+ IO --> IOAcct
+ IO --> Task
+ ThreadInfo --> Threads
+ ThreadInfo --> Task
+ KernelModule -->|formatted seq_file output| ProcFS
+```
+
## Project Structure
```
diff --git a/docs/demo.gif b/docs/demo.gif
index 5b1dd49..f36a9ce 100644
Binary files a/docs/demo.gif and b/docs/demo.gif differ