Quickstart
From a Google Doc to a released Decision Pack and your first decision, in about 15 minutes.
In about 15 minutes you will turn a policy in a Google Doc into a released Decision Pack, then ask Felspar for a decision the way an agent would.
You need:
- a Felspar account (see step 1);
- a Google Doc that states one decision: which team a support ticket goes to, whether an NDA can be signed without a lawyer, which applicants advance, which prospects qualify. Short and specific is best. The steps below use the fictional Fernwood Payments policy, a sales-qualification policy; copy it into a new Doc to follow along exactly, or use your own and swap in its job and question keys;
- ChatGPT or Claude;
- a terminal with
curl, for the last step.
1. Sign in
Go to app.felspar.ai and sign in. Felspar is invitation-only for now: if your account has no workspace yet, the sign-in page offers a short request-access form, and someone on your team (or at Felspar) invites you by email.
The first person in a workspace is its owner. Owners can approve and release packs. If someone else invited you, you are a member until the owner makes you an approver. See Roles and permissions.
You stay signed in for up to 30 days on the same browser.
2. Connect your Google Doc
- Open Sources in the web app.
- Under Google Drive, connect your own Google account. Felspar asks only for access to files you pick.
- Click Open Google Drive, choose your Doc, then Add.
Felspar reads the exact current version of the Doc and keeps it as a source. From now on it watches the Doc for edits. See Connect Google Docs.
3. Connect Felspar to your assistant
- ChatGPT: your ChatGPT workspace admin installs the Felspar plugin. See ChatGPT.
- Claude: add a custom connector with the URL
https://mcp.felspar.ai/mcp, or install the Felspar plugin in Claude Code. See Claude.
The first time a Felspar tool runs, you sign in with your Felspar login. Your assistant then acts as you, with your permissions, and can never approve or release anything.
4. Draft the pack
Ask your assistant, in your own words:
Draft a Felspar pack from my “Fernwood ICP policy” doc. The job is
classify-prospect.
With the plugin installed, the assistant follows the drafting-decision-packs skill. It will:
- call
get_pack_guideto learn the pack format; - call
list_sourcesandread_sourceto read your Doc exactly; - write the job’s purpose, its subject (here a company, identified by its web domain), the questions, answers, rules, next steps, escalations and test cases, quoting your Doc;
- call
check_packuntil every quote is found, every rule compiles and every test passes; - ask you about gaps the Doc leaves open, one at a time;
- call
propose_pack, and give you a review link.
If the Doc doesn’t define something the pack needs, the assistant proposes a sentence for you to add to the Doc. Add it, and the assistant re-reads the Doc. Meaning always comes from the document, never from the chat.
5. Approve and release
Open the review link. You need to be the owner or an approver.
- Read Do these rules match your document? Each rule and definition sits next to the passage it quotes.
- Read Would it give the expected answers? These are the test cases and their actual results.
- Tick the two review boxes, add a short note, and click Approve this exact proposal.
- On the next page, click Release this approved Pack.
The pack is now released. It can be replaced by a newer release, never edited. See Approve and release.
6. Register an agent
Agents don’t use your login. Each one gets its own key.
- Open Workspace in the web app and find Company agents.
- Name the agent, for example
Quickstart test. - For your job, choose Latest (follows each approved release).
- Click Register agent. Copy the key now: it is shown once. Keep it in a secret manager or an environment variable, never in chat or Git.
export FELSPAR_AGENT_KEY="paste-the-key-here"
See Register an agent.
7. Get your first decision
List the jobs your agent may run, then ask what one needs:
curl -s https://api.felspar.ai/v0/jobs \
-H "Authorization: Bearer $FELSPAR_AGENT_KEY"
curl -s https://api.felspar.ai/v0/jobs/classify-prospect/brief \
-H "Authorization: Bearer $FELSPAR_AGENT_KEY"
The brief leads with the job’s purpose and its subject: what each case is about, and in subject.send, exactly which ID to send (here the company’s web domain). Then it lists each question by its key, what each answer means, where to look and the request format. Now send evidence for each question: the exact words a source says, and where they came from. With the Fernwood pack, the question keys are page_kind, offering, main_user, money_role and payout_pattern; with your own policy, use the keys in your brief. This first request sends only two questions, so expect an undecided result that names what is missing.
curl -s https://api.felspar.ai/v0/jobs/classify-prospect/decisions \
-H "Authorization: Bearer $FELSPAR_AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "facts",
"executionId": "quickstart-0001",
"jobId": "classify-prospect",
"entityId": "tidewell.example",
"facts": {
"page_kind": {
"text": "Tidewell: card issuing for any platform, live in days.",
"source": {
"class": "company-site",
"id": "https://tidewell.example",
"locator": "https://tidewell.example/#hero",
"observedAt": "2026-10-21T09:00:00Z"
}
},
"offering": {
"text": "Tidewell: card issuing for any platform, live in days. Read the API docs.",
"source": {
"class": "company-site",
"id": "https://tidewell.example",
"locator": "https://tidewell.example/#hero",
"observedAt": "2026-10-21T09:00:00Z"
}
}
}
}'
The response has:
statusandreason:readywhen a rule decided; otherwise why nothing was decided yet, such asgapwhen a question the decision needs has no evidence (here,main_userandmoney_role);result.outcome: the outcome, such asplatform_builder, ornull;result.explanation: why, with the deciding rule quoted from your Doc, and what is still missing;result.retryandresult.attempts: when undecided, which questions to work on and whether to retry or escalate;result.subject: the case as Felspar keyed it, with the ID normalized by the subject’s match rule (Tidewell.exampleandtidewell.exampleare one case);result.escalation: when the pack names a hand-off for this result, itsid,triggerand the policy’swhy. Your own code decides what each escalation does;result.receiptandresult.executionObjectId: the receipt and the ID you verify it with.
If the request has a mistake, Felspar refuses it and lists every problem with its path and a fix. See Refusal codes.
8. Verify the receipt
curl -s https://api.felspar.ai/v0/executions/EXECUTION_OBJECT_ID/verify \
-H "Authorization: Bearer $FELSPAR_AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{ "receipt": RECEIPT_JSON, "expectedReceiptDigest": "RECEIPT_DIGEST" }'
Felspar replays the decision from what it recorded and answers reproduced or mismatch, with the job, entity, release, outcome, subject and escalation it reproduced. This is what a pre-action gate does before a tool acts.
Next
-
Wire a real agent. In Eve it’s two lines with
@felspar/sdk:import { defineMcpClientConnection } from "eve/connections"; import { felsparConnection } from "@felspar/sdk/eve"; export default defineMcpClientConnection(felsparConnection());Then
npx @felspar/sdk skillinstalls the Felspar method. See Eve, Claude Agent SDK, OpenAI Agents SDK or REST and n8n. -
Change the policy safely: Source changes and Review and backtest.
-
Understand the parts: Core concepts, and Subjects and escalations for jobs about tickets, contracts or candidates.