5 agents, 16 synthetic scenarios, 67 of 79 scenario steps passed LLM review
Led a five-person NUS-ISS team building a reflection and memory companion from five AI agents. It discusses books without spoilers, keeps memories in the reader's own words, and links them to other books and public-web sources.
- —Separated authority: five PydanticAI role agents propose through typed contracts, while application code owns retrieval scope, memory writes, and what the reader sees.
- —Owned Sculptor, the memory-curation agent. A separate review agent must approve its proposals, and it never rewrites the reader's original words.
- —Kept answers spoiler-safe with hybrid BM25 and embedding search limited to the chapters the reader has reached, then cross-encoder reranking.
- —Every full draft passes review before release, with one revision allowed. A live agent map and inspector show each turn's handoffs and decisions.
- —Across 79 synthetic scenario steps, 65 passed automated checks and 67 passed LLM review. Sculptor's offline error analysis lifted held-back passage recall from 16/20 to 20/20 at about 2.5 times the input tokens, a change not enabled for readers.
PythonFastAPIPydanticAIReactTypeScriptOpenAI APISQLiteLogfireRailway
1,651 synthetic journal entries, 204 personas; found 40% of known value drifts at about 90% precision
Led a three-person NUS-ISS capstone proof of concept for an AI journal. It compares what people write each day with the values they confirmed, flags repeated conflicts each week, and shows the entries behind every flag.
- —Built a synthetic corpus of 1,651 journal entries from 204 personas, with LLM labels checked against human annotation by the project team.
- —Trained a neural model that found about a third of value conflicts and did not improve drift detection, so it stayed offline. User-facing decisions went to a weekly LLM reviewer plus a deterministic rule that counts two consecutive conflicts with the same value as drift.
- —Found a median 17 of 42 known drifts (40% recall, about 90% precision) with 2 false alerts across 292 person-value histories, using GPT-6 Luna at low reasoning. This is a development result on AI-reviewed synthetic data with no held-out test. Moving from GPT-5.6 Luna cut token cost by 60% with no detectable change in recall.
- —When an LLM chose a supportive quote from a person's full history, the choice was suitable about four times in five, against three in five when it chose from the top three search results. Weekly summaries with the quote won 36 of 72 blinded AI comparisons, lost 12, and tied 24.
- —Shipped five saved persona replays across 27 weeks, plus a public inspection app that traces each result to its source entries. Benefit to real users remains untested.
ReactTypeScriptPythonStarlettePydanticOpenAI APIPyTorchPolarsShinyRailway
4 Codex-backed agents, deterministic routing, live WebSocket orchestration
Built a real-time multi-agent orchestration runtime where four thread-resumed AI musicians improvise together while the server enforces deterministic routing, state continuity, and final pattern composition.
- —Architected a dual-mode Codex and Strudel runtime that powers both assistant interactions and live multi-agent jam sessions.
- —Implemented server-owned orchestration for four isolated Codex-backed agent sessions with deterministic @mention routing and structured composition safeguards.
- —Fed browser audio summaries and camera conductor cues into live agent sessions, with validation gates and deterministic routing.
Next.jsTypeScriptCodexStrudelMCPWebSockets
Validate-then-stream 10-chapter LLM app with persistent state
Built a 10-chapter educational adventure app with validated story generation, persistent sessions, and AI illustrations, routing narrative and supporting tasks across OpenAI and Gemini.
- —Validate-then-stream delivery generates a full chapter, checks structural correctness with retries, and only then streams approved content to the user.
- —Grounded adventures in story YAML and lesson CSV inputs, using OpenAI for narrative and scene text, Gemini Flash Lite for supporting tasks, and Gemini Flash Image for illustrations.
- —Supabase-backed state, reconnect-safe WebSockets, deferred background tasks, and telemetry keep adventures resumable, responsive, and observable in a production-style stack.
FastAPISupabaseOpenAI APIGemini 2.5 Flash LiteGemini 3.1 Flash ImageRailwayReactWebSockets
Aegis AI Travel Insurance Recommender
13 PDFs, 80 synthetic customers, 85-100% scenario pass rates
Led a four-person NUS-ISS team building an evaluated LLM travel-insurance recommender that turns policy PDFs and synthetic customer transcripts into structured requirements, insurer comparisons, and transcript-aware recommendations.
- —Extracted structured coverage data from 13 travel-insurance policy PDFs using Gemini 2.5 and schema validation.
- —Built a hybrid recommendation pipeline with deterministic requirement scoring and transcript-aware LLM reranking.
- —Evaluated 80 synthetic customers across four scenarios, reaching 85-100% scenario pass rates and 87.53% valid requirement coverage.
PythonGemini 2.5OpenAICrewAIPydanticReactViteNetlify
Large-PDF processing, adaptive notes, BYOK study workspace
NANA is a public BYOK study prototype that transforms dense PDFs into personalized study workspaces, combining adaptive notes, document overviews, and inline AI explanations around real study workflows.
- —Two-phase PDF pipeline with large-file preprocessing and splitting for cost-efficient note generation.
- —Personalized document overviews and study notes adapted to learner background and goals.
- —Inline AI commands, browser-resumable study state, and exportable Markdown notes built for real study workflows.
PythonFastAPITypeScriptReactViteGemini 3 Flash
CLIP + EmoNet fusion: about 19% lower VEATIC MAE versus scene-only
Led a four-person NUS-ISS team building an end-to-end affective computing pipeline that turns noisy real-world video into music recommendations through dual-pathway ML, variance-weighted fusion, and full-stack delivery.
- —CLIP scene analysis + EmoNet facial cues fused through uncertainty-aware dual-pathway ML
- –Variance-weighted fusion with temporal smoothing improved VEATIC MAE by ~19% vs scene-only baselines
- –Delivered a React + Flask demo with synced playback, emotion visualizations, and DEAM music matching
PyTorchReactFlaskOpenCVCLIP ViT-B/32EmoNetMediaPipe
139 expert images, 631 boxes, seven vision models benchmarked
Led a two-person NUS-ISS attention study testing whether vision models look at the architectural evidence human experts mark as diagnostic.
- —Benchmarked DINOv2, DINOv3, MAE, CLIP, SigLIP, SigLIP2, and ResNet-50 on 139 images with 631 expert boxes.
- —Found DINOv3 strongest as a frozen spatial-prior model; CLIP and MAE improve after adaptation but on different evidence.
- —Mapped attention-head specialization: DINO models retained dominant heads after adaptation, while CLIP shifted toward later layers.
- —Used IoU, Coverage, MSE, KL, EMD, calibrated baselines, bootstrap CIs, Wilcoxon tests, and Holm correction.
- —Built a FastAPI + React dashboard over precomputed attention, feature, metric, heatmap, and per-head artifacts.
PyTorchFastAPIReactSQLiteVision Transformers