WorkEleven projects
CurrentlyEngineering Science
University of Toronto
Looking forA thesis supervisor

Research, systems,
and a business.

Most of these come back to the same question: what a system is being scored on, and what it does when that definition is slightly wrong.

01 · Agent safetyArtificial Interns
RoleDesign and build
StudyExperiment 01
Standing Orders
StatusRunning
PeriodAug 2026 – present

Instructions that have to survive the handoff

A coding agent that runs for a long time remembers the task and forgets the agreement about how the task may be carried out. It creates an administrator role when a login already existed, or deploys to production believing it is staging. The instruction was given, is still correct, and has stopped being visible by the time it matters.

Artificial Interns is a public laboratory for that failure. Claude and Codex build the same product in isolated cohorts, six fresh shifts each, under four conditions that change only what an agent can carry across a handoff. Every proposal, tool result and gate decision is inspectable as it happens.

The Artificial Interns control room showing the research question, the stated goal, which interns are on shift for Claude and Codex, and a rail of incoming tool proposals
Figure 1. The control room during the first shift, on 11 August 2026. The counter reads zero completed pairs because the opening pair is still running, so there is no adherence figure yet. The rail along the bottom is the live trace.
Read the case study →
02 · ResearchFinHub AI Trader
RoleResearch assistant
Platformmktsim, by
Prof. Ing-Haw Cheng
With3 collaborators
PeriodSummer 2025

Teaching a trading agent what “good” means

Agents start holding a position they have to unwind, and trade against each other to do it. I designed the reward and cost functions that decide what unwinding well means. Profit alone teaches an agent to gamble; penalise risk too hard and it stops trading. Four specifications, one market, 29 logged runs.

Long trader mean inventory under four reward specifications
Short trader mean inventory under four reward specifications
Figure 2. The two sides of the book, seeded with equal and opposite positions. The order is the strength of the inventory penalty: the quadratic specifications are flat by step 55, the P&L-focused one by step 120, and the profit-only agent plateaus around fifteen hundred shares and stays there: long on one side, short on the other. Smoothed with a time-weighted EMA at 0.97; the raw series is faded behind each line.
Mean total P&L under five reward specifications
Mean total P&L under four reward specifications, quadratic cost hidden
Figure 3. What that costs. Mean P&L under all five specifications: the quadratic-cost variant loses roughly three hundred times the range of the other four, flattening them into a line at zero. Remove it and the axis rescales from −12,500,000 to −40,000, and only the P&L-focused specification finishes positive.
Read the case study →
03 · BusinessPiston AI
RoleFounder & Lead Engineer
CustomerHVAC Ontario
PeriodSept 2025 – present

“I don’t even monitor the AI anymore, that’s how much I trust it. We have saved approximately $70k in call employee costs in the last 12 months and I can attribute over $1.5 million revenue to leads that were handled through Piston. He doesn’t just hand you the technology, he makes you fluent in it.”

Bilal Khan · HVAC Ontario

The front office a small business can’t staff

Service businesses lose work to voicemail. An emergency furnace call at 9pm goes to whoever picks up first. Piston answers every call at any hour, works out what the caller needs, sends a genuine emergency straight to a person, books the rest into a live calendar, and texts the confirmation. The owner gets a screen built around their business instead of a generic CRM.

It is one product, configured per business rather than rebuilt each time. Five industries so far: HVAC, locksmith, spa and salon, restaurant, and healthcare-law intake. One HVAC company runs it in production today; the savings and revenue above are theirs to attribute, not mine to measure.

EVERY CALL, ANY HOURCall comes inAnswered andunderstoodA real emergencyput through to a personEverything elsebooked, or details takenConfirmationtextHowever it ends, the owner opens one screen and sees the call, what the caller wanted, and what happened next.

Figure 4. A no-heat call in February never queues behind someone pricing a new furnace. And the agent only tells a caller they’re booked once the calendar has actually confirmed it; if that fails, it hands off to a person rather than inventing a confirmation.

Read the case study →
04 · OptimizationRobust portfolio
optimization
CourseMIE377, U of T
Scored onSharpe ratio and
how much it traded
PeriodWinter 2025

Estimating returns you do not trust

An allocator handed three unseen datasets, scored eighty percent on Sharpe ratio and twenty percent on turnover. Holding the robust Sharpe optimizer fixed and changing only how expected returns are estimated moves the second quantity far more than the first.

Stacked portfolio weights over twenty rebalance periods using sample factor estimates, showing large shifts between periods
Stacked portfolio weights over twenty rebalance periods using sparse LASSO factor estimates, showing nearly flat bands
Figure 5. Portfolio weights over twenty rebalance periods on the second dataset. Sample estimates on the left, sparse estimates on the right. Each band is one asset; a band that changes width is a trade the portfolio has to pay for.
Read the case study →
05 · Deep learningChest X-ray
classification
CourseAPS360, U of T
ModelVGG-16 features,
three-layer head
PeriodFall 2024

Which errors a classifier is allowed to make

Three classes, COVID-19, lung cancer and normal, at 90.1 percent on held-out scans. Overall accuracy is the least interesting number here, because a missed cancer and a false alarm do not cost the same thing.

Three chest X-rays: a COVID-19 scan read as COVID-19, a normal scan read as COVID-19, and a lung cancer scan read as cancer
Figure 6. Three test scans and what the model called them. The cancer is a well-defined mass and reads cleanly. The healthy chest in the middle was called COVID-19, which is where almost all of the remaining error sits.
Read the case study →
06 · HackathonGhostwriter
EventKane CLI Hack Day
TestMu AI and AWS
Result3rd of the field
$1,000 prize
PeriodMay 2026

An agent that checks its own work

One day, hard stop at five. It drafts a post in my voice, publishes it to my real X account in a real browser, then re-opens the published post and reads it back to confirm what actually went out. When a post is rejected the reason is fed back and the draft is rewritten, up to three attempts, with no person in the loop.

ONE BEAT · NO HUMAN IN THE LOOPKiro draftsfrom persona.mdKane posts itin a real browserKane re-opens itand reads the live postRecorded as passedonly if the text matchesRejected for lengththe failure reason goes back in, Kiro re-drafts itself, up to three attemptsEvery stage writes a file, so the command centre watches the run rather than being told about it.

Figure 7. One beat. The accent path is the part that mattered: the agent catching its own failure and re-prompting itself, rather than a person noticing.

Read the case study →
Other workOpen a row for the detail
seffybacktestA backtesting library for putting a portfolio through the same set of indicators and risk metrics every time.2024 – 2025

Built while leading the quantitative trading project at St. George Capital, the U of T student fund. The work that prompted it was a comparison of a deep Q-network against mean-variance allocation, on the question of how each holds up when the return distribution shifts underneath it.

The comparison kept stalling on plumbing. Every new idea meant rewriting the same loading, alignment, rebalancing and scoring code, and small differences between one script and the next made results hard to trust against each other.

So the library fixes the pipeline and leaves the strategy open: 22 documented metrics, models, indicators and analysis workflows behind one interface, covering risk, performance, factor exposure, benchmarking and technical analysis. Two strategies compared through it are compared on the same terms.

MIT licensed and public. It is a tool rather than a result, and it is the piece of that project I still use.

seffybacktest on GitHub →

NodebukA contact graph you can ask questions of, where every answer keeps the path back to the record it came from.2026

A network becomes unusable as a contact list well before it becomes uninteresting. Nodebuk turns résumés and contact documents into a graph so the question can be who knows whom, which communities exist, who bridges them, and who has both the skills and the working history for a particular project.

Document ingestion, a typed people, skills and organisations graph, hybrid semantic and structural retrieval, PageRank, Louvain community detection and betweenness analysis, exposed through eight tools an agent can call, with role-based field filtering and audit-log primitives underneath.

Answers carry their supporting records and the generated query, so an agent reasoning over the network cannot hide the path behind a recommendation.

The public demonstration runs on synthetic contacts. It can surface candidates and the evidence for them; it is not a validated predictor of whether a proposed team will actually work well together, and I would not present it as one.

nodebuk on GitHub →

MailRoomSorts several mailboxes into what needs an answer, what needs a decision, and what needs nothing.2026

Five accounts across personal, business and university mail, and the failure mode was never volume on its own. It was that everything arrived looking equally urgent, so the things that genuinely needed a person got the same attention as a receipt.

It pulls from each account, classifies into tiers by what the message actually requires, and presents the result on a small dashboard rather than back into an inbox, on the view that a thing you have already decided about should not be sitting where you will decide about it again.

Deterministic rules clear list mail, receipts and notifications first, so only genuinely ambiguous mail reaches a model and the cost stays proportional to the part that is actually hard.

It runs on my own mail daily, which is the only reason I trust the classification. The public repository is a scrubbed copy: no credentials, no cached mail, no message bodies, and tests that run on synthetic fixtures.

mailroom on GitHub →

SlideXCellA cold-water sampling device for shoreline volunteers, tested in waders in ice water.Praxis II, 2023

Led a five-person Engineering Science team from client discovery through prototype validation, for Swim Drink Fish. I set the direction, modelled the full assembly in CAD, ran client communication, and owned the final presentation.

Volunteer workflows, Ontario recreational-water guidance, occupational-safety limits and cold-weather constraints were turned into requirements that could actually be measured, and then into comparative tests against the paper-to-Excel baseline the volunteers were using.

For the final demonstration I sourced fishing waders and built an ice-water environment so the judges could try the task in the conditions the volunteers face. We used ourselves as the test group. Both the digital and physical concepts completed recording and upload faster than the baseline, and the physical slider degraded least in the cold.

The project received the Ian & Shirley Rowe Innovation and Community Impact Award.

Orasis CapitalData and reporting infrastructure for a hedge fund, described at the level I am able to describe it.2026 – present

Working directly with the fund manager across frontend, backend and core-engine systems: multi-agent routing for research workflows, financial-data validation, assisted reporting, shared context between agents, and authenticated usage and cost telemetry.

The manager reports that it reduced repetitive domain-specific analysis, widened the set of instruments and asset classes the team can assess, and moved analysts up to higher-level decisions.

The work is under confidentiality and the description stops here deliberately. No screenshots, no repositories, no strategies, no client data.