1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#import "@preview/basic-resume:0.2.9": *
// Put your personal information here, replacing mine
#let name = "Jayrup Nakawala"
#let location = "London, UK"
#let email = "jayrupnakawala@gmail.com"
#let github = "github.com/CaptainJack2491"
#let linkedin = "linkedin.com/in/jayrupnakawala"
#let personal-site = "jayrup.me"
#show: resume.with(
author: name,
location: location,
email: email,
github: github,
linkedin: linkedin,
personal-site: personal-site,
accent-color: "#26428b",
font: "New Computer Modern",
paper: "a4",
author-position: center,
personal-info-position: center,
)
== Research Experience
#project(
name: "Prime-Grokking: Pre-registered Grokking Study",
url: "git.jayrup.me/c/prime-grokking.git",
dates: dates-helper(start-date: "Aug 2026", end-date: "Present"),
)
- Tested whether minimal transformers and RNNs can grok next-prime prediction, running the study like production research: every experiment batch pre-registered with commit-locked interpretations before launch.
- Caught two experimental-design blockers (layout invariance, prereg-code drift) via hostile pre-run review; built an idempotent multi-cell sweep runner and batched the evaluation loop *46× faster*.
- Ran a 16-cell PyTorch CUDA/AMP sweep (architecture × weight decay) on a remote GPU node, then extended through 10× more data and a 20× longer horizon — following the negative result rather than tuning it away.
- Published a 3-part writeup at jayrup.me with a public, re-runnable repository (prereg addenda, eval code).
#project(
name: "Stress-Testing the J-space Interpretability Lens",
url: "jayrup.me/blog/jacobian-lens-frequency",
dates: "Jul 2026 — Aug 2026",
)
- Independently reproduced a frontier interpretability method (Anthropic's July 2026 J-space/J-lens analysis) on a small PyTorch transformer and found its scores track token frequency.
- Designed a matched-frequency control showing contextual predictability remains detectable — framed and published as a control requirement for the method, not a refutation; shared with the mech-interp community.
#project(
name: "Dissertation: Moral Cover and Watchful Eyes",
// Role is optional
role: "",
// Dates is optional
dates: dates-helper(start-date: "Nov 2025", end-date: "May 2026"),
)
- Architected a sandboxed evaluation framework with a Virtual File System (VFS) to safely execute and monitor autonomous LLM tool-use across multiple providers (Anthropic, OpenAI, Google).
- Built a provider abstraction layer for glass-box reasoning extraction and a post-hoc interrogation system to adversarially probe agent intent.
- Designed a 3-prong automated judging pipeline (regex, LLM blackbox, LLM glassbox) and ran *960 experimental trials* across exploratory and confirmatory studies.
- Quantified a *"Stealth Gap"*: deceptive intent held steady (~62--67%) under high oversight while output-level detectability dropped (47.8%→35.6%), showing output-only monitoring underestimates risk.
- Code and evaluation harness: github.com/CaptainJack2491/Dissertation
== Projects
#project(
name: "Hybrid-Cloud Research Infrastructure & Zero-Trust Mesh",
dates: dates-helper(start-date: "Jan 2024", end-date: "Present"),
)
- Operate a multi-node Linux estate (Void, Arch, Ubuntu) — always-on agent laptop, homelab server, remote GPU research node, VPS edge nodes — unified over a Tailscale/WireGuard zero-trust mesh.
- Run 15+ containerized services in production (Nextcloud, media, password vault, document tooling) via Docker Compose with automated backups, resource monitoring, and an NVMe-backed storage tier.
- Solved CGNAT reachability by deploying VPS nodes as forward proxies, restoring secure high-availability access to internal services without port forwarding.
- Built jayrup.me on this stack: Nginx dual-interface serving (HTML for browsers, plaintext for `curl`) with a Quarto pipeline rendering web and CLI docs from one Markdown source.
== Education
#edu(
institution: "University of East London",
location: "London, UK",
dates: dates-helper(start-date: "Sept 2023", end-date: "May 2026"),
degree: "BSc (Hons) Data Science & Artificial Intelligence — First-Class Honours (94%)",
// Uncomment the line below if you want edu formatting to be consistent with everything else
// consistent: true
)
- Relevant Coursework: Math for Computing, Data Structures & Algorithms, Networking, Databases, Big Data, AI
/*
== Extracurriculars
#extracurriculars(
activity: "GDG on Campus UEL — hands-on dev workshops (developer-portfolio codelab: Antigravity + Firebase)",
dates: "<DATES>",
)
*/
== Skills
*Programming*: Python, Bash, SQL\
*ML/AI*: PyTorch, Transformers, Hugging Face, llama.cpp (GGUF quant), LangChain, scikit-learn\
*Infrastructure*: Docker, Docker Compose, Nginx, Caddy, Tailscale, WireGuard, Quarto\
*Systems*: Linux (Arch, Void, Ubuntu), Git, rsync, Tmux, Neovim\
|