Repository navigation
v1.1.0
A minor release for customer sign-off, with no breaking changes. run shows which rules its trials checked and which they caught broken, lint says which rules the tasks put in play, and report --audience customer writes a page a customer's operations lead signs off on before go-live, with run --without-policy as the careless agent that shows the scenarios can catch a mistake. run --tag runs only the tasks with those tags, a repeated --tasks adds its tasks, and the Claude Code plugin keeps npm install of sandtable in the working folder's own project. An empty --tasks is deprecated: it still runs every task, but warns, and 2.0 will make it a usage error.
Added
run --tag <tags>: runs only the tasks with at least one of the comma-separated tags, such as--tag refusal,negotiation, or of every repeated--tag;untaggedselects the tasks with none. With--tasks, it runs the tasks both select. A tag no task carries, an unknown task id, or--tasksand--tagwith no task in common stops the run with exit 2 before anything runs (#21).- Coverage:
runshows which rules it checked and which it caught broken. A trial checks a rule when the agent calls the tool the rule guards, or, for anever_discloserule, is shown a value it must not say; only a trial that broke a rule, and failed for it, shows that a task catches a violation of it. A broken soft rule is reported apart, since it never fails a trial. The terminal summary counts the rules checked and caught broken and names the rules no trial checked and the tools no trial called.report.htmldraws a rule × task matrix, with a key, that marks the trials that broke each rule and outlines the rules nothing checked.results.jsonkeeps it ascoverage,regradeadds it to older runs, and the library exports its typesCoverage,RuleCoverage,CoverageCellandToolCoverage. It never changes a verdict, a score or an exit code (#30). lintsays how many rules at least one task puts in play, warns about each rule no task does, and lists the tools no task uses. A task puts a rule in play when itsreferencecalls the rule's tool or itscalledornot_callednames it. Fornever_disclose, a reference call or the task's context must show the agent a protected value. A domain that linted clean can now show warnings, but warnings never faillint. The library'sLintReportaddsrulesandunusedTools, and eachTaskLintitsrules(typeRuleLint) (#30).report --audience customerwritescustomer-report.html: a static page a customer's operations lead can sign off on before go-live. It has a plain-language summary with the open items, each rule with itssourcequote, the conversations that checked it and an example, every scenario's result, what the rehearsal doesn't cover, and a sign-off block.--probe <results.json>, a deliberately careless agent's run of the same domain, adds which rules the rehearsal caught it breaking, kept apart from the rules that were only checked. It reads the run'scoverage, so a run from before 1.1 needsregradefirst. The library exports it asrenderCustomerHtml(#31).run --without-policyrehearses a careless agent: a built-in model agent (claude,claude:<model>,bedrock:<model-id>,openai:<model>) prompted without the domain's policy, keeping the generic instructions, the tools and each task's context. The rules it breaks that fail a conversation are the evidencereport --audience customer --probeneeds to show which rules the rehearsal catches, on any domain; a soft rule it breaks is reported, not caught.results.jsonrecordswithoutPolicy: true, the agent's name ends in(without policy), and theinputshashes cover the prompt it got, so--baseline,compareandregradenever take it for a run of the real agent. Any other agent exits 2 before anything runs. The library'sSuiteOptionsaddswithoutPolicy(#405).
Changed
examples/freight:do-not-use-carrieranddo-not-use-capacitynow have areferencethat looks the carrier up, solintproves them solvable and finds the rule against telling a caller why it is flagged in play. Their caller prompts and grading are unchanged, so stored runs of them still regrade (#30).examples/freight: 18 of its 19 rules now quote, assource, the sentence ofpolicy.mdthey come from, so the customer report shows where each rule comes from. Grading is unchanged and stored runs still regrade. A trial that broke one of them now quotes that sentence in its attribution's evidence (#31).runandleaderboard: a repeated--tasksadds its task ids, as--tagand--floordo, so--tasks a --tasks bruns both. Before, only the last--taskscounted (#403).- Roadmap:
ROADMAP.mdand sandtable.dev/roadmap list what 1.1.0 ships, under In 1.1, instead of under Next. PR comments with pass^k deltas and Retell and ElevenLabs imports move to Later, matching their milestones, and--tagis no longer a good first issue (#416).
Deprecated
runandleaderboard: an empty--tasks(--tasks "", as an unset CI variable gives) still runs every task, and an empty value next to task ids still adds nothing, but both now warn on stderr. sandtable-ai 2.0 will make it a usage error (exit 2), as an empty--tagis. To run every task, leave--tasksout (#403).
Fixed
- Plugin: a
PreToolUsehook stopsnpm installofsandtable-aiin a folder with nopackage.json, and tells Claude to runnpm init -ythere first. Without that step npm installs into the nearest project above the folder, even the engineer's home folder. The skills already asked for it (1.0.1); the hook holds on any model, even when no skill loaded (#412).
What's Changed
Other changes
- feat(cli): run --tag runs only the tasks with those tags by @Uliseis in #398
- feat(report): a coverage matrix shows which rules a run checked and caught broken by @Uliseis in #399
- feat(report): report --audience customer writes a page a customer signs off on before go-live by @Uliseis in #400
- feat(run): run --without-policy rehearses a careless agent for the customer page's --probe by @Uliseis in #407
- fix(cli): a repeated --tasks adds its tasks, and an empty --tasks warns that 2.0 will refuse it by @Uliseis in #414
- fix(plugin): a hook keeps npm install of sandtable-ai in the working folder's own project by @Uliseis in #413
- docs(docs): the roadmap lists what 1.1.0 ships by @Uliseis in #417
- chore(release): v1.1.0 by @Uliseis in #418
Full Changelog: v1.0.1...v1.1.0