DEV Community

Akinapally Deepika
Akinapally Deepika

Posted on

My Career AI Stopped Me From Applying to Jobs I Would Fail

“Why did it just tell me not to apply?” I looked at the logs as our system flagged a role as high-risk based on three past rejections with the same missing skill.

The Problem We Couldn’t Ignore

Before adding memory, our system was… dumb. Not broken, not useless, but fundamentally limited.
We had built a clean pipeline:

  • Upload resume
  • Extract skills
  • Compare with job description
  • Output a match score

On paper, it worked. In practice, it was repetitive and shallow.
If a user applied to 10 backend roles and got rejected every time, the system still kept saying:
“Match score: 72%. You can apply.”

It had no idea that:

the user had already failed similar roles
the same missing skill kept showing up
nothing was improving over time
We tried improving prompts. We tried better keyword extraction. We even experimented with basic RAG-style context injection.
None of it solved the real issue.
The system had no memory of outcomes.
It treated every job match like the first one. No history. No learning. No adaptation.
Over multiple sessions, it didn’t get smarter. It just repeated itself more confidently.
That’s when we realized:
The problem wasn’t intelligence. It was memory.

What We Built

We built CareerMind, a dashboard-based AI career system that doesn’t just analyze resumes — it learns from what actually happens.

The idea was simple:
Instead of only looking at inputs (resume + job description), the system should:

  • remember past actions
  • track outcomes
  • learn patterns
  • improve future decisions This required more than just bigger prompts or better context windows.

We needed persistent, structured, long-term memory.

The behavior we wanted was:

  • after repeated rejections, the system changes strategy
  • after detecting a skill gap, it stops recommending similar roles
  • after success, it reinforces what worked Not just “better answers” — better decisions over time.

How We Used Hindsight in the Stack

We integrated Hindsight as our Agent Memory layer — sitting between our API logic and decision engine.
Instead of stateless API routes, we now had:

  • memory retention (store experiences)
  • memory recall (retrieve relevant past events)
  • reflection (derive patterns)

You can check out the Open Source Agent Memory system here:
https://github.com/vectorize-io/hindsight

And the docs we followed:
https://hindsight.vectorize.io/

We also explored the broader concept of Agent Memory here:
https://vectorize.io/features/agent-memory


Dashboard showing Career DNA and insights


Job match result with score and missing skills

What We Store as “Experiences”

We don’t store raw text. We store structured events:

  • resume uploads
  • job match attempts
  • rejections
  • advice given
  • outcomes

Example:-

const rejectionEvent = {
  type: "rejection",
  company: "Amazon",
  role: "Backend Engineer",
  missingSkills: ["System Design"],
  timestamp: Date.now()
};
Enter fullscreen mode Exit fullscreen mode

await hindsight.retain(rejectionEvent);

How We Recall Memory
When a user runs a job match, we query memory:

const pastFailures = await hindsight.recall({
  type: "rejection",
  role: "Backend Engineer"
});
Enter fullscreen mode Exit fullscreen mode

Then we analyze:

  • repeated missing skills
  • frequency of failure
  • patterns across companies

Reflection Layer
We derive patterns like:

const pattern = {
  issue: "Missing System Design",
  frequency: 3,
  impact: "High rejection probability"
};

Enter fullscreen mode Exit fullscreen mode

reflectiveMemory.push(pattern);

This feeds directly into decision logic.

Before vs After: One Moment That Changed Everything

Here’s the exact moment it clicked for us.
Before Hindsight

A user:

  • uploads resume
  • applies to 3 backend roles
  • gets rejected each time System response (every time):

“Match score: 75%. Recommended: Apply.”
No awareness. No adaptation.

After Hindsight
Same user flow.
But now:

  • rejection 1 → stored
  • rejection 2 → pattern forming
  • rejection 3 → pattern confirmed

Next job match:
System response:

“High match score, but repeated failures due to missing System Design. Recommendation: Improve before applying.”

This was not hardcoded.
It required:

  • tracking past outcomes
  • identifying patterns
  • changing behavior

That’s when the system stopped being a tool and started acting like a decision engine.

The Unexpected Behavior

We didn’t program the system to reject jobs.
But after enough data, it started doing something surprising:

It began filtering out roles automatically.

Not because of low match score.

But because:

  • similar roles had failed before
  • the same skill gap existed
  • probability of success was low

In one case, it flagged a job with:

“82% match — but high rejection risk based on past failures.”

That combination wasn’t explicitly designed.

It emerged from:

  • stored experiences
  • pattern detection
  • decision weighting We paused and asked:

“Wait… it’s predicting failure now?”
And it was right.

A Dead End We Hit

At one point, we tried storing everything.
Full prompts. Full responses. Raw logs.
It quickly became messy.

  • noisy data
  • slow queries
  • irrelevant recalls

We realized:
Memory is not about storing more — it’s about storing the right things.

We switched to:

  • structured events
  • minimal, meaningful fields
  • outcome-focused data

That made recall faster and decisions sharper.

One Lesson That Changed How We Think About AI Memory

We initially believed:
Better prompts → better system

But what actually mattered was:
Better memory → better decisions

Prompts help in the moment.
Memory helps over time.

The real shift wasn’t:
from bad answers to good answers

It was:
from repeated mistakes to adaptive behavior
If I had to explain this to another engineer building an AI system:

Don’t just optimize what your system says.
Optimize what it remembers.

Because once it remembers the right things,
it starts improving without you touching the logic again.

Top comments (0)