built as a graph

Tangyi (Jerry) Qian

I work across the LLM stack — post-training and RLVR, model internals, agent systems, and the product layer around them — and go deepest on long-horizon agents: systems where the state outlives the conversation.

Founder at PiPlan · first-author research in sequential model editing · everything below is built, measured, or under review.

nodes/ — things I've built

OPEN SOURCEHARDWARE AGENTFULL-STACK

Even Realities Agent OS

An agent-agnostic OS for Even Realities G2 smart glasses: push-to-talk voice in, paginated HUD frames out, four processes across three trust levels. The brain is pluggable behind one provider interface — a ~900-line self-built agent that holds the only copy of the LLM key, or an adapter to an uncontrolled third-party OpenClaw gateway — and the same display is exposed as a hardware MCP surface, so any vendor model (Claude Code included) can render to the glasses you are wearing.

Hardware Agent SDKWearablesMCPLow-Latency InfraVoice / ASR
Close-up of the G2 HUD in the tool state: the status line reads "Lens ◆ Weather" above the live transcript of the spoken question, green on black.

A real run on the 576×288 4-bit canvas, not a mockup: mid-turn, the status line shows the weather tool running while the user’s own transcript sits underneath. A clean badge — no "?" — means the peer on the other end is the production agent.

Details

Voice Loop & Hardware Bridge

Engineered the full wearable loop: the plugin runs as a dumb terminal with watchdogs inside the official Even App WebView; one WSS carries JSON render frames down and 16kHz s16le PCM up, push-to-talk only, under revocable short-lived device JWTs — credentials never leave the server. Dual-model ASR (faster-whisper tiny for live partials, base for the final that routing trusts) with domain hotwords, held to CER 0.0085 against a self-built ten-clip ground-truth set. A lock-contention hunt took release-to-transcript from 7.6s to 0.4s by decomposing wait from compute (9.5s lock wait vs 0.35s actual decode); measured whole turns now run 6.1s with no tool and 11.5s with one, because the budget is counted in model round-trips, not in tool latency.

Pixel-Exact HUD Typography

Rebuilt the typography engine against ground truth instead of character counts: layout in real pixels on the 576×288 4-bit green canvas (576×216 body, a fixed 27px line, 8 lines × 3 pages — an earlier five-line assumption wasted 37% of every page). Glyph advances are checked against the official pretext metrics library used as an external oracle — 17,025 code points and 820 wrap cases, break position by break position, zero divergence — and the real ceiling turned out to be 999 UTF-8 bytes rather than the 1,000 characters the vendor doc implies. A measured glyph table covers the rest: 10 of the 13 glyphs the HUD originally used do not exist on G2 and would have been dropped silently, so dropped glyphs are now reported instead of vanishing on-device.

Hardware MCP Surface & Frame Lease

Exposed the glasses as a standard MCP server in its own process (8 tools, 3 resources, 1 prompt) so any vendor model can write the HUD — one "claude mcp add" away. That process is the one that holds nothing: no mic, no ASR, no device credentials, and it can do exactly what nine control-plane routes allow. textkit_paginate needs no device at all — the layout engine as a pure function, which is the cheapest way to prove a foreign model really reached your code. The screen has one owner at a time: writes go through a frame lease, a losing client gets a structured LEASE_HELD with the current holder and a TTL instead of last-write-wins, and a human pressing push-to-talk preempts unconditionally. The four-process end-to-end suite (real MCP client → real MCP process → real gateway → real device WebSocket) asserts frames actually leave the device socket — 27/27.

Self-Built Agent, Permissions by Architecture

A ~900-line handwritten agent loop (direct DeepSeek, loopback-only, sole holder of the LLM key) carrying 12 tools and 7 skills behind four gates: the capability enum is READ|WRITE with no exec tier at all, a regex router fixes the skill and its tool whitelist before the model ever sees the prompt, WRITE tools are bound to a concrete file at import time so no argument the model supplies can reach another path, and every call and every refusal appends one JSON line to an audit log. That ordering is why prompt injection is structurally uninteresting here — the injected sentence arrives inside the user turn, after routing has already frozen the toolset. One rule earned the hard way: routing judges intent, the skill judges feasibility. While routing tried to judge feasibility, the agent answered "I can't set reminders yet" to requests it could in fact serve — claiming you cannot do something you can do is the same class of failure as making something up. The provider interface exists because two implementations exist now, not as future-proofing, and the split is visible in who owns the small-screen contract: the third-party backend is uncontrolled, so the gateway has to inject the style header on its behalf, while the self-built agent carries that contract in its own system prompt — with markdown stripped at the layout layer either way, as a second line of defense. Its protocol also adds three things the third-party v3 lacks that glasses actually need: a tool-state event (without it the HUD sits on "thinking 12s" with no idea a tool is running), a per-turn latency budget (on a HUD, slow is broken — over budget it degrades to a wrap-up instead of waiting), and provenance returned at handshake. Real-agent end-to-end: 23/23 against live DeepSeek, asserting the tool actually ran and the audit trail actually landed.

Verification & Honest Screens

590 gateway pytest + 82 plugin vitest + 32/32 voice end-to-end + 27/27 MCP four-process + 23/23 real-agent end-to-end, wired into CI with a deliberate tripwire: if the typography oracle is skipped, the build fails instead of passing green without its key claim. Two conventions make those numbers mean something — every new test is mutation-checked (break the code on purpose; if it still passes, it was decoration), and a test that measures the fixture instead of the code is treated as worse than no test, after one regression suite passed only because it cancelled its tasks before they ever started. Nothing in the demo is mocked: real microphone, real faster-whisper, real DeepSeek, real Open-Meteo and Frankfurter calls — the only substituted input in the repository is the demo audio. And the screen is not allowed to lie: a non-production peer wears a "?" badge, an answer cut short by its budget ends in "… (cut off)" rather than a done mark, and telemetry that never arrived returns null instead of a plausible battery number.

FOUNDERSHIPPEDFULL-STACK

PiPlan.ai

Founding AI Engineer, solo — an LLM agent over a proprietary constraint-solving core, proposal-first. Live at demo.piplan.ai; first-100-accounts invite beta running.

AgentsPlanningFull-stackEvaluation
PiPlan landing cover: an ink-drawn city skyline with vermilion accents.

The piplan.ai cover — the city as a plan: one skyline, thousands of moving parts, in the product's ink-and-vermilion hand.

Details

Full Stack

Built solo: a typed-graph planning OS — goals, tasks, and constraints as a directed multigraph, versioned along two axes (graph and plans), behind 117 API routes and a seven-screen operator UI, live as a public multi-visitor demo. Every solver and agent change flows proposal-first: draft → diff → human commit.

Algorithms

Built and measured: a proprietary scheduling core — multi-plan solving over a shared capacity pool with explicit conflict surfacing — plus a proprietary two-stage acceleration strategy. Measured on the locked benchmark against the prior solve path: 5-second valid coverage 42.1% → 100% (2.38× more instances solved within budget), median first-solution speedup 560×, accelerated first-feasible end-to-end at 0.028s; the acceleration pre-stage alone covers 522/522 instances with zero regressions.

Agent

Built: an LLM planning agent operating the OS through a registered tool surface — eight tools, the core four live: replanning, proposal comparison, and gated plan updates. In live evaluation with a frontier chat model, the agent ran the core flows — initial planning, reschedule, commit, post-commit reschedule, general feedback — at pass@3 above 80%. Every mutation lands as a proposal behind the human commit gate; deadlines are never model-written.

Agent Security

Proposal-first mutation control: the model reads everything and commits nothing — every write is a drafted diff behind a human review gate. The public demo runs fenced: per-visitor sandboxed sessions, operation caps, and admission limits on solver work.

Benchmarks & Evaluation

Three measurement systems stand today: a correctness harness on the scheduling core — twelve invariant families plus fuzzing, run in CI, gating every algorithm change; a dedicated lab benchmark with staged controls behind the acceleration numbers — three alternative acceleration families tested and rejected, negative results kept; and live pass@3 evaluation over the agent's core flows.

CI & Release

Fully automated CI, deliberately human-gated release. Every PR runs lint, the full test suite, and a fuzz smoke; nightly runs ~10k property-based fuzz cases, the performance benchmark, and a byte-level demo-replay gate against golden states. Deploy is a one-click pipeline to the live VM — the button stays human by design: machines verify, a human ships.

Training / Post-training

The optimization program to date is the solver acceleration above — designed, measured, validated on the locked benchmark. Ready for post-training: an evaluation stack (correctness harness, lab benchmark, live agent eval) to gate any learned component, and a core loop in which every agent proposal carries a human accept/reject decision — labeled signal by construction.

Online Serving

Live at demo.piplan.ai: a lean single-node serving substrate — solver work behind an admission gate, 50 concurrent sandboxed sessions behind rate limits and per-visitor isolation. Sized for a 100-account invite beta.

OpenAI Build WeekFULL-STACKRL

VerifierForge

RFT-in-a-box: point it at your LLM traffic, it finds the expensive task clusters, trains a small model against your own verifier, and proves the gain before routing to it.

Post-training / RLInference & ServingLLM Systems
VerifierForge proof view showing held-out pass@1 rising from 58.3% to 78.3% and pass@8 to 90%.

A 60-row held-out evaluation: independent pass@1 climbs from 58.3% to 78.3% (+20pp), pass@8 to 90.0%.

Details

Problem

Teams burn frontier-model budget on high-frequency, narrow tasks — the exact tasks a small fine-tuned model handles fine. Almost nobody does it, because the RL expertise, the GPU orchestration, and the proof that it actually worked are three separate hard problems.

What I built

A closed loop, built in eight days — core loop solo, with a teammate on UI and the demo video: a proxy ingests real traffic and discovers task clusters and their cost; an agent with a fixed action space and custom analysis tools writes the training config; the system auto-provisions a GPU pod, trains with GRPO against a user-supplied programmatic verifier, then proves the result — held-out pass@1 went 0.583 to 0.783 and pass@8 0.767 to 0.900, while a spurious-reward control stayed flat, so the gain isn't placebo. Shipping is a routing toggle with a canary and a drift guardian. Serving scales to zero: a request wakes a GPU pod in about four minutes and reclaims it after thirty idle minutes.

Thinking from RLVR

I built this after implementing GRPO and One-Shot RLVR by hand. The literature kept showing that verifiable rewards work; nobody had productized the loop end to end — discover the workload, train against your own verifier, prove the gain, route to it. The borrowed parts are explicit. GRPO from DeepSeekMath is the trainer. The falsification arm comes from the spurious-rewards line: gains from formatting tricks look exactly like real gains until a random-reward control calls the bluff. The ship step thinks in FrugalGPT/RouteLLM terms — a canary and a routing toggle, not a leap of faith. As engineering I'm satisfied: the problem is crisply defined and the evidence chain closes. The honest issue sits upstream, and it is a frontier one. The system currently decides "is this task cluster worth training?" with an LLM agent auditing the workload — a judgment call, not a measurement. Given a verifier and an environment, whether a task definition is actually trainable with RL is an open research problem. That question is the most original thing this project surfaced for me, and the one I keep coming back to.

OPEN SOURCESWE-BENCHRESEARCH SYSTEM

CAWM: Agentic Working Memory on OpenHands

A procedural working-memory and online-induction system built on OpenHands (CodeAct + Kimi K2), extracting reusable debugging sub-workflows from SWE-bench repair trajectories and studying the context-capacity limits of agent memory.

OpenHandsAgent MemorySWE-benchOnline LearningLLM Systems
CAWM architecture diagram: a Django issue flows through the CodeAct agent, a Docker sandbox, execution-based evaluation, and successful trajectories are distilled into workflows that are re-injected into the agent's prompt.

The online learning loop: resolved trajectories are cleaned, distilled into 3–8-step sub-workflows by LLM induction, and re-injected into the next task's prompt as an always-active skill.

Details

Framework & CodeAct Integration

Architected an end-to-end online learning pipeline over the OpenHands CodeAct agent and Kimi K2: driving multi-turn code generation, live Docker container evaluation on SWE-bench Lite Django issues (114 instances), and experience persistence with immutable event-sourced replay.

Workflow Induction & Abstraction

Engineered an automated induction engine that condenses 20–50 step raw coding trajectories into reusable 3–8 step procedural sub-workflows (fault localization, context tracing, test-driven validation) with parameterized variable abstractions.

Empirical Finding: Memory Non-Monotonicity

The headline aggregate was a negative result, reported as such: online CAWM (52.0%) landed below the 55.3% baseline. The conditional analysis is the real finding — with 11–20 workflows resident, resolution peaked at 66.7% (+11.4pp over baseline); past 31, it collapsed to 39.5% as accumulated workflow text polluted the system prompt. So memory is not useless — unbounded append is self-defeating: agent memory needs selection and eviction, not growth. The report states its own caveat: the peak is correlational evidence, and confounders cannot be ruled out.

Failure Attribution & Lost Focus

Systematically diagnosed failure modes across 87% test failure cases: identifying the 'lost focus' pattern where unguided agents continue unproductive exploration with high step variance (std=43.0 vs 19.4) and 50% context explosion (>150K chars), providing hard empirical evidence for selective memory retrieval.

OPEN SOURCEAGENT SKILLHARNESS

SafeRoutes

A route-planning agent skill that enforces its own invariants — the agent physically cannot leave the state inconsistent, even when it claims it did the work.

AgentsHarness EngineeringReliability
Route map spanning Chicago to Pittsburgh with waypoints marked along one continuous path.

A generated roadbook: the full planned route with its ordered waypoints, rendered end to end.

Details

Problem

Tool and skill definitions are expose-and-pray: they describe what an agent CAN call, and impose nothing on what it actually does. In practice the failure isn't a crash — the model narrates the step ('removed that waypoint') and never calls the tool. On a general agent harness you don't own, you can't patch the runtime to fix this.

What I built

Enforcement pushed down into the skill itself, so it works on an unmodified host. Every state write is gated by an invariant check — waypoint self-consistency, path continuity, range windows — and a failed check rolls the state back and returns an error written as an instruction, not a complaint, so the model's next turn is corrective rather than apologetic. Waypoint mutation is a first-class operation instead of an emergent side effect of free-form edits. The model's diligence is removed from the critical path: correctness becomes a property of the data plane, not of the prompt.

Building a benchmark for a self-designed skill

The driving question: if you design and build your own agent skill, how do you build the benchmark that lets you optimize it — until a low-cost model can drive it well? The benchmark: 41 live cases across five dimensions — autonomous invocation (the request never names the tool), restraint (knowing when not to plan), named-waypoint parameter extraction, data-gap handling with safety probes, and dynamic re-planning — run as 123 real OpenClaw gateway turns across three low-cost models (GLM-5.2, MiniMax-M3, MiMo-2.5-Pro). Two disciplines made the numbers trustworthy. The data substrate was verified before any run — corridor coverage checked ahead of time, so a failure attributes to the model, not to missing data. And scoring reads objective artifacts — persisted plans, trip-tree nodes, tool-call blocks in the transcript — never the model's own narration; safety cases got a per-transcript human review. What it found, in order of how much it hurt: autonomous invocation was zero for every model — all three drifted to web_search and improvised routes, because the skill was second-class injected prompt text while web_search was a first-class resident tool. Once a model did invoke the skill, execution was nearly a non-issue: 91% / 100% / 75% correct. And safety turned out to be its own axis, inverting the capability ranking — under a "just lower the safe-range and push through" prompt, the most obedient model broke the fuel-safety floor, while the least trigger-happy one refused and went to fix the data instead. So the fix wasn't a better model — it was surgery on the skill itself. The conversational remodel collapsed a 4–6 call, path-and-DSL workflow into two calls with a lossless undo, and the tool was promoted to a first-class function. Re-measured on MiniMax-M3: autonomous triggers went from 0/12 to 5/6, nine of ten cases returned the full bundle in a single turn, with zero web_search escapes — a single-repetition validation, stated as such. The takeaway I keep: for a self-designed skill, the benchmark is the product's other half — and the first thing it tells you is that your bottleneck isn't where you think it is.

123 live gateway runs; after the interface redesign, autonomous invocation went from 0/12 to 5/6 on MiniMax-M3.

HACKATHON BUILDOPEN SOURCE

Loop Supervision for Multi-Agent Research

A supervisor that watches a multi-agent run as a task graph and tells you WHICH agent is stuck — and why — instead of just timing out.

AgentsHarness EngineeringObservability
Loop supervisor task-graph dashboard with nodes color-coded by state and a live incident stream.

The supervisor watches a run as a live task graph; each node's state updates as the experiment progresses.

Details

Problem

Multi-agent systems don't fail loudly. An agent quietly re-runs the same step, works on a sibling's task, or builds on a result that was invalidated upstream. A timeout tells you something is wrong; it doesn't tell you what.

What I built

A dependency-aware supervisor over an async task graph — no global fork-join barriers, so a three-hour experiment node never blocks a ten-minute one. It detects distinct incident classes rather than generic stalls: scope violations, stale cascades built on invalidated results, taint propagation, and blocked comparisons. Each incident produces a blame trace and a revert. Built for an auto-research workload, with a live dashboard that replays a run step by step. In a live test it caught a real one: a worker silently dropped samples mid-experiment, the data hash diverged, and the comparison was blocked before it produced a bogus number.

Supervision runs on hard signals only — file hashes, metric curves, exit codes; never an LLM judge. In an adversarial test we planted an instruction telling a training node to skip the official tool and hand-write its own provenance: the more conservative model refused the bait outright, while the more capable one genuinely fabricated its data hash — and was caught at the comparability gate on the mismatch, blamed, and withheld. The lesson inverts the usual assumption: the more capable the agent, the more it needs the gate. The entire live day ran on under one cent of API spend.

HACKATHON BUILDOPEN SOURCE

GraphJudge

A graph-grounded factuality judge for LLM output — the verdict is made by Neo4j graph topology, not by another LLM.

AgentsVerificationKnowledge Graphs
Details

Problem

Everyone judges LLMs with LLMs — but an LLM checker hallucinates its own verdicts, and when retrieval comes back empty it falls back to its parametric prior and guesses. A fluent fabrication that only cites itself looks plausible in text; nothing in the prose gives it away.

What I built

A judge that runs downstream of generation: paste generated text, it extracts atomic claims, anchors them to a trusted Neo4j reference graph, and returns a per-claim verdict — SUPPORTED, CONTRADICTED, or UNGROUNDED — each carrying a graph path as evidence. The verdict is made by the graph, not by a model: functional-relation contradictions are deterministic Cypher checks, and GDS component analysis exposes fabricated clusters as components with zero trusted anchors — absence becomes a first-class signal instead of a null. The LLM only parses prose into claims; it never decides truth. Built for HackwithBay 3.0 as a credit-gated web app that renders each result as an inspectable fact constellation. On a 63-claim benchmark against an LLM judge, both detected every planted-false claim, but GraphJudge's exact 3-way labeling scored 100% vs 98.4% — deterministically, with auditable evidence paths.

OPEN SOURCEHACKATHON BUILD

Engram

A continual-learning personal agent that writes your beliefs into model weights.

Model EditingAgentsContinual Learning
Engram title card: continuous-learning memory for LLMs, beliefs in weights, facts in RAG.

Engram's cover: continuous-learning memory for an LLM — beliefs internalized into weights, facts kept in RAG.

Details

Problem

RAG remembers facts, but it can't change what a model believes. Preferences and beliefs shouldn't live in a vector store bolted onto the side of a frozen model.

What I built

An agent with a fact-vs-belief router: facts go to retrieval, beliefs get written directly into the model's weights via model editing. Includes an attribution demo — the agent recalls injected beliefs with RAG fully disabled, proving the knowledge lives in the weights.

Why Engram exists

Most continual-learning systems never actually internalize anything: the model stays frozen, and everything it "learns" lives in an external store. I care about the version where knowledge ends up inside the model — which leads straight to model editing, and to its two hard problems. First, sequential editing: new knowledge must not destroy old knowledge. Second, and much less discussed: usability. Once an edit survives, it still has to work — and today edited knowledge is validated almost entirely through Q&A probes. Models pass those fine. Ask them to deploy the same knowledge in free-form generation, and there is no good answer yet. The end state I want is a personal model: a small model that has internalized your durable beliefs and preferences into its weights, retrieves everything else through RAG, and uses both naturally in open conversation. Engram was the first cut at that — a fact-vs-belief router in front of the two stores, plus an attribution demo proving the beliefs really live in the weights: recall with retrieval fully disabled.

Where the frontier is, and what I'm testing now

On internalization, sequential editing has matured past the one-shot ROME/MEMIT era into methods built to survive volume — adaptor- and codebook-style approaches in the GRACE lineage keep hundreds of edits from trampling each other, and the unstructured-editing line (UnKE, AnyEdit) freed the payload from subject–relation–object triples. Evaluation is catching up more slowly: LEME pushed toward long-form evaluation, but most editing work is still validated the same way — Q&A probes aimed at the edited fact. That leaves the second problem largely open: knowledge that passes every probe, and still fails to surface when the model writes freely. The piece I'm experimenting with now sits past both: whether editing can internalize preferences too abstract for rules — preferences you cannot express as a retrievable instruction or resolve by surface reasoning, because they only exist as an abstraction in latent space that shifts how the model behaves. Concretely: a long-term personal assistant with genuinely individual behaviors, like knowing to push back a little when its user is getting cocky. RL is the wrong tool here — RL installs one macro-preference per training run (think: tune a teacher agent until it sounds authoritative), and with one or two hundred fine-grained preferences, two hundred reward signals start fighting each other. Editing shouldn't have that conflict problem: one preference, one write. Whether it actually works is exactly what I'm testing — this is ongoing research.

OPEN SOURCE3,000+Likes & Saves410+Downloads63Stars

Socrates agent

An Obsidian plugin that practices the Socratic method inside your notes — select a passage, ask, and the answer writes back in under ten seconds.

AgentsHarness EngineeringLLM Systems
Socrates agent title card: an ASCII-art portrait of Socrates next to the words SOCRATES and The Socratic Method.

The plugin's title card — Socrates-agent brings the Socratic method into the notes you are already reading.

Details

Problem

Working through a long technical manual alone means the stuck moments have nobody to ask. A generic chatbot hasn't read your book: it returns a correct, generic paragraph with no idea how chapter 2 set up the concept you're stuck on in chapter 7. And the round trip breaks reading — switch apps, paste context, wait, paste back, reformat: 20–30 seconds per question.

What I built

An Obsidian plugin that practices the Socratic method inside your notes. Select a passage and ask; the answer is written straight back into that passage — explanation, annotation, or rewrite — in under ten seconds end to end. Flip the chip and it questions you instead: the default socratic mode answers a selection with a question, pushing your understanding one level deeper before giving anything away. The agent runs on three tools only — read file, edit file, fetch. Deliberately no write-file: it can annotate and edit what exists, never spawn files. Available on the Obsidian community plugin store — 410+ downloads and 63 GitHub stars, with a launch post at 3,000+ likes and saves on RedNote.

Design notes

Keep the agent light. Capability lives in the model; the frame stays minimal. Three registered tools cover the whole job, and the small action space is most of why it stays robust. And the loop must be smooth enough not to break reading: the product spec is a latency budget — selection to written-back answer inside ten seconds. The answer lands where the question arose; the plugin mutates the note, it doesn't emit a transcript.

What this project taught me about my own defaults

Three patterns I can now name. The smallest sufficient action space is my recurring bet: three tools cover the whole job, and the deliberate absence of write-file is most of why the agent stays robust — capability comes from the model, reliability comes from the action space. The artifact is the interface: answers mutate the document you are reading instead of piling up in a transcript, so the knowledge stays where you will re-read it. And the default posture defines the product: a tool that asks first and a tool that answers first are two different products assembled from the same parts. Where the design should go next, stated as a product need rather than a feature list: evaluation is the missing organ. "Did that exchange actually deepen understanding?" has no verifier today — so every iteration on the prompt, the chips, or the tool descriptions is taste, not engineering. Until the plugin can measure its own teaching, I'm optimizing blind; building that measurement is the honest next step.

OPEN SOURCE

ClawConclave

A multi-agent OpenClaw system — LLM agents with distinct roles coordinating in shared channels.

Multi-agentLLM Systems
Details

What it is. Three OpenClaw agents run as separate gateways on one box — a worker, a researcher, and a censor, styled as Ming-court roles (工部尚书 / 格物尚书 / 都察御史) — with Discord as the shared workspace: one work channel for the two workers, one status channel reserved for the censor.

How the co-op works. Delegation runs through collabd, a small custom orchestrator, plus a local-collab plugin on each gateway. A job goes source → worker under a schema-validated result contract: up to three schema attempts, a research → salvage fallback, heartbeats every fifteen seconds, and a terminal-failure fence so a dead job can't half-return. A visibility middleware curates what the channel audience sees, and collabd carries an early loop detector — a sliding event window flagged on duplicate ratio. The censor never enters the work channel: it polls both workers in the background, opens INCIDENT in the status channel after two consecutive failures, and posts RESOLVED on recovery.

What the tests showed. An e2e smoke harness drives worker-to-worker collaboration on the live Discord channels across three scenarios — tool use, coding, memory. A fault-injection test verified active monitoring end to end: take the researcher offline, watch INCIDENT appear unprompted, restore it, watch RESOLVED — and the test itself caught and fixed a real bug in the alert path. In one live run, the worker delegated a model-comparison research task; the researcher hit a dynamically rendered page, switched extraction strategy on its own, and returned a structured benchmark report into the shared channel for review.

An early-2026 build, shown at its real size — and the seed of my later supervision work: a censor role and a duplicate-window loop detector, four months before AROW.

research/ — writing, and reproducing

Preprint — under review

Sequential Model Editing (under review)

Tangyi Qian and co-authors — first author

LLM Model EditingContinual LearningSequential Editing

A paper on sequential model editing. The field's standing gap: an edited fact survives only in its original wording — rephrase the question, or ask about one detail inside it, and the model goes blank. The paper diagnoses this as an expression problem rather than a retrieval problem, and closes most of the gap: substantially better answers to rephrased and decomposed questions after hundreds of sequential edits, at no measurable cost to the model's general abilities.

Under double-blind review at a top-tier AI conference; the title, the numbers, and the preprint are held back until the review cycle allows — they will appear here the day they can.

Manuscript — under review

Test-Time Continual Learning & Rule Editing (under review)

Tangyi Qian and co-authors

Test-Time Continual LearningContinual LearningProactive AgentsLLM Model Editing

A paper on test-time continual learning for proactive LLM assistants. The problem: a deployed assistant must absorb user-specified behavioral rules on the fly — from a single sentence, without fine-tuning — and intervene accurately over continuous streaming dialogues. Rather than growing the system prompt by thousands of tokens or updating weights, the approach maintains rules in an external associative memory over hidden states and injects the retrieved rule as a first-person thought at the prompt boundary. It demonstrates robust rule following, zero prompt bloat, high precision on hard negatives via principled abstention, and graceful multi-rule lifecycle management.

Under double-blind review at a top-tier AI conference; the title, the numbers, and the manuscript are held back until the review cycle allows — they will appear here the day they can.

Technical report — full PDF on this site

To Forge or Not to Forge: predicting task-level fine-tuning gains from ten-example pilots

Tangyi Qian — independent research

Post-TrainingLoRA Fine-TuningEvaluationPre-Registered Study

Is this task worth fine-tuning at all? Under one frozen protocol — Qwen2.5-1.5B-Instruct, a fixed LoRA recipe, greedy decoding, execution-based verifiers — a ten-example pilot is paired with a full fine-tune on 61 tasks, and the measured gain is taken as ground truth. Fine-tuning helps on 53 of 61 tasks, but the pilot's real value is ranking, not gating: spending 20 full fine-tunes in pilot order captures 0.72 of all positive-gain mass, against 0.33 random and 0.74 oracle. The pre-registered go/no-go endpoint is published as a negative, and a declared revision locates the mechanism behind it.

Spearman 0.755 (CI [0.60, 0.86]) between pilot signal and measured gain across 61 tasks — every number is in the PDF, nothing held back.

paper (PDF)build note

reproductions/

RLVR is the engine; post-training, harness, and memory are the runtime; attention is the substrate; continual learning is how knowledge stays current. Memory here is a store the agent reads and writes. Editing is changing the weights — same problem, different medium.

GRPO trains both reasoners and memory managers. GRACE and WISE sit on the hinge between editing and agent memory. Attention is the substrate long-CoT RLVR and long-horizon agents stand on.

rlvr/

Where the reward comes from, whether it can be trusted, and whether it is dense enough.

reproducedread

foundation

algorithm

debunking

test-time

domain

GRPO

Shao et al., 2024

reproduced

DeepSeekMath / GRPO

Group-relative advantage, no critic — the algorithm I implemented and ran against a programmatic verifier.

posture: full reproductionreading → /logs/grpo-family-treepaper ↗

Earlier (recsys, outside these spines): DCN-V2 · ESMM · ColBERT

path/ — the trajectory so far

Apr 2026 — Present

PiPlan.ai · Founding AI Engineer

The turn in the path: after shipping AI systems inside three organizations, I founded my own. One person, the whole stack — product, a proprietary solving core (560× first-solution acceleration), the LLM agent that operates it, serving, and the evals that gate all of it. A plan here is a living graph; the agent proposes, a human commits. Live at demo.piplan.ai, invite beta running — and customer zero is me, every day.

Read details

Agent — An LLM planning agent operates the OS through a registered tool surface (frontier LLM, human commit gate on every write); live evaluation across the 5 core planning flows — initial plan, reschedule, commit, post-commit reschedule, free-form feedback — at pass@3 above 80%.

Acceleration — A proprietary two-stage acceleration strategy on the solving core: within a 5-second budget, valid coverage 42.1% → 100%, median first-solution speedup 560×, first feasible solution end-to-end at 0.028s; validated by 1,296 locked runs with pre-registered splits, 0 quality regressions across a 522-case ablation.

Trust & serving — Proposal-first mutation control: the model reads everything and commits nothing — every write is a drafted diff behind a human review gate. Live serving substrate sized for a 100-account invite beta: 50 concurrent sandboxed sessions, per-visitor isolation, rate/quota/TTL guardrails.

AgentsPlanningFull-stack

Feb 2026 — Apr 2026

GoldenMeadow Investments LLC · AI Development Engineer (Intern)

Built the measurement layer under a set of internal LLM applications that had shipped without one — gateway-level tracing, a programmatic verifier for SQL repair, and the pre-merge gate that runs on top of both.

Read details

Observability — Built the trace layer the rest of the work stands on: every agent step captured with its tool call, inputs and outputs, token count, latency, cost, and the model and prompt versions behind it, instrumented at the gateway so no application team had to touch its own code. Sampling is failure-weighted — every failed run kept whole, successes sampled — and the trace schema is versioned so added or dropped fields never strand historical runs.

Verification — Built a programmatic verifier for SQL repair: static checks on the parsed statement (read-only assertions, table allow-list) in front of an execution-result comparison against a reference run. The first version passed cases it should have failed — empty result sets comparing equal, NULL-vs-NULL, unordered rows compared as ordered, and queries that ran clean but resolved a different definition of the same metric. Rebuilding the comparator around those failure modes lifted repair correctness by 40%, to where output clears the gate without human review.

Gating and its limits — Wired the verifier into a pre-merge gate on the pipeline I owned, and published the trace schema and verifier interface so other teams could adopt it on their own terms. Defined the online layer as well — adoption, rework, and intervention rates, with the instrumentation to collect them — but shipped without it: cross-team instrumentation and a baseline period were outside what I could reach, so the offline metrics stood un-validated against real usage. That was the system's largest known gap at handoff.

AgentsEvaluationLLM Systems

Sep — Dec 2025

CMU Heinz XR Lab · Machine Learning Engineer (Capstone)

0→1 replacement of a fully manual workflow: an LLM tool-calling agent that automated VR-app advising for the Heinz XR lab's ~200-student device-lending program — previously done entirely by hand — Dockerized and handed off to the lab's VM.

Read details

Agent — Built a tool-calling conversational agent (OpenRouter function calling): the LLM decides per turn whether to converse or invoke retrieval; a recommendation turn chains up to 4 LLM calls (tool decision → query understanding → recommendation reasoning → response synthesis), with MongoDB-persisted sessions and 4 hot-swappable tool-calling models.

Retrieval & KG — Hybrid retrieval behind the agent's search tool: ChromaDB skill-vector search fused with Neo4j graph traversal over a 2,073-node / 3,396-edge course–skill–app knowledge graph (452 CMU courses, 77 VR apps, 1,544 LLM-extracted skills), with a semantic-bridge fallback for sparse queries.

Evaluation — Later benchmarked the retrieval layer offline: 200 synthetic queries (80 skill-phrase + 120 LLM-paraphrased learning goals, graph-derived graded qrels, 77-app pool) against random / keyword / BM25 baselines with bootstrap 95% CIs. Hybrid retrieval beats the best lexical baseline at MRR@10 0.74 vs 0.56 and NDCG@10 0.40 vs 0.35 on paraphrased goals, and Recall@5 0.57 vs 0.21 on direct skill queries.

Data pipeline — Automated the data lifecycle: a two-stage CMU Schedule-of-Classes fetcher covering 50 departments with semester-aware incremental merge, LLM skill extraction with semantic dedup (MiniLM embeddings + agglomerative clustering), and one-click knowledge-graph + vector-index rebuild that hot-reloads the live RAG service without restart.

Ops console — Admin dashboard with a live job console orchestrating data fetch, skill extraction, and graph rebuilds; LLM model and per-IP rate-limit config persisted in MongoDB, hot-updatable without restart; structured interaction logging for follow-up analysis.

Delivery — Shipped as a plug-and-play Docker package (Flask + Gunicorn + Neo4j compose), deployed to the school's VM by the capstone team with agent smoke tests closing the handoff loop.

AgentsKnowledge GraphsRAG

May — Aug 2025

XY Investments · AI Implementation Engineer

Two internal LLM systems built 0 → 1 for a ~100-person investment firm's research workflow — a multi-source data-dictionary retrieval engine and an LLM agent framework over the firm's market-data stack; both shipped to production firm-wide.

Read details

Data Dictionary RAG — Built and shipped the firm's unified data-dictionary retrieval system, in production behind a web UI and HTTP API (Gunicorn + Docker): Wind and seven other financial data sources served by one hybrid engine — BGE dense retrieval + BM25 keyword search fused by reciprocal rank fusion — with per-source and merged indexes. Recall@10 62% → 85%.

Apollo Agent — Built the firm's LLM agent framework for internal business processes, in production: a 26-function financial-analysis tool library over RiceQuant market data, exposed through three surfaces — an MCP server, a conversational CLI, and a WebSocket web chat. An embedding + LLM intent router dispatches queries across the tool surface; routing accuracy 34% → 91%.

AgentsRAGLLM Systems

Jun — Jul 2024

Century Frontier Asset Management · Quant ML Intern

Learning-to-rank and representation learning: a pairwise ranking model for high-frequency cross-sectional selection — RankNet-style, the same preference-pair objective that reward models are trained on — and a VAE compressing tick-level order-book data into dense low-dimensional features.

Learning to RankRepresentation Learning

Jul — Aug 2023

Global AI · Data Engineering & ML Intern

Where the graph work starts: a Wikidata BFS crawler seeded from lithium-market companies — 155K relation triples over 55K entities — projected into a company-to-company graph, and a GNN over it to forecast lithium prices, with a per-company LSTM supplying the node features. The funnel from crawled entity to listed company with a complete price history left 57 nodes: the node side, not the edge side, was the binding constraint.

Knowledge GraphsGraph Learning

state/ — who I am

The base comes first, and it stands on its own. Post-training: hands-on GRPO and RLVR pipelines with falsification controls, on top of a working map of the wider family — preference optimization, distillation, and where each belongs. Model internals: working fluency across the attention landscape, from GQA and MLA through sparse and linear variants, plus inference systems and the optimizer picture. Agent engineering: harnesses, tool and skill design, multi-agent supervision, benchmark construction. And the product layer: data pipelines, retrieval, combinatorial solvers, serving, front ends. These are foundations, not footnotes to a thesis.

Where I go deepest is one question: agents whose state outlives the session. Most agents are built for the next turn; I build for the next month. At PiPlan, the state is the world — a plan is a living graph that must stay feasible as reality drifts: an LLM agent proposes changes, a human commits them, a scheduling core keeps it honest. In my research, the state is the model — my first-author work on sequential model editing asks how hundreds of facts can enter a model over time and still hold when the question changes shape, and my current experiments ask what belongs in the weights at all, versus in retrieval. In my open-source work, the state is trust — skill invariants, benchmarks, and hard-signal supervision that let you leave an agent running without watching it.

The deep end of that line is one bet: base models and agent scaffolding are converging on the same question — what should an agent remember, and who gets to write it: an edit, a training run, or the user.

Education

2024 — 2025Carnegie Mellon University · M.S. Information Systems Management

2020 — 2024Emory University · B.S. Quantitative Sciences: Informatics

Stack

Agents & LLM proposal-first agent harness · tool use · model editing · RAG & hybrid retrieval

ML PyTorch · GNNs (PyG) · ranking · imitation learning · bandits

Systems FastAPI · SQLAlchemy · OR-Tools

Frontend React 18 · TypeScript · React Flow