Wire

A Slack knowledge bot with a citation on every claim.

One slash command, an answer built only from your own team’s facts with a numbered citation behind every claim, and it goes to you and nobody else. Harbor speaks in Slack only when someone asks it to, and only to them.

The door for people who do not open a terminal

Most of what a company knows is needed by people who will never run a command. /harbor is one slash command in Slack that answers from the same brain, under the same access rules, with the same citations as the Ask page in the web app.

It also saves. /harbor remember, a tag, and the message menu each keep a decision for the team, and the Slack tutorial walks through all of them. This page is about asking.

The same, not similar. There is one answering engine and Slack calls it with a label saying where the question came from. If a Slack answer ever differed from a web answer for the same person and the same question, that is a bug rather than a feature, and the service that renders it says so in its own header.

Turn it on

  1. Connect Slack once, in the web app

    An admin opens Sources, finds Slack in the list (the Available tab shows what is not connected yet) and presses Connect. One grant covers both halves: the channels Harbor may read, and this command. If your workspace already connected Slack as a source, the command is already there and there is nothing to install.

  2. Type the command with no question

    slack
    /harbor

    You get the usage line back, privately. It costs nothing, reads nothing and answers in well under a second, which makes it the cheapest way to prove the command is really installed before you trust an answer from it.

  3. Ask something

    slack
    /harbor what is our deploy window?

    A placeholder appears immediately, and the answer arrives under it. Questions are capped at a thousand characters, and a shorter one ranks better anyway.

  4. Link your account, if it asks you to

    Harbor has to know whose access to answer under before it will answer at all. It matches the confirmed email on your Slack profile to a Harbor member. If that fails you get a Connect my Harbor account button. It opens a page that signs you in if you need it and names the Slack account and workspace it is about to link, so you can see the account is yours before you click. Connect, and Harbor answers the question you were refused for without you sending it again; every later question answers as you. The link works once and lasts fifteen minutes.

    If the email on that Slack account is not the one you signed in to Harbor with, the page stops and says Check this is your Slack account, naming both addresses. The button then reads This is my Slack account. Press it only if the Slack account is yours: if someone sent you the link, whatever their Slack account asks or saves would use your access.

Why it refuses rather than guessing

Harbor resolves your identity two ways and neither of them is a resemblance: a mapping you confirmed by hand, or an email Slack itself has verified. It will not match you by name. The reason is the worst case rather than the common one: one Dan Cohen reading another Dan Cohen’s filtered answer is not a misattributed sentence, it is an authentication bypass, and a name match is a guess.

An unverified Slack email is not a credential either. Some Slack workspaces let a member set their own address without confirming it, so accepting one would let anybody who can join the Slack team claim any Harbor account by typing its address into their profile.

The two usual causes of a refusal are dull and worth knowing: a different address on your two profiles, or you are not a member of the workspace this Slack is connected to. The button settles both.

What comes back

The reply has four parts, and three of them are there so you can check the fourth.

  • The answer, in prose, with a [#1] marker immediately after every claim it rests on. A sentence resting on two facts carries both.
  • One line per cited fact, reading [#1] convention · Engineering: what kind of thing it is, then the scope it lives at, then the source it came from when there is one. Eight get their own line and the rest are summarised.
  • The footer, which says what was searched and what was withheld. This is the instrument.
  • A 👎 This is wrong button, because the answer being wrong is a thing you should be able to do something about from where you are standing.

Can a Slack bot answer only from our sources?

Yes, and /harbor does: the model sees only the numbered facts Harbor found in your workspace for that question, and when they do not cover it, the reply says it could not answer instead of guessing. It is told never to fill a gap from general knowledge, never to invent a number that is not in the list, and to answer with a refusal rather than a hedge, because a confident wrong answer about your own company is worse than silence.

The facts are your team’s own and nothing else: up to 12 atoms from your brain, such as rules and memories, and excerpts from up to 3 uploaded documents. Rules that went live on their own and are still on trial are among them, ranked lower than rules a person approved. Only what you may see is searched, and the footer says how much was hidden from you.

Your sources reach the answer through the brain, not directly. Asking never opens Slack, GitHub or Notion to read a channel or a page; what Harbor has already kept from them is what the answer can cite. See what each connector reads from GitHub, Slack and Notion.

Narrowing it to one Space

Put a bracket at the front of the question and the answer comes from that Space alone.

slack
/harbor [in Engineering] what is our deploy window?

It is a typed literal rather than something inferred from your wording, and that is deliberate: Slack has no picker, so the bracket is the picker. Writing in the Engineering space, what is our deploy window asks a question about Engineering rather than scoping one to it, and the scope has to be a thing you chose rather than a thing a model read out of your sentence.

Name a Space that does not exist, or one you are not on, and you get a refusal listing the Spaces you are actually on. It never falls back to searching everything. Answering the wider question after you narrowed it on purpose would be a scope lie, and the only place it would show is the footer you were not looking at.

Every way it declines

None of these is an error page. Slack kills a slash command at three seconds, so the answer arrives on a second delivery, and anything that escapes on the way is a command that silently never replies: the worst failure this surface has, because it is indistinguishable from the product being broken. So every ending below is a written sentence.

What /harbor says when it will not answer, and what to do.
WhenWhat it saysWhat to do
The question is over a thousand charactersThat question is longer than 1000 characters. Shorten it and the ranker will do better anyway.Shorten it. This one comes back at once, before Harbor reads anything.
More than twenty questions in a minuteThat is more than 20 questions in a minute. Give it a moment and ask again.Wait. The web app has exactly the same budget, so Slack is not the cheap way around it.
Slack is not connectedThis Slack workspace is not connected to Harbor yet. An admin can connect it from Sources in the Harbor web app.An admin connects it once, under Sources. It is the same connection that reads channels.
You are a guest in this SlackSlack guest accounts can’t use Harbor. Ask a member of your team.Ask a member of your team. A guest has no Harbor seat to connect, so no button is offered.
You reached it from another company, through Slack ConnectHarbor works only for members of the Slack workspace it is installed in.Ask from your own company’s Slack.
Harbor cannot tell who you areI could not match your Slack account to a Harbor member, so I don’t know whose access to answer with.Use the Connect my Harbor account button. One click, and Harbor answers the question you asked as soon as you do.
You are in more than one workspace behind this SlackYou are a member of several Harbor workspaces connected to this Slack. Which brain should answer?Pick one. Nothing is remembered, so the next question asks again. At most five buttons show; past five, a line under them sends you to the web app for the rest.
Billing is unpaidHarbor is paused for Acme while a billing issue is resolved. An admin can fix it in the web app.An admin fixes it in the web app.
You typed a Space and no questionYou named a Space but not a question. Try /harbor [in Finance] what is our deploy window?Add the question after the bracket.
You named a Space you are not onI could not find a Space called Finance that you are on. Yours: ...Fix the name or drop the bracket. It will not quietly answer the wider question instead.
You named a Space and are on no Space at allYou are not a member of any Space in Acme, so there is nothing to narrow to. Drop the [in …] and I will search everything you can see.Drop the bracket, or ask an admin to add you to a Space.
The Free plan’s questions for today are used upToday’s 10 Free questions across Ask and chat are used up. They come back at midnight UTC, about 5 hours from now. Pro removes this limit.Wait for midnight UTC. Slack counts against the same daily allowance as Ask and chat in the web app.
Nothing is indexed yetI have nothing indexed for Acme yet, so there was nothing to search.Connect a source, or approve something in Review.
Plenty is indexed and none of it matchedI could not answer that from what Acme knows.Press 👎 This is wrong. A question the brain should have answered is the most valuable thing the queue can get.
Something broke on the waySomething went wrong answering that. Please try again.Ask again.

The two empty answers are worth telling apart, and the product spends a database read to do it: nothing indexed yet is a setup problem, while plenty indexed and nothing matched is a knowledge gap. Both are true things to say and neither is a blank card.

Correcting a wrong answer

Press 👎 This is wrong and a form opens asking what is true instead, plus an optional menu naming the facts the answer cited. Two sentences is enough. It files into Review as a proposal for somebody with approval rights, and it is indistinguishable there from a correction filed in the browser: same queue, same pairing, same approval. If an admin can tell which door it came through, that is a bug.

Naming the wrong fact is what makes the correction worth more than a complaint. A named rule is paired with your replacement, so approving yours retires the old one in the same action rather than leaving both in the brain contradicting each other. Leave the menu empty and it lands as a plain proposal, with nothing superseded and the outcome said out loud rather than reported as filed.

Correcting the answer that said nothing is allowed and is often the best one you can file. You should know this, and you did not is exactly the gap the queue exists to close, and it arrives with nothing to retire.

What Harbor cannot do in Slack

The app holds eight scopes. Five let it read: the list and history of public channels, joining a public channel an admin pointed it at, and enough of a profile to tell which person wrote something. Two let people reach it: the slash command, and hearing a tag. The eighth, chat:write, is its one write.

Some things are properties of the grant on the consent screen, which you can check instead of believing us. Harbor holds no permission to read the history of a private channel or a direct message. And chat:write.public and im:write are deliberately absent, so it cannot post into a channel it was never added to.

chat:write is wider in Slack’s terms than in our use, and we would rather say so. Slack grants it as the right to post as Harbor wherever Harbor is. Harbor’s code makes exactly one call with it, chat.postEphemeral: a reply that only the person who tagged it can see, needed because a tag, unlike a command, arrives with no reply address of its own. That is a policy in our code rather than a limit of the grant, and it is the one claim in this section you have to take from us.

What lets it answer at all is narrower than a permission. A slash command arrives carrying a single-use reply address, good for half an hour, which Slack hands over precisely because you ran the command; the correction form opens against a trigger that Slack mints when you press a button and which expires in about three seconds. Both are capabilities handed over by something you did, not standing rights over your workspace.

Who sees the answer?

Only you. Every reply to /harbor is visible to the person who asked and to nobody else in the channel, and so is every refusal. The answer is computed under your access and it reports how much was withheld from you, so posting it to a channel whose members have different permissions would be a data leak with a one-word diff. The word is not a parameter anywhere in the code.

The same goes for saving: the reply to /harbor remember, to a tag and to the message menu goes only to the person who saved. Nobody else in the channel sees that Harbor was asked anything.

Next, the half of Slack this page deliberately left alone: what Harbor reads, which channels you pick, and what it refuses to take even from those: connect Slack, GitHub and Notion as sources.