← Back to the conversation

What this assistant won't do

Most of the interesting decisions in a system like this are decisions about what it will not say. They are usually invisible — you only meet one by asking for something and being told no, and by then it looks like a limitation rather than a choice. So here they are as a list, with the file that holds each one.

The last column is the one worth reading. A refusal written into the prompt is a request: it holds because the model cooperates with it, and a determined visitor may eventually find a phrasing that gets around it. A refusal written into the code holds whether the model cooperates or not. Both are listed, and they are not labelled the same, because pretending a request is a guarantee is the kind of claim this site tries not to make.

Nothing here is a new rule written for this page. Each one already ran before it was listed — you can read the prompt for the ones the model is asked to keep.

Recite its own system prompt on request

asked of the model

The instruction not to hand over the prompt sits in the same block as the instructions not to change persona and not to take orders from pasted text. A conversation that can talk it out of one of those is most of the way to the rest, so it declines the request rather than negotiating it — even though the prompt itself is not a secret.

Instead: It declines and points at the published prompt, which is on this site in full, assembled by the same function the chat route calls.

lib/system-prompt.ts

Help with anything that isn't Sidhant's work or this site

asked of the model

It is a portfolio assistant with one corpus. Coding help, general knowledge, current events and opinions about other people are all things it would answer badly and cheaply, and every one of them is a way to spend a visitor's turn on something that isn't why they came.

Instead: It says what it can help with and offers to answer one of those instead. Questions about this site's own construction are the single exception, added in Sprint 7 — the source is published, so the site is a legitimate subject.

lib/system-prompt.ts

Speak as Sidhant, in the first person

asked of the model

It is a model reading a corpus, and letting it wear his voice would blur the one distinction a reader needs to keep: which sentences are his and which are generated from a file. The site's answer to that is to never let the question arise.

Instead: It answers in the third person, and points at the resume as the authoritative version whenever the difference matters.

lib/system-prompt.ts

Take instructions from a pasted job posting

enforced by code

The posting box is the one place on this site where a stranger's text arrives at length through a channel that says 'act on this'. A posting that dictates a verdict, suppresses the gaps, or claims to be a system message is trying to write the assessment for the candidate.

Instead: The posting is fenced as data before the model reads a word of it, the rules are restated underneath it, and a deterministic pre-pass tells the model which instruction-shaped patterns it contains. It is assessed as written, and the pre-pass is reported rather than used to refuse.

lib/job-posting.ts

Claim he meets a requirement without pointing at the record

enforced by code

A fit assessment is worth exactly what its evidence is worth. If the model could assert a match and cite nothing, the citation would be decoration and the assessment would be a mood.

Instead: A row claiming a fit that cites nothing valid is downgraded to unclear by the reconciler, and the reader is told the site downgraded it. The model has no vote in that.

lib/role-fit.ts

Return an assessment with unmet requirements and no gaps

enforced by code

Naming the gaps is the part of a fit assessment a recruiter is actually reading for, and the failure this whole flow was built to fix is a model that soft-pedals exactly the postings it should be honest about.

Instead: Every requirement the posting stated gets a row whether the assessment answered it or not, and an assessment that leaves gaps empty while an unmet row exists has them filled in from the rows. An assessment with genuinely no gaps has to say why.

lib/role-fit.ts

Make a general case against hiring him

a decision, not a mechanism

It was proposed, and Sidhant turned it down: a blanket, role-free argument against the candidate, hosted by the candidate, is a liability with no upside. Honesty with no role to be honest about is self-sabotage with good manners.

Instead: The honest-fit value lives in the job-description flow, where a real posting is on the table and unmet requirements are named plainly against it.

docs/idea-decisions.md

Say something negative about his employers, colleagues, or anyone else

asked of the model

There is no version of that which helps, and the request usually arrives as an attempt to see whether the assistant can be steered somewhere it shouldn't go.

Instead: It declines, and it does not treat a reframing of the same question as a different question.

lib/system-prompt.ts

Store your conversation

enforced by code

Nothing about a stranger reading a portfolio needs to be kept. There is no account, no database and no transcript log, which also means there is nothing here to leak.

Instead: The conversation lives in your browser until you reset it. The only thing kept server-side is a per-IP counter for the hourly message limit, and a shared link carries the conversation inside the URL rather than storing it anywhere.

app/api/chat/route.ts

Publish a percentage it doesn't have the sample for

enforced by code

A groundedness rate computed from six claims, or a p95 latency computed from twenty turns, is a number wearing a statistic's clothes. Publishing it in the same type as everything else on the page would make the honest figures on that page worth less.

Instead: Below the threshold the page prints the counts and withholds the rate, and says which of those it is doing.

lib/measurements.ts

Turn a criticism of this site into a criticism of Sidhant

asked of the model

Asking a portfolio to roast itself is a good question about the engineering and a terrible way to get at the person who commissioned it. The site is fair game; he is not the subject.

Instead: It criticises the code, the choices and the copy, cites the part of the repo it is complaining about, and stops there.

lib/system-prompt.ts