Selected work / 06

Jolene AI

A governed AI system that uses public hybrid RAG over reviewed evidence, bounded conversation continuity, tested model and deterministic responses, explicit action boundaries, and a warm, recognizable personality across my full 20-plus-year career.

My role
Product architect and lead builder
Scope
Product direction, agent architecture, evidence design, character and behavior direction, implementation, evaluation, and release governance
Stage
Deployed career-wide public delegate
Core technologies
TypeScript · OpenAI · Hybrid RAG · Next.js
Jolene AI character portrait used for Carl Welch’s personal chief-of-staff agent

Case study

From a Nevada field camp to a governed chief-of-staff agent.

The problem

After a March 2026 layoff, I spent two weeks that May on BLM land in Nevada with my daughter while she did fieldwork for her geology master’s research. With a generator, Starlink, and my MacBook, I began building Job Search OS. That work showed me I could build something broader: a chief-of-staff agent that could help me organize work, preserve context, and keep moving.

What I built

I imagined a comforting, capable, Jarvis-like partner. Dolly Parton came to mind because I grew up with her music and interviews and associated her with warmth, humor, resilience, and practical encouragement. Jolene is not Dolly, does not impersonate her, and does not imply her endorsement. From that starting point, I led a multi-agent build spanning the portable agent core, private memory, reviewed career evidence, public hybrid RAG, Slack delivery, exact-action approvals, Docker runtimes, prompt-injection defenses, release evaluation, and a researched personality system. I also directed a pixel-character system with a canonical identity, event-driven reactions, regression-tested scaling and interaction behavior, and reduced-motion fallbacks. The attempted greeting animation did not meet the quality bar, so I stopped that effort and kept the live character bounded to a separate set of approved runtime frames. Private and public Jolene remain separate deployments with different credentials, stores, and capabilities.

Key decisions

  1. 01Separate public knowledge from private memory

    The portfolio receives a versioned, hash-verified public artifact. It cannot query the private vault, SQLite database, Slack history, MCP tools, or durable memory.

  2. 02Ground first, style second

    Public hybrid RAG and deterministic validation own the factual answer. Jolene’s warmth, wit, and kindness are rendered afterward and cannot change claims or citations.

  3. 03Treat behavior as product state

    Typing, thinking, answering, evidence, refusal, offline, and loading states drive a bounded character controller. The model never decides which animation runs.

Build retrospective

What the failed animation effort taught me.

The static character design held, but the greeting animation experiment did not. Generated and interpolated frames repeatedly changed Jolene’s face, eyes, hair, hands, and proportions. I abandoned that sequence, preserved the strongest assets, and may revisit a fuller greeting later with a more reliable process.

  1. 01

    Identity drift between poses

    What broke
    Pose-by-pose generation changed facial structure, hair volume, body proportions, eye treatment, and scale enough to make Jolene look like a different person.
    Course correction
    Lock one canonical master, named landmarks, a silhouette envelope, palette anchors, a common 320 by 460 canvas, and a shared waist baseline. Every other image became pose reference rather than identity authority.
    What held
    These controls improved the approved assets, but they did not make the generated greeting experiment reliable enough to ship.
  2. 02

    Transparency versus intentional white

    What broke
    Removing white edge artifacts also damaged sclera, teeth, blouse highlights, and negative space between the arm and body.
    Course correction
    Separate alpha cleanup from protected color regions. Binary transparency checks and explicit intentional-white masks now distinguish artifacts from authored pixels.
    What held
    The asset pipeline can reject halos and holes without erasing facial detail or costume texture.
  3. 03

    Animation ambition versus control

    What broke
    Long generated sequences introduced unstable eyes, hair, hands, and whole-body pumping. More frames did not automatically create better motion.
    Course correction
    Stop the greeting sequence, archive the failed keyframes, and keep the live renderer bounded to a separate set of manually approved runtime frames. Reduced motion uses static representatives.
    What held
    The generated keyframe direction was abandoned. A fuller greeting may be revisited later only if the process can preserve identity and motion quality.
  4. 04

    Behavior regressions in the live interface

    What broke
    A pose could be visually correct and still fail when evidence opened, typing began, loading ended, the panel scrolled, or the viewport changed.
    Course correction
    Route UI events through one state contract and add browser regressions for modal opening, pointing, scale, baseline, containment, fallback, reduced motion, and answer focus.
    What held
    Character behavior is now verified as part of the product interaction rather than approved only as isolated art.

Technical view

Architecture

Private chief of staff, career-wide public delegate, and measured release system13 components · 14 connections

Private memory and action tools stay in Carl’s local trust zone. The public path uses hybrid retrieval-augmented generation (RAG) over a reviewed career artifact, bounded continuity, grounded model or deterministic composition, and a separate evaluation and promotion pipeline.

Private JoleneCarl-owned memory and action zone
Public portfolio delegateRead-only career conversation zone
Composition and releaseMeasured quality and promotion gates
  1. TypeScript · Socket Mode
    Owner surfaces

    Local control center and verified Slack

  2. Portable agent runtime
    Private agent core

    Tasks, memory, policy, reviews

  3. SQLite · Obsidian
    Private state

    Memory, audit, evidence, delivery ledger

  4. Human authorization
    Exact action gate

    Intent, recipient, content, expiry

  5. Next.js · React
    Portfolio chat

    Questions, citations, role comparison

  6. Next.js · TypeScript
    Same-origin BFF

    Bounded schemas and server-only token

  7. Vercel · TypeScript
    Public Jolene API

    Answer, job-fit, policy refusal

  8. Lexical + embeddings
    Public hybrid RAG

    Reciprocal-rank fusion over approved evidence

  9. Versioned · hash verified
    Reviewed career artifact

    Five chapters, 16 roles, 92 published records

  10. Typed conversationContext
    Bounded continuity

    Public context only, short lived, resettable

  11. OpenAI · structured output
    Grounded composer

    Model or deterministic answer, then validate

  12. Playwright · eval runner
    Launch evaluation

    132 cases, 192 turns, red team

  13. CI · Vercel
    Release gates

    Preview, corpus pin, promote, rollback

surfaceservicedataaiintegrationcontrolruntime
Read system connections
  • Owner surfacesPrivate agent core
  • Private agent corePrivate state
  • Private agent coreExact action gate
  • Same-origin BFFPublic Jolene API
  • Portfolio chatSame-origin BFF
  • Public Jolene APIPublic hybrid RAG
  • Public hybrid RAGReviewed career artifact
  • Public Jolene APIBounded continuity
  • Public Jolene APIGrounded composergrounded context
  • Launch evaluationGrounded composerscore
  • Launch evaluationReviewed career artifactcoverage
  • Release gatesPublic Jolene APIpromote
  • Private stateReviewed career artifactreviewed export only
  • Release gatesPortfolio chatportfolio pin

Built so far

  • Carl designed Jolene as one portable agent core behind private local and Slack surfaces, plus a physically isolated public portfolio delegate with its own reviewed artifact, bounded continuity, retrieval, evaluation, credentials, and release gates.
  • Uses OpenAI for grounded answer synthesis through the Responses API, with structured outputs, bounded time and token budgets, no model tools on the public path, and deterministic validation before an answer can be shown.
  • Uses retrieval-augmented generation (RAG) over only the approved public artifact, combining lexical and embedding ranks through reciprocal-rank fusion in a bounded in-memory vector index instead of adding a separate vector database for the 92-record corpus.
  • Exports public career knowledge as a versioned, hash-verified, deny-by-default artifact with review timestamps and revocation continuity. The deployed corpus covers five career chapters and 16 detailed roles in a 92-record reviewed artifact without exposing private evidence or raw Obsidian content.
  • Treats visitor prompts, retrieved notes, imported text, and tool results as untrusted data, applies prompt-injection and disclosure checks, and either keeps public actions read-only or requires Carl to approve the exact action.
  • Carl directed a transcript-backed personality research program and a canonical pixel-character system with an identity lock, semantic state contract, approved runtime atlas, and reduced-motion fallback, while keeping warmth, wit, kindness, and candor separate from factual grounding.
  • Dockerizes the private runtime as separate API, Slack, and monitoring processes sharing durable SQLite state, while the public delegate uses a different image, state volume, environment, and network boundary.
  • Connects through Slack Socket Mode for Carl’s verified owner direct messages and explicit mentions, with channel-aware disclosure policy and a durable delivery ledger that avoids duplicate model calls during retries.
  • Connects the portfolio through a same-origin backend-for-frontend that holds the shared bearer token server-side and forwards only bounded public answer, evidence-manifest, and job-fit contracts to an isolated hosted delegate.
  • Separates build, evaluation, preview, production promotion, corpus pinning, and rollback proof into distinct release gates. The career-wide launch suite contains 132 cases and 192 turns, and the current release passed production browser and answer-mode telemetry verification.
  • Carl originated Jolene’s product direction and directed its architecture, evidence policy, personality goals, safety boundaries, implementation priorities, evaluation standards, and release decisions across a multi-agent development process.
  • After a March 2026 layoff, Carl began Job Search OS during two weeks on BLM land in Nevada while accompanying his daughter’s geology master’s fieldwork, using a generator, Starlink, and a MacBook. The experience led him to imagine Jolene as a comforting, capable chief-of-staff agent, informed by the warmth, humor, resilience, and practical encouragement he associated with growing up around Dolly Parton’s music and interviews.
  • Public Jolene cannot read Carl’s private Obsidian vault, private memory, Slack, SQLite, or MCP tools; voice remains future work, and consequential external actions remain disabled or subject to separate human authorization.

Where it stands

  • Public Jolene can use only the reviewed public artifact. It cannot read Carl’s private Obsidian vault, memory, Slack, SQLite database, or MCP tools.
  • The deployed delegate is pinned to the versioned 92-record career-wide artifact. Future corpus or answer changes still require their own evaluation, browser, telemetry, promotion, and rollback gates.
  • Audio voice remains future work, and external messages or other consequential actions remain disabled or subject to separate human authorization.
  • The public chat is a deployed portfolio demonstration. The broader chief-of-staff runtime remains a private local system for Carl.

Continue exploring

Next case study

View all selected work

Creative technology / AI music systems

ProgressionLab

Deployed public web product

Open case study