Packs & health
Every ask, teach, and task takes a pack. Over MCP, pass its id or slug as packId. From the CLI, <pack> is a slug, a case-insensitive name, or a UUID.
Find packs
Section titled “Find packs”list_packs lists the packs in your current organization that you can read. Call it first, and pass a pack’s id or slug as packId to ask, teach, or task.
| Input | Type | Required | Meaning |
|---|---|---|---|
search |
string | No | Narrow to packs whose name, slug, or description contains this. Up to 200 characters. |
Returns { items }, each with id, slug, name, visibility, and description.
Permission: any org member can list packs they can read.
“Which packs do I have access to?”
edisyl pack listedisyl pack get <pack>list shows the packs in your organization. get shows one. Neither takes flags beyond the global -j, --json.
Create and change a pack
Section titled “Create and change a pack”edisyl pack create --name "Acme metrics" --description "Core KPIs"edisyl pack create --name "Finance close" --visibility restricted \ --admin cfo@acme.com --contributor ana@acme.com --viewer bo@acme.comedisyl pack update <pack> --name "<new name>" --description "<new description>"edisyl pack update <pack> --language ko --asked-languages ko,enedisyl pack publish <pack> --visibility publicedisyl pack delete <pack> --confirmFlag (create) |
Behavior |
|---|---|
--name <name> |
Required. The pack’s display name. |
--slug <slug> |
Optional. Derived from the name when omitted. |
--description <text> |
Optional. |
--visibility <tier> |
organization (default), restricted (only its members), or public (a domain pack in the cross-org catalog). A public pack is published only after its knowledge base exists. It never appears in the catalog unfinished. |
--static |
Keep the pack unchanged. Answering and benchmarks still work. Automatic learning and calibration are turned off. |
--admin, --contributor, --viewer <user> |
Grant that role to a person, by email or user id. Repeatable. Passing the same person to two of these flags is an error. |
--org-members <role> |
Grant every current organization admin and operator one role: viewer, contributor, or admin (read and write are accepted for viewer and contributor). Organization consumers join only when you pass them to --admin, --contributor or --viewer. A person you pass to those flags gets that role instead. |
Members are granted as part of the create. A restricted pack is never left without its members. Every person is looked up before the pack is created. An unknown email stops the create. As the creator, you are the pack’s admin. Organization consumers hold at most viewer access. A pack can be created with up to 500 members; add more afterwards with pack members add.
update takes at least one of --name, --description, --language, --asked-languages, or --static.
Flag (update) |
Behavior |
|---|---|
--name <name> |
A new display name. |
--description <text> |
A new description. "" clears it. |
--language <tag> |
The pack’s primary language, as a BCP-47 tag (ko, en, zh-Hant). A pack detects it automatically from its first document. Detection never replaces a language you set. A language you set can’t be cleared. |
--asked-languages <tags> |
Comma-separated BCP-47 tags for the languages people ask the pack in, such as ko,en. "" clears them. |
--static |
Disable automatic learning and calibration. --static=false allows learning again; calibration stays paused until you resume it separately. |
publish (alias visibility) moves a pack between the three tiers: public, organization, and restricted. It needs the publish capability on the pack.
Members
Section titled “Members”edisyl pack members list <pack>edisyl pack members add <pack> ana@acme.com bo@acme.com --role contributoredisyl pack members set-role <pack> ana@acme.com --role adminedisyl pack members remove <pack> ana@acme.comRoles are viewer (read), contributor (write), and admin. Pass a person’s email or user id. An email must belong to a member of the pack’s organization. add looks up every user first. An unknown email stops it before any grant is made. add exits non-zero if any grant fails. remove uses a user id exactly as given. You can use it to remove someone the organization no longer lists.
Connections
Section titled “Connections”edisyl pack connections list <pack>edisyl pack connections get <pack> <connection-id>edisyl pack connections detach <pack> <connection-id> --confirmShows the provider connections a pack can query, both SQL and API providers. GitHub and Linear connections attach directly to a pack. They never appear under data-sources list.
listreads what is attached and each connection’s stored health. A connection whose credentials were revoked still lists as attached.getasks the provider what the connection can access now: the account it authenticates as and the repositories or teams it covers. Each call is a live provider request and is rate-limited per user.detachremoves this pack’s access and leaves the connection in the organization. It is refused while the pack still has SQL data sources mounted on the connection. Delete those first. Deleting the last one detaches the connection automatically.
All three need manage_sources on the pack. Without it, the CLI reports the pack as not found.
For the documents a pack holds, see pack documents.
Calendar
Section titled “Calendar”A pack’s calendar sets three things: the month its fiscal year starts, the day its weeks start, and its time zone. A pack with no calendar uses the calendar year. Weeks start on Monday and the time zone is UTC. The pack has no fiscal year, and it declines questions about fiscal periods such as “FY2025”.
edisyl pack calendar get <pack>edisyl pack calendar set <pack> --fiscal-start 7 --week-start sunday --time-zone America/Denveredisyl pack calendar set <pack> --time-zone Asia/Seouledisyl pack calendar clear <pack>Flag (set) |
Behavior |
|---|---|
--fiscal-start <1-12> |
The month the fiscal year starts, from 1 (January) to 12. Required the first time a pack gets a calendar. A pack whose fiscal year follows the calendar year passes 1. |
--week-start <day> |
monday or sunday. Defaults to monday. |
--time-zone <zone> |
An IANA time zone, such as America/Denver. Defaults to UTC. |
How each setting changes a question:
| Setting | Example | Effect on a question |
|---|---|---|
--fiscal-start 7 |
The fiscal year starts in July. | “This fiscal year” starts on July 1. |
--fiscal-start 1 |
The fiscal year is the calendar year. | The pack answers fiscal questions. Without a calendar, it declines them. |
--week-start sunday |
Weeks start on Sunday. | “Last week” runs from Sunday to Saturday. |
--time-zone America/Denver |
Dates are read in Denver time. | “Yesterday” ends at midnight in Denver, not at midnight UTC. |
set changes only the settings you pass. The other settings keep their current values. Setting what the pack already has writes nothing. After a change, the pack uses the new calendar for periods such as “last quarter”. clear removes the calendar. The pack then uses the calendar year again.
get needs read access to the pack. set and clear are owner-only and need manage_pack.
Check a pack’s readiness
Section titled “Check a pack’s readiness”pack_health and pack health report the pack’s readiness as a diagnosis. For each tier and for the deployment, it shows accuracy, time, and cost against target. Each figure has its gap, its number of samples, and a 95% interval. One test sample can move a figure by several points. Findings come next, ranked by how much each could improve the pack. Each finding lists the runs and cases behind it and the command to run next. Start here. See Improving answers for how to read the findings and what to fix.
pack_health returns the diagnosis for one pack.
| Input | Type | Required | Meaning |
|---|---|---|---|
packId |
string | Yes | The pack’s id or slug. |
window |
7d, 30d, or all |
No | The live-ask window that time and cost are read from. Default 30d. |
Returns { verdict, figures, findings, mix, knownCoverage, paired, runs, snapshot, stability, pendingDecisions }. stability holds the stopping rule’s verdict for each measure and tier. It does not gate anything. Read a finding’s run with pack_run_cases.
“Is the growth-metrics pack ready? What is holding it back?”
edisyl pack health <pack> [flags]edisyl pack health my_packedisyl pack health my_pack --window 7d --jsonThe diagnosis also lists the plan yield of the newest judged runs: right and wrong answers, plans admitted and retired, and why right answers admitted no plan. It also lists the model spend over the window. Stability comes after the figures. It shows the stopping rule’s verdict for each tier’s accuracy, median and slowest-5% busy time, and cost, over the pack’s full test runs. The newest alerts come last. Stability is for information only. Readiness decides whether the pack is Ready.
| Flag | Behavior |
|---|---|
--window <window> |
The live-ask window time and cost are read from: 7d, 30d (default), or all. |
--metric <key> |
Read one metric over time instead of the diagnosis. See the next section. |
-j, --json |
The full record. |
Only someone who manages the pack, in the pack’s own organization, can read it.
Read one health metric over time
Section titled “Read one health metric over time”To check a fix, compare the values from runs before and after it, not two windows. Each point shows the run that recorded it.
pack_health_metric reads one metric over the pack’s kept snapshots, oldest first.
| Input | Type | Required | Meaning |
|---|---|---|---|
packId |
string | Yes | The pack’s id or slug. |
key |
string | Yes | The metric, such as tier.accuracy, plans.yield.admitted, or spend.phase_usd. |
tier |
known, understood, or new |
No | Only this tier. |
dimension |
string | No | Only this dimension of a broken-down metric. |
window |
7d, 30d, or all |
No | The one window to read, for a windowed metric. |
since |
date-time | No | Values from this RFC 3339 time on, with an offset such as Z. |
limit |
integer | No | The newest values to return, 1 to 500. Default 60. |
Returns { metric, points, truncated }.
“Has understood-tier accuracy improved since the last fix?”
edisyl pack health <pack> --metric <key> [flags]edisyl pack health my_pack --metric tier.accuracy --tier understood --window 30dedisyl pack health my_pack --metric plans.yield.not_admitted --since 2026-10-01| Flag | Behavior |
|---|---|
--metric <key> |
The metric to read over the pack’s kept snapshots, oldest first. |
--tier <tier> |
Only this tier: known, understood, or new. |
--dimension <dimension> |
Only this dimension, such as an activity or a not-admitted reason. |
--window <window> |
The one window to read: 7d, 30d, or all. |
--since <time> |
Values from this date or RFC 3339 time on. |
--limit <n> |
The newest values to show, 1 to 500. Default 60. |
Read a test run case by case
Section titled “Read a test run case by case”pack_run_cases reads one of a pack’s test runs case by case, with Pack health’s verdicts. For each case it returns the question, answering tier, verdict, scorer reason, plan shape, governed queries, reference SQL, answer excerpt, wait, and cost. Wrong cases come first.
| Input | Type | Required | Meaning |
|---|---|---|---|
packId |
string | Yes | The pack’s id or slug. |
runId |
string | No | The run to read. Default latest, the newest complete cold run. |
tier |
known, understood, new, or none |
No | Only cases this tier answered. |
verdict |
correct, wrong, or excluded |
No | Only cases with this verdict. |
reason |
string | No | Only cases whose scorer reason contains this. |
questionType |
string | No | Only cases of this question type. |
answerable |
boolean | No | Only cases whose target is not a refusal. |
groupBy |
string | No | Count the matched cases by reason, plan, model, measure, filter, time, stage, or question-type. |
limit |
integer | No | Cases to return, 0 to 200. Default 20. 0 returns the groups alone. |
offset |
integer | No | Cases to skip. Pass the previous response’s nextOffset. |
Returns { runId, run, matched, groups, cases, nextOffset }.
“Show me the wrong cases from the latest run, grouped by reason.”
edisyl pack runs <pack> [run-id] [flags]edisyl pack runs my_packedisyl pack runs my_pack --latest --tier understood --wrong --group-by reasonedisyl pack runs my_pack 0f3c1a2b --reason "rows are missing" --fullWith no run id, it lists the pack’s target-question test runs, newest first. For each run it shows whether it ran cold, warm, or partial, its status, when it started, the cases it read, how many ended with no answer, its accuracy, and the accuracy of each answer tier it measured. With a run id, or --latest for the newest complete checkpoint, it reads that run case by case, as Pack health counts it. A short id from the list works as the run id. If more than one run starts with that short id, the command is refused and lists the matching runs.
Misses that share one reason usually have one cause. That cause is often the scorer or a stale case, not the pack. Read three cases from a large group before you change anything.
| Flag | Behavior |
|---|---|
--latest |
Read the pack’s newest complete checkpoint case by case. |
--tier <tier> |
Only cases this tier answered: known, understood, new, or none. |
--wrong |
Only cases graded wrong (same as --verdict wrong). |
--verdict <verdict> |
Only cases with this verdict: correct, wrong, or excluded. |
--reason <text> |
Only cases whose scorer reason or its pattern contains this, ignoring case. |
--question-type <type> |
Only cases of this question type. |
--answerable |
Only cases whose target is not a refusal. These are the cases a tier’s accuracy counts. |
--group-by <key> |
Count the matched cases by reason, plan, model, measure, filter, time, stage, or question-type. With no --limit it prints the groups alone. |
--full |
Show each case’s answer, reference SQL, and governed queries. |
--limit <n> |
Runs to list, 1 to 50 (default 12). With a run, cases to show, 0 to 200 (default 20). |
--offset <n> |
Cases to skip, from the previous page’s next offset. |
Only someone who manages the pack, in the pack’s own organization, can read it.
Live grades
Section titled “Live grades”edisyl pack live-grades <pack>Lists the newest real asks graded wrong, and the cold re-checks of any plan that was quarantined.
Steering and objectives
Section titled “Steering and objectives”edisyl pack context edit <pack> # PACK.md, owner-onlyedisyl pack vocabulary preview <pack> "<question>"edisyl pack objectives list <pack>Editing PACK.md is CLI only. The Lexicon and objectives also have MCP tools. See pack context, pack vocabulary, and pack objectives.
Was this page helpful?
Thanks for the feedback.
