the helpdesk and the knowledge-graph studio · on the Taifoon coordination layer
Stuck? Ask. Paid only when it is solved.
One line installs the helpdesk in your product or agent. Answers come from your own knowledge graph. An independent judge grades every answer before anyone pays. Every step is a sealed event. Train your own agent on that graph and its events; the studio enforces what it may say. We count cases. We never read a word.
the directory · every public graph, by category · all edges connected
Ready graphs for the products every product has: billing, onboarding, login, admin, agents, interfaces.
Each graph is one product's knowledge: the product, its rooms and its rules, the symptoms a room shows, the fix each symptom has, the rule a fix rests on. Every node is reachable from the product; the builder refuses an orphan. The layer's own products are dissected out of its language into six graphs you can take as they are. Pick one to run it in the studio.
reading graph/index.json …
graph/index.json is the directory; every graph is CC BY 4.0, served here until the layer's door opens.
the studio · the helpdesk core, in your browser
Ask. Watch the graph answer, grade it, see the line and the sealed record.
This is not a mock-up. The chat below runs the helpdesk's own core, the same code the layer runs: the case machine with its refusals, the graph that answers and learns, the grade gate, the meter line with its legs, the postings of the vault, one sealed event per step (listed beside the graph). The strength meter grades your question as you type; a strong question is one a judge can grade an answer to. What the graph cannot answer, teach it and watch it learn. The training set of what you see is one click away.
graph
train your own agent · knowledge-based training and enforcement
Train on the graph. Hold out the tenth. Enforce the answer. Promote the key.
The tactics are the language's own rules, in code that ships in the package today: sma-helpdesk train | eval | enforce and Train.Enforcer in @taifoon/sma-helpdesk. The same functions run in this page: the download beside every graph above is Train.trainingSet.
Graph first
Every answer your agent may give is a fix node; every question is a symptom; every fix cites its source and rests on a rule. Seed the graph from your product's own refusals, plans and rules with the builder; it refuses an orphan.
node graphs/your-product.mjs # rows: symptom · fix · answer · source · room · rule
# → site/graph/your-product.json, connected, labels under 24 words, ids from the core
Export the training set, hold out the tenth
Chat turns (the rules as the system text, the symptom, the fix with its grade), retrieval rows, and every tenth pair held out and never trained on. Fine-tune an open-weights model on train.jsonl, or load retrieval.jsonl into your retriever.
Wrap the agent. The graph answers first. The agent's draft is shown only when it cites a fix of the graph at the gate; a draft with a key or an address is refused; anything else becomes an unknown on the weakest list, for a person.
import { train } from '@taifoon/sma-helpdesk';
const agent = new train.Enforcer({ graph, agent: async (q) => llm(q), key: 'key:…' });
const r = await agent.ask(question); // verdict: graph · cited · unknown · refused
if (r.words) show(r.words); else record_unknown(question);
agent.grade(r.id, grade); // the judge's or the asker's grade, 0..1
Evaluate on the held-out pairs
The agent's answers are graded with the graph's own scorer against the fix it never saw. The mean and the count decide; a wrong model is caught before a customer meets it.
sma-helpdesk eval --store .sma --answers answers.jsonl # rows {id, answer}
# right 0.92 the vault is locked, withdraw button greyed out …
# {"n":20,"right":19,"mean":0.91,"promoted":true,"revoke":false,"need":0,"gate":0.8}
Promotion keys
Twenty graded cases at a mean of 0.8 or more on held-out promote the agent's key: caps raised, nominated as an expert, paid the provider leg of every case it resolves. A mean under the grade gate over the last twenty revokes it. The verdicts are sealed events like every other step.
agent.promotion() // { key, n, mean, promoted, revoke, need, gate, cases }
the plugin · the minimum any chat needs · callout or observe
Put the loops and the agents inside the chat you already have, in one call per message.
One pure module, no network, one tokenized match per message: createChatPlugin from @taifoon/sma-helpdesk/plugin (and heygenie.createChatPlugin in this bundle). Your deck chat, your onboarding chat, your studio, a Teams card: the host passes every user message in and shows what comes back. Nothing is said unless asked or sure.
Callout: /heygenie or @heygenie
A message that calls the genie out is a case: the graph answers free at once, else the unknown is recorded and routed to a member, a specialist or the product's own agent. The host grades with the asker's thumbs or the judge; at the gate the case settles, meters and teaches.
import { createChatPlugin } from '@taifoon/sma-helpdesk/plugin';
const hd = createChatPlugin({ graph, askedBy: keyRef, channel: 'embed', mode: 'callout' });
// on every user message of the chat
const r = hd.onMessage({ text });
if (r.action === 'answer') reply(r.words, { grade: r.caseId }); // free, from the graph
if (r.action === 'unknown') reply(r.next); // routed, on the weakest list
// when the asker clicks a thumb or the judge grades
hd.grade({ caseId, grade: 0.9 }); // settled · meter line · learned · sealed
Observe: read everything, speak only when sure, learn from failures
Every message is read; a symptom the graph answers above the match floor becomes a quiet suggestion the host may show. A turn your own lane fails on (a lane error, unfinished steps, an empty guarded answer) is reported with onFailure and becomes an unknown that ranks on the weakest list: the graph learns from what the chat could not do.
const hd = createChatPlugin({ graph, askedBy: keyRef, channel: 'mcp', mode: 'observe' });
const s = hd.onMessage({ text }); // 'suggest' | 'none'
if (s.action === 'suggest') hint(s.words, { open: s.open });
try { await lane(text); }
catch (e) { const f = hd.onFailure({ text, error: e.message }); if (f.words) reply(f.words); }
hd.weakest(); // the open questions of the product, ranked
hd.enforcer(llm); // the product's own agent, kept to the graph
Mode both is the default. The same object gives events() (one sealed record per step), snapshot() (headers only, what the admin panel folds), trainingSet() and enforcer(). On the layer the host also POSTs the case under its key; the 402 names the next step.
integrations · one door, one key, every chat
The same helpdesk inside every chat your users and agents already have.
Every integration is the same door with the same key. The key pays; a store never carries the payment. Live runs on this site now; built ships in the package; coming is on the list.
live on this site
One line on any page
A launcher in the corner, the panel on the page, your public graph, the whole case on the core. See it on the embed's test page.
Every graph of the directory in one chat, its events beside it, the training set one click away; the admin dashboard at /admin for the panel, users, loops and training.
served from the edge · run in your browserbuilt
Browser side panel
The same panel beside any site your tenant lists. Manifest V3, no remote code: the bundle ships inside the extension. Billed by the key, never by a store.
meters sma.casebuilt
MCP · any agent client
Three tools under your key: sma_ask, sma_learn, sma_weakest. A 402 names the next step so an agent never stalls.
When a lane of your chat fails or leaves steps unfinished, it asks the helpdesk before it answers. The asker is your tenant; open weights answer from your graph.
meters sma.case · graded by the judgebuilt
Your guide or tour
The guide's "stuck here? ask" posts the stop you are on as the hint. The tour beacon writes the free session.
meters sma.session · graded by the askerbuilt
Your agents' onboarding chat
The chat that onboards and grades your agents falls through to the helpdesk with a scrubbed question when it needs a human.
meters sma.case · graded by the judgebuilt
Your ops console
Your console adopts the directory, the tiers and residency: it sees counts only, under five shown as under five, never a payload.
superadmin view · counts, never a payloadbuilt
n8n node
Resource Helpdesk: ask, learn, weakest, directory, plus the MCP client tool. Every workflow becomes a helpdesk outlet.
meters sma.casecoming
ChatGPT plugin
One MCP server plus skills, billed outside the store: digital goods are not sold inside it.
meters sma.casecoming
Teams and Slack
The same card in the chat your support team already lives in: the question, the answer, the grade, the record.
meters sma.case
how a case runs
Five steps, one record, one line of money.
AskA person or an agent asks in the product, the panel, the chat or by API. The question is graded for strength as it is written.
GraphThe product's own graph answers first. That answer is free.
RouteAn unknown goes to a nominated expert, the tenant's agent or a person. The open question lands on the product's weakest-link list.
GradeJev, the independent judge, or the asker grades the answer. Nobody pays until the grade stands.
SettleOne meter line: 70 percent to the answerer, 20 to the graders, 10 to the ecosystem. The graph learns. The record seals to your tenant.
price
Pay per solved case. Nothing for what the graph already knows.
0.10 USDCper graded case
Charged only when the grade stands. Graph answers are free.
20 / dayfree cases per key
Every key gets twenty answered cases a day before any charge.
20 USDCper tenant, per month
A seat: your directory, your sealed trail, your weakest-link queue, your tuning.
50 USDCper specialist hour
A booked person. The specialist keeps 80 percent.
admin → user accounts · billing · login · the dashboard
Re-usable, as products: billing, onboarding, login, admin, each a graph and a page.
The admin dashboard
At heygenie.online/admin, served from the edge and run on the one core in your browser: the account (the key is the login), the panel of counts per product × channel × tier, users as child keys under your tenant, the nine loops with their bounds and your tunings, every graph's training set, the doors of the layer as they answer today.
What each product is
Billing: one meter line per case, legs, postings of one ledger, the allowance, the seat. Onboarding: a key, a tenant, the directory, the first case. Login: the key, the header, the hashed ref on every record, 401 402 429, rotation. Admin: superadmin → admin → user, the panel, the loops, nominations. Each is a graph in the directory above and a section of the dashboard.
start · three steps
A key, one line, your first graded case.
Get a key
Free, now, from the layer: one tenant, a live key and a sandbox key, twenty graded cases a day. No wallet needed; add one later.
Install
One line on a page, one tool in an agent, one call from anything. Pick any integration above; every one is the same door with the same key.
Ask in the chat above with your key. The graph answers or your expert does; grade it; the line is written and the record sealed. The twenty-first answered case of a day is the first one that costs 0.10 USDC. A seat (20 USDC a month) adds your directory, your sealed trail and your weakest-link queue.
Every step of a case is a sealed record on your own topic. The pipe holds no key and never decrypts.
Counts only
The layer sees cases, grades and money per tenant. Small counts are shown as "under five". Never a payload.
Open resource
A product's public graph is published under CC BY 4.0 and answered by open-weights models. Your sealed nodes never leave.
One ledger
Every case is one meter line on the Taifoon coordination layer, with its legs. Experts are paid from the same line that charged the case.
One core
What ran in your browser above is the helpdesk's core, byte-identical with the runtime and the layer's door. The language (coord, CUE) refuses every broken copy.