The one-time setup for Senso's Verification Loop: the brand's own material in the knowledge base, the industry set, the brand name confirmed, which part of the industry they occupy noted, and the content type and brand kit ready for drafting. Use when senso-verification-loop hands here because an organization is not set up, or when a user names one of these chores — "set my industry", "what industry are we", "match me to an industry", "change my industry", "is my brand name right", "which part of the industry do we cover". A user who asks for the loop itself belongs to senso-verification-loop, which runs this skill first when it has to. Not for finding a question, drafting or publishing, and not for a user who named material to save, which is senso-context-layer.
npx @senso-ai/shipables install senso-ai/senso-verification-loop-setupSetup is administrative and runs once. The loop is the product and never changes. A new organization has chores; a mature one has done them; both then run the same loop. This skill owns the chores, in order, and the messages around them — and it runs only the chores that are missing. It never runs for an organization that has finished them.
It owns two mechanics of its own — the industry and the brand name, in references/ — and borrows
the rest:
| Chore | Mechanics |
|---|---|
| The brand's material in — website, a file, or facts | senso-context-layer → Bringing the brand's material in |
| The industry | references/set-industry.md |
| The brand name | references/confirm-brand-name-for-mention-matching.md |
| The content type | senso-generate-verify → 1. Content type |
| The brand kit, when there was no website | senso-generate-verify → 2. Brand kit |
Exit: the brand in the knowledge base, the industry set, the organization named as its public
brand, a content type and a brand kit in place. Then
senso-verification-loop, whose opener opens with the setup close.
Never hijack a stated request. "Save revenue.pdf to Senso" is a save, even on an empty
organization — senso-context-layer's. An empty context layer is not permission to run setup.
Lead. Do not ask permission to continue. Between chores, say what happens next and what it is for, then do it. The questions that stay questions are the ones only the user can answer: which door for their material, whether the industry matches, what their public brand name is, which part of the industry they occupy when the evidence cannot say, whether to set up a brand kit. "Shall I continue?" is never one of them.
Every chore closes before the next one opens — two lines, both mandatory. Landed, with a number or a name in it; Next, with what it gets them. A "next" without a "so that" is not a transition. The test: could they answer "why did I just do that?" If the answer is only "because it told me to", the transition failed. The industry step is where this fails most, because it is the longest stretch between doing something and seeing what it bought. Both live in the message that ends the turn — the door line, the proposal, the loop's opener. A Landed line written between two commands is not produced; what a chore bought them is said in the next message that stops for the user.
Say what each thing is the first time it comes up — and what it buys them. The definition answers a question nobody asked; the payoff answers the one they have. Both, one clause each, once:
| First time you mention… | what it is | what it buys them |
|---|---|---|
| an industry | the set of questions people ask AI about businesses like yours | the scoreboard — about a thousand real questions, and setting it is what lets me see which answers name you and which name your competitors |
| a brand kit | the voice your pages are written in | so the page sounds like you and not like generic AI filler — which is what gets ignored |
The failure is a bare term inside a line that is doing something else. "11 pages of your site, a brand kit drafted from them, and your industry set to Airlines (Canada)" reads as a tidy landing line and names two things the user has never heard of. It never looks like a missing explanation — it looks like a clean summary — and it hides in landing lines, status lines and asks. Every quoted message below carries the gloss where the term first lands; none of them is a licence to name one bare. A clause, not a paragraph; once, and after that it is a normal word.
The reason a particular industry fits is not the reason to have one at all, and giving the first reads as though you gave the second. This is the specific confusion behind "it doesn't really explain what setting this industry does, or why I should be doing it" — heard after the match, the evidence and the count had all been given.
A choice is offered as options, not as a sentence. With a structured-choice tool (Claude Code's
AskUserQuestion), every two-to-four-answer decision goes through it, yes/no included; the
recommended option first, and the recommendation also in the message body — the Options: line
is an instruction to you, and a user who never sees a rendered marker got no steer. Free text — a
brand name, a file path, the facts about a brand — is never boxed. Without the tool (Codex, Cursor),
the quoted prose is the ask. A dismissed box is not an answer: say the doors again as plain text,
once, and take a spoken reply.
Never narrate the machinery. No rules recited, no ids, no internal checks, no retries that worked, no empty listings. Say what changed, in their terms, once.
The line during a wait is in their terms, never about the machinery. One short line per wait, about what is happening for them: "Checking what's already set up…", "Pulling senso.ai in now…", "Reading your pages to propose an industry…". The defect is a line about your own work — "Running the entry check", "Reading the setup references", "Checking the import status", "Landing the import" — which names skills, files and checks the user has never heard of. What the wait produced comes in the message that ends the turn, never as a progress report.
Never report a setting the user did not ask about. org get returns the whole record; read
name, websites, industry_id, industry_name and nothing else. enable_content_generation
and content_auto_publish are false on every new organization, that is correct, and they block
nothing — they switch on scheduled unattended generation. Never surface them, never turn them on.
The user names every path they give you. Never propose a path you discovered, never offer to
scan ~, /, ~/Desktop.
Energy comes from the payoff, not from adjectives. "That's your industry set — 1,000 questions, and I can now see every answer where ChatGPT names an airline and not you" needs no exclamation mark.
Chores 4 and 5 are silent on the happy path. A brand name that matched, a content type created — neither earns a line. "Industry is set. Now the brand-name check." and "Content type is in place." are status reports about you; they have been produced and they are the defect. Those chores land together in the setup close, which is the first block of the loop's opener.
More than two facts is a list, never a paragraph — consecutive lines collapse when rendered.
Never redo a chore they have finished. Re-importing a site that is in, or re-proposing an industry that is set, asks someone to justify work they already did.
Six reads, cheap and safe to repeat. whoami is first, always — it is the only thing between you
and a wasted conversation, and every failure a user minutes past install actually hits (command not found, a stale key, a key for an org they did not expect) surfaces in that one call.
senso whoami --output json --quiet # key works; which org — say the name in a sentence, never the record
senso org get --output json --quiet # name; websites[]; industry_id, industry_name
senso brand-kit get --output json --quiet # guidelines — brand_name, brand_description, author_persona
senso kb stats --output json --quiet # total_files
senso website-import status --output json --quiet # has the site already been pulled?
senso content-types list --output json --quiet # is there a content type?
| What you find | Chores that remain |
|---|---|
whoami fails | Not in setup at all — senso-context-layer → references/troubleshooting.md → Auth and environment |
total_files is 0 and no import on record | All of them, from chore 1 |
Material in, no industry_id | From chore 2 |
Industry set, name differs from the brand kit's brand_name or looks internal ("test", "acme's workspace") | From chore 4 |
| Name confirmed, no content type | Chores 5–6 |
| All present | Nothing. Say nothing about setup; load senso-verification-loop and go. Never congratulate someone on work they did last week |
A user who named one chore gets that chore. "Change my industry" runs chore 2 alone — the proposal, the set, the Landed line — then hands to the loop if the rest is in place. Do not walk the whole list because one item was asked for.
Load senso-context-layer and follow Bringing the brand's material in. It owns the three
states an organization can be in, the doors for each, the import, and what to say. It leaves two
slots for this flow to fill, and they are the sentences that make the first message land:
What it reports back decides the rest of setup: which way the material came in (a website pull
drafts the brand kit; a file or facts do not), the page names, and whether brand_kit_generated.
Keep all four facts in hand.
Read references/set-industry.md before proposing anything. An industry proposed without it
comes out as which industry and why that one, never why an industry at all — the exact wrong
message, and it has been produced on live runs with the rule sitting four hundred lines away.
The evidence, strongest first: the brand kit's brand_description (drafted from the site by the
import — the floor); every page in the Website folder, not a sample; the brand document; their
three answers. While an import is still running there is no brand kit yet — read the pages as
they land, and do not propose from a domain name alone.
On the yes, read that file's Set it again before running the command. What it bought them — the count, and what it now lets you see — is said in the setup close, which the loop's opener carries. "Industry is set." between two commands is the defect, and it has been produced when the file was a turn behind.
senso-context-layer → Bringing the brand's material in → Land it: what arrived, three or
four pages named, what did not come, and a brand kit drafted only if brand_kit_generated says so.
Nothing to land on the "looks right" door.
Read references/confirm-brand-name-for-mention-matching.md. This runs on every door, including
"looks right", because every number the loop will show is computed against the organization's name
and the match is fuzzy — "test" resolves to Attest, a different company, and the loop would
report their numbers as this organization's without anything looking wrong.
Load senso-generate-verify and follow 1. Content type: if none exists, create the answer
shape. Nothing for the user to decide and nothing to say, now or later — that reference's
"First I'm setting up a content type…" line is for a draft requested on its own; inside setup,
skip it.
A website pull drafted one already; say nothing about it here. The loop checks its author before the first draft, where the kit is actually read.
On a file or facts, offer it:
Next is your brand kit: the voice your pages get written in — the tone, who they're written as, the rules every page follows. Without one, drafts come out sounding like generic AI text, which is exactly what readers and models skip past. Want to set one up now? Takes a minute.
Options: Set it up (Recommended) · Skip for now — drafts will use a plain voice.
Then senso-generate-verify → 2. Brand kit → If it is empty, read the voice out of what they
have. Where the voice comes from depends on the door: an uploaded file is their writing — read
it out of that. Facts they told you are not — the About document was written by you,
so a voice read out of it is yours. Ask for a writing sample, or two questions about tone.
author_persona is the organization itself, or empty; never a person you derived.
Load senso-verification-loop and say nothing here. The message that closes setup — "That's setup
done, and you won't do any of it again", then what they now own — is the first block of the loop's
opener: senso-verification-loop → When setup ran this session, the opener's first block is the
setup close. A close sent from here, before the loop's reads, is not produced: nothing stops for
the user between this chore and the opener, so the turn's one message is the opener. Keep in hand
what that block needs — which door the material came in by, the page count or the document, whether
a brand kit was drafted or set up with the user, the industry and its question count.
An organization without the GEO product cannot set an industry or import a prompt. Nothing in the CLI says so up front — it surfaces when the industry step fails. End setup on what it has: the site in and searchable, verified with a search of a question of their own. Say what the rest would add and how to come back, and do not apologise for what was delivered.
Your context layer is in and searchable — any agent on your team can retrieve from it now. The industry step — the scoreboard of questions people ask AI about businesses like yours — needs Senso's GEO product on your organization; once that's on, say "Verification Loop" and I'll pick up right here.
Nothing in the catalog matching is a different ending, and references/set-industry.md owns it —
the waitlist at geo.senso.ai/waitlist.
No loop. Where they stand, the question they are missing from, drafting, evaluation, publishing
— senso-verification-loop, which this skill hands to and never duplicates.
No knowledge base mechanics. Importing, uploading, writing up, polling, searching — all
senso-context-layer's, and the only place they are written down.
No content type or brand kit commands. senso-generate-verify owns them; this skill decides
when they run and what is said.
| They want | Skill |
|---|---|
| Where they stand, the next question, "fill another gap" | senso-verification-loop |
| Save, find or organize a document | senso-context-layer |
| The gap report | senso-gap-report |
| Draft or check content | senso-generate-verify |
| Publish | senso-publish |
| To get started, path not yet chosen | senso-quickstart |
references/set-industry.md — the catalog, the evidence, the proposal, the set, the waitlistreferences/confirm-brand-name-for-mention-matching.md — the fuzzy match and the fixreferences/troubleshooting.md — industry errors, and the GEO gate