Recommended Free Tools
A portfolio agent is more trustworthy when ordinary code decides what it may say—not when its prompt merely asks it to avoid hallucinations. The practical design is to retrieve from reviewed sources, make the model return short claims tied to evidence IDs, validate those claims, and refuse anything unsupported.
Why a portfolio agent needs an answer boundary
A portfolio chatbot speaks for a person whose work history, projects, and skills a visitor may be assessing. An invented employer or project can do more harm than an empty answer. Owen Adira, describing his own portfolio use case, puts it this way: “A portfolio agent that invents an employer or a project is worse than no agent at all, because the person reading it is deciding whether to trust me.”
As an Amazon Associate I earn from qualifying purchases.
That makes the central engineering question not simply how to prompt a model, but how to prevent unsupported claims from reaching the visitor. Adira’s guiding principle is: “The model is the least trusted part of the system; design around that.” His implementation, published September 30, 2026, is one developer’s account, not an independently reproduced benchmark.
Build a traceable evidence base
Keep the source attached to each fact
Adira assembled his graph from existing portfolio data, prepared chat answers, a CV, and an older personal site. Each fact is represented with an evidence node that records its provenance. A source-authority tier helps distinguish, for example, a current portfolio record from older material.
#1 Best Overall
When sources disagree—such as over employment dates or a project URL—the system retains both versions as candidate claims and records a resolution that selects the higher-authority one. This is safer than silently overwriting a fact: the conflict and the reason for the chosen value remain inspectable.
Remove private data before it becomes evidence
The author says phone numbers and street addresses are removed during ingestion, before evidence nodes are created. That puts privacy protection upstream of retrieval, rather than relying on the model to notice and omit sensitive information later.
Constrain retrieval before the model answers
The request path begins by limiting the question to supported public work and selecting a topic. The workflow then runs fixed, pre-written graph reads. The model cannot construct arbitrary graph queries, and the author reports caps of four graph calls, 24 records, and 12 seconds per question.
Rank #2
Trusted-domain web search can optionally provide context, but its results do not override the curated graph. That distinction matters: public web material may help explain a topic, but it should not silently become authoritative evidence about a person’s own experience.
Fixed read contracts trade flexibility for control. A new kind of question may require a reviewed read path, but the system avoids handing a model open-ended database access. The same principle applies beyond portfolios: grant retrieval only the scope and data a particular answer needs.
Make claims machine-checkable
Ask for claims and evidence IDs, not free-form prose
Instead of asking the model for an unrestricted paragraph, the workflow requests structured claims, each with text and evidence IDs. In Adira’s schema, an answer can contain up to five short claims, with up to eight evidence IDs per claim. There is no field for extra, ungrounded prose outside those claims.
Rank #3
Validate each claim in ordinary code
Before returning a claim, a code-level validator checks that its cited IDs were supplied to the model, that at least one cited source comes from the curated graph, that provenance is consistent, and that citation URLs are copied from the evidence. A claim that fails can be dropped without discarding valid neighboring claims.
This claim-by-claim approach creates an enforceable boundary: the model proposes; code checks. If no claim survives validation, the response should say there is insufficient evidence rather than improvise an answer. A citation is useful only when it points to evidence that actually supports the claim.
Protect visitor privacy and production operations
Adira reports that production does not store visitor questions. Traces are used only in local development, while production logging records fixed failure-reason codes; infrastructure alert emails do not include the visitor’s question. This separates operational diagnosis—such as identifying a validation failure—from retaining potentially sensitive conversation content.
These are choices in the author’s implementation, not a universal privacy guarantee. A deployment still needs to examine its own application logs, hosting telemetry, retention settings, access controls, and alert configuration to ensure visitor content is not captured elsewhere.
Evaluate groundedness and latency together
Use a set of golden questions with two kinds of expectations: what a correct answer must include, and what it must not include. Questions such as “What has Owen built with Angular?” are useful only when the expected evidence and forbidden inventions are defined in advance. Run the evaluation offline against the real model configuration; a plausible demo is not a reliability test.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Adira reports that, in his implementation, removing an output tag and validating claims individually rather than validating the whole object at once changed the number of React questions answered from 10 of 12 to 12 of 12. He also reports one model setup where full reasoning exceeded a 30-second response deadline and, with reasoning disabled, followed the evidence only about half the time. With low reasoning effort, he reports grounded answers on every golden case in 12 to 20 seconds.
Those figures describe the author’s test batch, not general model performance. The article does not state the size of that golden set or provide external replication details. Treat the results as a reason to measure your own system: changing reasoning settings can affect both latency and groundedness, so optimize against your own required and forbidden content, not an assumption that slower or faster is inherently safer.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.One implementation stack, not a requirement
Adira’s chosen stack uses Mastra for workflows, agents, tools, the HTTP server, and local development inspection; Neo4j for the knowledge graph; and a configurable OpenAI-compatible model to produce structured claims. Railway hosts the Mastra server and Neo4j as two services communicating over a private network, while the portfolio site calls the agent API.
This is an account of one architecture, not a claim that these products are necessary or uniquely suitable. The transferable design choices are the source authority rules, fixed retrieval contracts, claim-level validation, fail-closed behavior, privacy boundaries, and evaluation discipline. Those can be implemented with other tools.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Quick Recap
A practical design checklist
- Attach provenance to each fact and define how source conflicts are resolved.
- Expose reviewed, topic-specific retrieval paths instead of model-generated arbitrary queries.
- Require structured claims that cite evidence IDs, then validate the IDs and provenance in code.
- Return only surviving claims; if none remain, state that evidence is insufficient.
- Remove sensitive data before indexing and avoid retaining visitor questions in production unless there is a clear, governed need.
- Test known questions for both required facts and forbidden inventions, and track latency alongside groundedness.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

