Skip to content
Back to projects

Building Feedback Gauge

From scattered feedback to a question worth investigating—with the evidence still attached.

The operating problem

Survey comments and performance notes arrive through different channels. A theme can look significant in a summary while the original context is hard to find. I built this prototype to explore how a People team could move from a signal back to the feedback that supports it.

What I built

Feedback Gauge connects a company overview, teams, engagement drivers and individual feedback records. The demo includes scoring paths and a visible distinction between model scoring and a heuristic fallback. The purpose is to make the evidence inspectable, rather than ask the reader to trust a number alone.

Walk through one example

  1. Open the fictional Harbor Labs overview.
  2. Explore the alignment driver and the related feedback.
  3. Read the original comment about decision ownership, alongside its context.
  4. Use that evidence to prepare a follow-up question for a manager. The prototype does not make an employment decision.

What this demonstrates

The result is a working, inspectable example of my approach: connect fragmented information, make the handoff clear and leave judgement with a person. It is a prototype using invented names, survey comments and review notes—not a claim of measured improvements at a real employer.

Under the hood

Technical architecture

The portfolio demo uses bundled fictional Harbor Labs data. It has no live HRIS connection or persistent employee database; scoring and streaming run in server routes.

  1. Interface

    Next.js · React · Motion

    Renders team drivers, survey cycles and supporting feedback. Local React state updates the view as events arrive.

  2. Scoring API

    POST /api/pulse/score

    Accepts feedback and context; sends four judgments together to TypeSafe: one theme Choice and three ordered Scores. The API key stays on the server.

  3. Composition

    TypeScript calculations

    Normalizes scores by 3. Gauge weights engagement at 50%, inverse flight risk at 30%, and inverse performance concern at 20%. The separate concern score uses 45%, 35% and 20%. These are prototype design choices, not validated employment predictions.

  4. Data and events

    Bundled JSON · server-sent events

    The initial dashboard loads a fixture. GET /api/pulse/stream replays up to 22 fictional signals; optional live scoring can replace a cached score. No new dataset is persisted.

Failure and fallback path

Without a TypeSafe key, single-comment scoring uses heuristic-v1. Streaming defaults to cached fixture scores. A replay is not evidence of a live Jev request; check the scoring source before interpreting a result.

One request, end to end

  1. Feedback and role/team context enter the scoring route.
  2. Jev returns typed theme and score judgments; code computes the composite.
  3. React presents the result and retains the original comment for inspection.

Why it is built this way

  • Keep numerical composition in code so the weights can be inspected.
  • Keep the demo fictional and distinguish model scoring, heuristics and fixture playback.
  • Let people inspect evidence rather than treat a concern score as an employment decision.

Explore further

Explore the operating principle behind the project