Ihza MahendraResume
Back to ML engineering & infrastructure
ML engineering & infrastructure

Living portfolio

Rendering system that builds a per-user portfolio from their real work and refreshes itself after every touchpoint they complete.

What it is

A rendering system that builds a per-user portfolio from their actual work on the platform (submissions, conversations, calibration verdicts, journey entries) and keeps it current. When the user is preparing for two different roles, the system renders two coherent stories from the same underlying work instead of one averaged-out summary.

What it's for

When someone is preparing for two different roles, they need two different portfolios that tell two different stories from the same underlying work. And the portfolio needs to be living, updating itself as they keep working, not a one-time snapshot that goes stale the moment they finish the next stage. A static portfolio is fine for a snapshot in time. A learner who is still moving needs a portfolio that moves with them.

How it was built

Two Postgres tables (profile and assessment) keyed by user-plus-focus so two role tracks render as two coherent rows. A Temporal workflow runs the refresh: RefreshLearnerPortfolioWorkflow walks four activities (gather inputs, synthesize profile, synthesize assessment, persist) and writes the rows the UI and PDF renderer read. The trigger lives upstream in the calibration ingest workflow: every time a touchpoint finishes calibration, a fire-and-forget child workflow kicks the portfolio refresh, carrying the touchpoint label and source tag in the payload. So the portfolio updates within seconds of the user finishing a conversation, a submission, or a session, without the calibration path having to wait on it. Lazy seeding picks a track template from the user's headline if no portfolio exists yet, so the first session already has shape behind it.

My role

Co-contributor on the per-touchpoint refresh trigger, the input-gathering activity, and the wiring back from the calibration substrate to the portfolio refresh.

Built with
PythonTemporalPostgresSupabasePydantic

Want the full technical depth, the tradeoffs, what broke, what I'd do differently? Ask the agent about this project.