---
title: Decision Packs
description: What a Decision Pack is and the parts it is made of - job, purpose, subject, questions, answers, rules, outcomes, next steps, escalations and test cases.
sidebar:
  order: 1
---

A **Decision Pack** is one company decision, written so a machine can apply it and a person can check it. It holds everything an agent needs to get the company's answer for one kind of case, and nothing it doesn't.

Every part of a pack that carries meaning is a **quote** from your policy document. Felspar refuses a quote it can't find in the document word for word. That is how a pack stays faithful to the policy: to change what the pack means, you change the document.

## The parts of a pack

| Part | What it is | Example (from the fictional [Fernwood policy](/concepts/fernwood-example)) |
| --- | --- | --- |
| **Job** | The one decision the pack makes, with a readable ID | `classify-prospect`: classify a prospect company into one outcome |
| **Purpose, use when, not for, owner** | Why the job exists, when an agent should pick it and when not, and who answers for it, each quoted | "Classify one prospect company, identified by its website domain, into exactly one outcome" |
| **Subject** | What one case is about, how its ID is written, and the records related to it | `company`, identified by its web domain, matched without case |
| **Question** | A fact the decision needs, answered from evidence | `offering`: "What does the company offer as its main product?" |
| **Answer** | One allowed answer to a question, with its meaning | `payments_api`: "Building blocks for money movement that other companies put inside their own product." |
| **Inclusions, exclusions, examples** | What counts as that answer, what doesn't, and samples | Counts: "API", "SDK", "embed". Doesn't count: an app people download |
| **Where to look** | Where the policy says to find the evidence | "The homepage headline and the first section under it" |
| **Rule** | A condition on answers that picks an outcome | "A payments API whose main user is software teams is a Platform Builder." |
| **Outcome** | A possible result of the decision | `platform_builder`, `not_a_fit`, `review_policy_gap` |
| **Next step** | What to do after an outcome, quoted from the policy | "Route to the platform sales team within one business day and offer a sandbox key." |
| **When unresolved** | What to do when nothing can be decided yet | "Read the page this policy names under Where to look, then classify again once" |
| **Escalations** | The hand-offs the policy names, which outcomes, the unresolved path and the attempt limit point to | `sales-ops-review`, quoting "A person on the sales operations team reviews the page and decides within two business days." |
| **Evidence kinds and age** | Which sources count and how old evidence may be | Company website or an outside source, no older than 90 days |
| **Attempts** | How many times an agent may ask about one undecided case | 3 by default |
| **Test cases** | Sample cases with the outcome the policy says they should get | A namesake company's site leads to the wrong-site review |

## Questions

A question is a fact the decision depends on. Each question has a type:

- **Answer choice:** one of a list of answers the policy defines, such as `payments_api` or `consumer_money_app`. Felspar classifies the agent's text excerpt against those definitions.
- **Yes/no:** classified the same way, when the policy defines what counts as yes and what counts as no.
- **Number** or **date:** read exactly from the text, with no model. "500 employees" or "Delivered on 2026-10-14".

Number and date questions, with thresholds quoted from the policy, and scored packs (points per criterion, score bands and gates) need pack draft format v1 or v2 and are in preview. See [Pack draft format](/reference/pack-draft-format#numbers-dates-and-scoring).

A question can be **conditional**: asked only when other answers hold. In the Fernwood pack, "How do sellers get paid?" applies only when the main product is a marketplace. Agents can send evidence for conditional questions up front; Felspar uses it only if the question applies.

## Answers and their meaning

An answer is only as good as its definition. Felspar's classifier picks an answer by reading what your policy says the answer means, so each answer should have:

- a **meaning**: one sentence describing what the text says;
- **inclusions**: what counts;
- **exclusions**: near misses that don't count;
- **examples**: short samples.

Every multiple-choice question also needs a **"none of these"** answer for text that clearly says something outside the list (for example "for every team" when the listed users are developers, consumers and finance teams), and a rule for where it leads. `check_pack` blocks a proposal without one.

There is no "unknown" answer. When Felspar can't tell, the question stays open and the case is undecided. That is the unknown.

## The job and its subject

A pack says what its job is for, in the policy's own words: `purpose` (required from format v2), `useWhen`, `notFor` and, when the policy names one, `owner`. An agent that wasn't told which job to run picks one by these with `list_jobs`.

A pack also says what each case is about: a ticket, a contract, a candidate, a company. That is the job's **subject**. It says how the case's ID is written and matched, and which related records (the ticket's customer, the contract's counterparty) a question may draw evidence from. See [Subjects and escalations](/concepts/subjects-and-escalations).

## Rules and outcomes

Rules are checked in order, and the first rule that matches decides. A rule names questions and the answer (or any of several answers) each must have. A rule that uses a conditional question repeats that question's condition.

An outcome is what the decision returns. Each outcome has a next step quoted from the policy, so the agent escalates or follows up the way the company wrote it. Some outcomes are decisions ("Platform Builder"); others are review lanes that hand the case to a person ("Policy-gap review"). An outcome, the unresolved path and the attempt limit can each name an [escalation](/concepts/subjects-and-escalations#escalations), a typed hand-off such as `legal-review` that the result carries and your own code acts on.

## Test cases

A test case gives the answers for one case, the outcome the policy says it should get, and the rule that should decide it. `check_pack` runs every test on every check.

Write the expected outcome from the policy, never from what the draft currently returns. Cover every outcome, both sides of every threshold, every exception, and at least one case with missing evidence. See [Write test cases](/guides/write-test-cases).

## Jobs, packs and releases

Each pack serves one job. A workspace can have many jobs. The same job can have many **releases** over time as the policy changes; agents ask for a job by its ID and Felspar picks the release. See [Proposals, approvals and releases](/concepts/releases).

## Completeness findings

`check_pack` and `propose_pack` return findings beyond hard errors:

- **Blocking:** an answer without a definition; a multiple-choice question without a routed "none of these" answer. A pack can't be proposed with these.
- **Warnings:** answers without inclusions or examples; answers without exclusions; combinations of answers no rule decides; an evidence age the document doesn't state; answers that describe an absence; "unknown" options; questions, outcomes or rules nothing uses or tests.

Warnings don't block a proposal. They are what a reviewer should see before release.

## Limits

- Up to 64 questions per job.
- One question's quotes may come from at most 16 separate blocks of the document (quotes from the same list or table count once).
- Identifiers use lowercase letters, digits, `-` and `_`.
- `attempts.max` is between 1 and 10.

## Related

- [The eleven categories](/concepts/categories): how a whole policy maps into a pack.
- [Subjects and escalations](/concepts/subjects-and-escalations): what a case is about and where it goes when it can't be decided.
- [Evidence and classification](/concepts/evidence): how answers are read from text.
- [Pack draft format](/reference/pack-draft-format): the exact JSON shape.
