← Ascendy 한국어

meta

Why you can't trust an AI-written portfolio — making 'never invented' a structural guarantee, not a hope

· Ascendy Engineering


TL;DR

Source note. Distilled from a portfolio-team intake. It’s all public OSS (AscendyProject/portfolio, Apache-2.0), so the canonical facts come straight from the repo README. Same trust-as-structure vein as the adversarial agent-pair harness redteam and how much hallucination to allow in AI-written prose.

The real problem with an AI portfolio is that it lies

Building a portfolio or résumé with AI is easy. One prompt and plausible bullets pour out. But can you trust them?

The problem isn’t quality — it’s trust. Generative models confidently exaggerate, hallucinate achievements that never happened, and smoothly stuff in recruiter keywords. The reader (a hiring manager) knows this too. So the very label “AI-written” erodes trust. Writing it nicely is already free; writing it credibly is what nobody solved.

The portfolio harness drills into that one problem — never invented — all the way down.

The usual trust model runs backwards

Most AI writers work like this:

The model generates text → you hope it’s true.

Verification is an afterthought, usually a human’s job. If the model writes “cut Kubernetes cluster costs by 50%,” whether that’s real is something the reader has to check separately. Skip the check and the hallucination ships. “Don’t make things up” in the prompt is a request, not a guarantee.

portfolio flips the arrow:

Pin the evidence first, deterministically → the model narrates only on top of that evidence → code verifies the citation of every claim.

That’s where “never invented” stops being a prompt and becomes architecture.

Three layers — the model is called in exactly one place

1. extract   (deterministic)  gh → your actual merged PRs / changed files → an Evidence set
2. narrate   (LLM)            the model writes contribution claims — over the given evidence, citing refs by id
3. ground    (deterministic)  check every claim: is the cited ref in the extracted Evidence set?
                              if not → drop it, or send to a human. Never ships.

The key is that extract and ground never call a model. Gathering the evidence and verifying the claims are both deterministic code. The model enters only in the middle — narrate, the one place that writes a story. That separation is the whole architecture. It’s why this is testable and auditable.

An analogy: the model is a lawyer, and the evidence envelope is sealed separately. The lawyer may argue only by citing what’s in the envelope; cite something that isn’t there and the judge (the grounding gate) strikes the statement. There’s no way for the lawyer to manufacture evidence.

The grounding gate — no “quietly fixed to pass”

The heart of the verification layer is check_claims(claims, evidence). It sorts every claim three ways:

One important detail — the gate does not ask the model “is this true?” That just invites more hallucination. Instead it runs a deterministic check: does the cited ref exist in the evidence set? “Deterministic checks before AI judgment” — the model writes the story, code matches the citations. The point is to not hand judgment back to the model.

And the gate never quietly massages a weak claim into passing. It drops it, or asks a human. “Plausibly patching it in” is exactly the path hallucinations ship through, and that path is structurally closed.

Grounding isn’t a one-time gate

What’s interesting is that grounding is re-enforced at every output stage.

For example, /resume selects which bullets to include for a given job description. As it picks them, it re-checks each chosen bullet’s ref against the grounded set (enforce_grounding). So it’s not “we grounded the portfolio, so a résumé pulled from it must be safe” — it closes the door on hallucinated refs at the very moment the tailored résumé is built. Grounding sits not at the one entrance but at every exit.

Honestly — where it is right now

Not exaggerating is this tool’s identity, so the maturity gets stated honestly too.

Keeping the tool’s philosophy (“never invented”) starting from the tool’s intro post felt like the right call.

Try it

# A grounded portfolio from your real GitHub work:
python -m portfolio --source-type github --source <repo-url> --author <handle>

# A résumé tailored to a JD:
python -m resume --source-type github --source <url> --author <handle> --jd <jd.txt>

The slash command /portfolio is the interactive front door. Repo: github.com/AscendyProject/portfolio (Apache-2.0).

Takeaways


Authorship & citation: Written by Ascendy Engineering; quotable with attribution. Found something wrong? Let us know via a GitHub issue.


Tags: grounding, ai, portfolio, developer-tools, harness, trust