Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
258 commits
Select commit Hold shift + click to select a range
c431c82
feat(benchmark): cache the suite files check.add names, and hash them
SaulMoro Oct 26, 2026
15c4cb9
feat(benchmark): write a task's suite files before its check
SaulMoro Oct 26, 2026
91fc73f
docs(benchmark): document check files from the suite directory
SaulMoro Oct 26, 2026
84b37b8
feat(benchmark): parse a suite's trial limits and freeze them into th…
SaulMoro Oct 26, 2026
3c4b551
feat(benchmark): accept the limit that ended a trial's prompt in its …
SaulMoro Oct 26, 2026
057c4b8
feat(benchmark): hold a trial's prompt to its suite budget in the report
SaulMoro Oct 26, 2026
1af6355
feat(benchmark): stop a trial's tool at its suite trial timeout
SaulMoro Oct 26, 2026
d58ade2
feat(benchmark): cap a claude trial's turns at its suite max_turns
SaulMoro Oct 26, 2026
51e72cd
feat(benchmark): stop a trial's tool once its stdout passes the suite…
SaulMoro Oct 26, 2026
6ccf829
feat(benchmark): count trials a limit stopped, and unenforced limits …
SaulMoro Oct 26, 2026
93e59bf
test(benchmark): hold an external driver to the trial limits in its l…
SaulMoro Oct 26, 2026
5d48e96
docs(benchmark): document trial limits
SaulMoro Oct 26, 2026
e9cb89f
fix(benchmark): let the tool adapter say which limit stopped a trial
SaulMoro Oct 26, 2026
d382773
fix(benchmark): keep the model and session of a Claude stopped before…
SaulMoro Oct 26, 2026
cd20ffd
refactor(benchmark): compile a plan only from a suite whose check fil…
SaulMoro Oct 26, 2026
9e7076c
fix(benchmark): refuse check.add paths where one is a directory of an…
SaulMoro Oct 26, 2026
1dc4032
fix(benchmark): leave dot entries out of a check.add directory
SaulMoro Oct 26, 2026
b1dfade
fix(benchmark): remove every lock git leaves in a stopped trial's clone
SaulMoro Oct 26, 2026
2bf0b59
perf(benchmark): meter a trial's tokens in linear time
SaulMoro Oct 26, 2026
9a912cf
fix(benchmark): list an unenforced budget once on a trial a timeout s…
SaulMoro Oct 26, 2026
7f35411
fix(benchmark): settle a limit-stopped trial whose work could not be …
SaulMoro Oct 26, 2026
042e6bc
test(benchmark): write a fix path and a suite file in one check.add
SaulMoro Oct 26, 2026
13e3f12
fix(benchmark): record the run mode a benchmark run started in
SaulMoro Oct 27, 2026
60bc193
fix(benchmark): hold CodeBuddy trials to no limit they are untried on…
SaulMoro Oct 27, 2026
975ef4f
fix(benchmark): stop a trial clone's git at the run deadline
SaulMoro Oct 27, 2026
9f29e9a
fix(benchmark): stop the git that readies a trial's check at the run …
SaulMoro Oct 27, 2026
3d79490
perf(workflow): read a worktree snapshot's status, HEAD and branch to…
SaulMoro Oct 27, 2026
8125b66
fix(workflow): stop git and the processes it started at its timeout
SaulMoro Oct 27, 2026
96fad8d
fix(benchmark): stop collecting a trial's judge evidence at the run d…
SaulMoro Oct 27, 2026
cc73391
fix(workflow): stop the git that reads what setup left at the step de…
SaulMoro Oct 27, 2026
d080d61
test(workflow): make git read the tracked file through setup's hangin…
SaulMoro Oct 28, 2026
8634ae1
fix(benchmark): stop the git that makes a trial's clone and team copy…
SaulMoro Oct 28, 2026
9869b89
fix(benchmark): read a ^ that opens no class in check.protect as lite…
SaulMoro Oct 28, 2026
901b236
refactor(benchmark): meet the oxlint suspicious and perf rules
SaulMoro Oct 28, 2026
9e5048b
fix(benchmark): refuse --describe with --benchmark instead of describ…
SaulMoro Oct 28, 2026
6914a6f
fix(benchmark): keep a benchmark run's trial sessions out of score --…
SaulMoro Oct 28, 2026
d2435e2
docs(benchmark): name the benchmark tables a run's dashboard details …
SaulMoro Oct 28, 2026
7364527
feat(benchmark): summarize benchmark runs over time, per suite, arm a…
SaulMoro Oct 28, 2026
3656204
feat(dashboard): serve benchmark history from this machine's runs and…
SaulMoro Oct 28, 2026
e3bfde1
feat(dashboard): add a Benchmarks page
SaulMoro Oct 28, 2026
d293630
test(dashboard): list an ended benchmark run once on the Benchmarks p…
SaulMoro Oct 28, 2026
c96e041
docs(dashboard): the Benchmarks page, by the question each panel answers
SaulMoro Oct 28, 2026
7fc59c8
fix(dashboard): read a benchmark record again when it could not be re…
SaulMoro Oct 28, 2026
866b714
docs(skill): name benchmark runs among what the dashboard shows
SaulMoro Oct 28, 2026
3c69647
fix(benchmark): pool an arm's usage and deviations as each run's tabl…
SaulMoro Oct 28, 2026
4c89fde
fix(benchmark): count a suite's version over its task files too
SaulMoro Oct 28, 2026
a8f6f9f
fix(workflow): stop the git that lists configured hooks at the step d…
SaulMoro Oct 28, 2026
1060685
feat(benchmark): run an arm on other team assets, and cross arms with…
SaulMoro Oct 29, 2026
a440dbf
feat(benchmark): compare arms that differ in one dimension, and follo…
SaulMoro Oct 29, 2026
6abf61d
feat(dashboard): name each benchmarked team revision from the team cl…
SaulMoro Oct 29, 2026
40a13ff
feat(dashboard): add Compare and Team changes tabs to the Benchmarks …
SaulMoro Oct 29, 2026
cdf0a35
docs(benchmark): document team arms, matrix, and the Compare and Team…
SaulMoro Oct 29, 2026
395de7d
fix(benchmark): compare tools on a shared model alias, and say why a …
SaulMoro Oct 29, 2026
c6d9f10
fix(dashboard): list a revision's changed files against the one its t…
SaulMoro Oct 29, 2026
1d182b4
docs(benchmark): a matrix makes 2 to 12 arms, and the Team column fol…
SaulMoro Oct 29, 2026
cc41f3c
fix(benchmark): accept a namespaced skill in an arm's team without
SaulMoro Oct 29, 2026
df88dd2
fix(benchmark): count every number of a comparison over its paired tr…
SaulMoro Oct 29, 2026
c46c6f7
fix(benchmark): give stepEnvironment the team env facts, as #1531 asks
SaulMoro Oct 29, 2026
259c6be
test(init): stub the local agent setup in the http re-init case, as #…
SaulMoro Oct 29, 2026
7c2dbce
refactor(benchmark): move benchmark suites to src/benchmark
SaulMoro Oct 29, 2026
f96a99f
feat(workflow): run prompts in different places side by side in the l…
SaulMoro Oct 29, 2026
23209ee
feat(workflow): report how long a local prompt's tool ran and what it…
SaulMoro Oct 29, 2026
3da2836
refactor(workflow): drive benchmark runs with the generic local loop,…
SaulMoro Oct 29, 2026
bd8b264
feat(workflow): pass a prompt step's exact model as written
SaulMoro Oct 29, 2026
91c0078
feat(workflow): run a prompt step on the tool it names, for a driver …
SaulMoro Oct 29, 2026
40346c6
refactor(benchmark): run trial prompts on the step's tool and exact m…
SaulMoro Oct 29, 2026
1ab6c55
feat(workflow): open a clone place that teamai prepares at lease
SaulMoro Oct 29, 2026
580dda3
feat(workflow): stage judge evidence of a step in a clone when it set…
SaulMoro Oct 29, 2026
0048cfa
refactor(benchmark): run trials and baselines in clone places, delete…
SaulMoro Oct 29, 2026
eb44a77
feat(workflow): isolate a run whose definition opens a clone
SaulMoro Oct 29, 2026
adcacd1
test(workflow): run a workflow that opens a clone through the real CLI
SaulMoro Oct 29, 2026
0631efb
test(workflow): pin how a clone place is set up, prepared again, and …
SaulMoro Oct 29, 2026
82b817e
test(workflow): pin how a clone place holds, refuses, and releases a …
SaulMoro Oct 29, 2026
1845cdc
test(workflow): pin that a clone keeps its work across a release and …
SaulMoro Oct 29, 2026
7aaaf21
docs(workflow): record the clone place and isolated runs in the engin…
SaulMoro Oct 29, 2026
a0d654a
fix(workflow): stage a clone workflow step's evidence when it settles…
SaulMoro Oct 29, 2026
c476c2c
feat(workflow): run finally steps when a run ends, and return its out…
SaulMoro Oct 29, 2026
8655051
feat(workflow): refuse finally where it would not run
SaulMoro Oct 29, 2026
19e0650
fix(workflow): cancel the finally steps a cancel or their deadline en…
SaulMoro Oct 29, 2026
e9bcfc1
feat(workflow): bound a run with workflow start --timeout
SaulMoro Oct 29, 2026
d544844
docs(workflow): record the finally phase in the engine notes
SaulMoro Oct 29, 2026
e9690be
feat(workflow): forward a shell command's stderr while keeping its tail
SaulMoro Oct 29, 2026
06fd21b
refactor(benchmark): run baselines and trial checks as teamai benchma…
SaulMoro Oct 29, 2026
fbb81ed
test(workflow): pin the end a run keeps through finally, and finally …
SaulMoro Oct 29, 2026
eff122c
test(workflow): pin finally after a retry whose first finally failed,…
SaulMoro Oct 29, 2026
43ebe70
feat(workflow): hold strict isolation and network as a floor, and ref…
SaulMoro Oct 29, 2026
385b648
Merge slice 7b: finally steps, done.outputs, and workflow start --tim…
SaulMoro Oct 29, 2026
e8d7dcb
refactor(benchmark): run baselines and trials under a strict sandbox,…
SaulMoro Oct 29, 2026
1a5e58c
refactor(workflow): merge requirement levels without a branch per abs…
SaulMoro Oct 29, 2026
213f6cc
Merge branch 'feat/1180-benchmark-suites' into slice-4
SaulMoro Oct 29, 2026
a4a49ba
feat(workflow): end a prompt's turn at its limits under on_limit: end…
SaulMoro Oct 29, 2026
df0f584
feat(workflow): spend a workflow step's timeout and budget as its pro…
SaulMoro Oct 29, 2026
2c5540a
test(workflow): pin that a strict floor keeps an inner level above it…
SaulMoro Oct 29, 2026
c6aaba8
test(workflow): pin how a workflow step's allowance is spent
SaulMoro Oct 29, 2026
8903389
refactor(workflow): drop the clamp on a turn's lease limits
SaulMoro Oct 29, 2026
123662d
Merge branch 'feat/1180-benchmark-suites' into slice-6
SaulMoro Oct 29, 2026
2297d2f
style(workflow): keep the run options schema beside its doc, and narr…
SaulMoro Oct 29, 2026
9f14fad
Merge slice 5: run baselines and trial checks as teamai benchmark che…
SaulMoro Oct 29, 2026
fc398cc
fix(benchmark): run setup before check.add files in benchmark --try
SaulMoro Oct 29, 2026
feda5a5
Merge slice 4: hold strict isolation and network as a floor, and run …
SaulMoro Oct 29, 2026
ef6b287
fix: reconcile slice 4 with slice 5
SaulMoro Oct 29, 2026
28101d1
fix(workflow): decide a handed-back lease's turn limits for the drive…
SaulMoro Oct 29, 2026
fabcdee
Merge branch 'feat/1180-benchmark-suites' into slice-6
SaulMoro Oct 29, 2026
ed4200c
Merge slice 5 fix: run setup before check.add files in benchmark --try
SaulMoro Oct 29, 2026
3a787e2
fix(workflow): refuse a strict sandbox in defaults whose requires.env…
SaulMoro Oct 29, 2026
74a7823
fix(workflow): refuse a strict sandbox around a workflow file whose r…
SaulMoro Oct 29, 2026
f89fd97
refactor(workflow): give the withheld env walk a root caller and a pu…
SaulMoro Oct 29, 2026
e9d842c
Merge slice 4 fix: check a strict floor's withheld env in defaults an…
SaulMoro Oct 29, 2026
5946d35
Merge branch 'feat/1180-benchmark-suites' into slice-6
SaulMoro Oct 29, 2026
4a09b81
fix(workflow): give a handed-back end_turn lease only what is left of…
SaulMoro Oct 30, 2026
d3b618c
Merge slice 6: end a prompt's turn at its limits with on_limit: end_turn
SaulMoro Oct 30, 2026
d6497fb
feat(workflow): judge every pass with scorers sampling: all
SaulMoro Oct 30, 2026
e733ff2
feat(workflow): freeze a run's verdicts before its finally steps run
SaulMoro Oct 30, 2026
ab26583
test(workflow): judge an ordinary workflow's sampling: all step befor…
SaulMoro Oct 30, 2026
85db0e6
docs(workflow): record sampling: all and the judge barrier before fin…
SaulMoro Oct 30, 2026
aa4dab1
test(workflow): pin the scorers forms a parse refuses, and the end re…
SaulMoro Oct 30, 2026
87784d3
style(workflow): wrap the comments this change touched at the files' …
SaulMoro Oct 30, 2026
e7520f3
fix(workflow): say a late judge answer was refused because the steps …
SaulMoro Oct 30, 2026
4ab056c
refactor(workflow): read a step's workflow through one resolver
SaulMoro Oct 30, 2026
3333715
feat(workflow): add the workflow and json output types
SaulMoro Oct 30, 2026
4e1567f
feat(workflow): let a step list a generated scorer, whose name holds …
SaulMoro Oct 30, 2026
a3baf93
refactor(workflow): admit a started workflow through one admission
SaulMoro Oct 30, 2026
836a4bf
feat(workflow): parse workflow: { from: <step> }
SaulMoro Oct 30, 2026
e9d14a1
feat(workflow): admit a producer's workflow output and run it in its …
SaulMoro Oct 30, 2026
3aa4cf0
feat(workflow): run a step's teamai as the CLI that runs the step
SaulMoro Oct 30, 2026
4e5b226
docs(workflow): record admission and the from step in the engine notes
SaulMoro Oct 30, 2026
47817c5
test(workflow): cover the refusals of an admitted workflow output
SaulMoro Oct 30, 2026
1646e14
refactor(workflow): name the unkept workflow of a step in one message
SaulMoro Oct 30, 2026
3b43bf1
fix(workflow): name every way a printed bundle misses its shape
SaulMoro Oct 30, 2026
61090b9
test(workflow): pin json and workflow names inside a literal union
SaulMoro Oct 30, 2026
742b877
test(workflow): fail a producer whose workflow field is no object
SaulMoro Oct 30, 2026
72d8818
feat(benchmark): run a suite as the shipped benchmark workflow
SaulMoro Oct 30, 2026
31e2173
test(benchmark): pin the benchmark workflow's refusals, override and …
SaulMoro Oct 30, 2026
6c594cd
test(workflow): publish a queued benchmark record once at its run's key
SaulMoro Oct 30, 2026
125668c
fix(benchmark): classify the benchmark verbs for --dry-run
SaulMoro Oct 30, 2026
7dd0eeb
fix(benchmark): admit the plan of a suite with several tasks
SaulMoro Oct 30, 2026
dc90a47
fix(workflow): refuse a start whose from step needs a sandbox
SaulMoro Oct 30, 2026
c9a9a6f
fix(workflow): record what a prompt in a prepared clone ran on
SaulMoro Oct 30, 2026
2762688
fix(benchmark): refuse to plan where the team cannot be pinned
SaulMoro Oct 30, 2026
043468e
fix(benchmark): say which arms the driver could not launch
SaulMoro Oct 30, 2026
0dd4439
test(benchmark): run the benchmark e2e through the benchmark verbs
SaulMoro Oct 30, 2026
a078bea
test(benchmark): share the e2e helpers that start and drive a benchmark
SaulMoro Oct 30, 2026
981b3de
test(benchmark): admit the plan's workflow and read its plan in process
SaulMoro Oct 30, 2026
c84a275
test(benchmark): pin how a run's benchmark plan is found and refused
SaulMoro Oct 30, 2026
1ab0ed3
test(benchmark): pin the plan's trial limits and an unreadable plan
SaulMoro Oct 30, 2026
22aebb2
test(workflow): let tests reach run-plan.ts, the unit they check
SaulMoro Oct 30, 2026
c8c43b8
docs(workflow): read a benchmark's pass rates from its own record on …
SaulMoro Oct 30, 2026
bd4ea88
fix(workflow): admit a bundle whose producer reuses one object in two…
SaulMoro Oct 30, 2026
7d49d89
feat(benchmark): resolve arm models with the member's aliases on benc…
SaulMoro Oct 30, 2026
e2d571c
test(benchmark): run the guide's CI job through benchmark run
SaulMoro Oct 30, 2026
c78eda0
feat(dashboard): read benchmark runs from their benchmark records
SaulMoro Oct 30, 2026
6257872
test(benchmark): run in-process and conformance benchmarks on the ben…
SaulMoro Oct 30, 2026
044d664
refactor(benchmark): remove the engine-run benchmark start
SaulMoro Oct 30, 2026
b872b1b
fix(workflow): judge a resume --next candidate by the tool its prompt…
SaulMoro Oct 30, 2026
c288dbc
chore(workflow): drop the imports the suite cache left behind
SaulMoro Oct 30, 2026
91272df
fix(workflow): describe the finally steps of a workflow
SaulMoro Oct 30, 2026
d3c8f0d
docs(benchmark): say benchmark run passes the aliases input
SaulMoro Oct 30, 2026
12482b5
feat(workflow): bound a skill driver run with workflow start --timeout
SaulMoro Oct 30, 2026
5ad0e01
test(workflow): pin which command the refusal to retry an isolated ru…
SaulMoro Oct 30, 2026
de29641
refactor(workflow): group resume --next prompt steps by agent and too…
SaulMoro Oct 30, 2026
c3f9096
fix(workflow): say which driver can continue a step whose own tool te…
SaulMoro Oct 30, 2026
6a79aa6
feat(benchmark): let an arm run a team workflow on each task
SaulMoro Oct 30, 2026
455b70c
feat(benchmark): run a suite's baselines and trials in parallel lanes
SaulMoro Oct 30, 2026
8ba851d
fix(benchmark): resolve an arm's workflow through the namespaces its …
SaulMoro Oct 30, 2026
fe6885c
test(benchmark): pin a benchmark override that a role's namespace del…
SaulMoro Oct 30, 2026
93d47c3
feat(benchmark): list the skills an arm's team changes, with how ofte…
SaulMoro Oct 30, 2026
6483e35
test(benchmark): say that the fake claude leaves a session on every l…
SaulMoro Oct 30, 2026
e7a455f
feat(benchmark): fail a benchmark run whose pass rate dropped against…
SaulMoro Oct 30, 2026
012caf2
fix(benchmark): write an arm workflow refusal's code where plan refus…
SaulMoro Oct 30, 2026
ffb65a9
test(benchmark): pin how a regression check pairs trials and counts u…
SaulMoro Oct 30, 2026
12594e8
fix(dashboard): leave out of Compare a benchmark record still waiting…
SaulMoro Oct 30, 2026
7ef9e6d
test(benchmark): read a skill as unknown on workflow arms only partly…
SaulMoro Oct 30, 2026
c6cc8b5
feat(workflow): install a clone's team without some paths from a comm…
SaulMoro Oct 30, 2026
e739e9f
feat(benchmark): run an arm without team repo paths, checked against …
SaulMoro Oct 30, 2026
4a41df8
test(benchmark): pin how an arm without paths reads each namespace rule
SaulMoro Oct 30, 2026
9be84b9
fix(benchmark): refuse an arm without a rule its member's tags alread…
SaulMoro Oct 30, 2026
c9e25c2
test(benchmark): pin rule and claudemd shadowing and entries inside a…
SaulMoro Oct 30, 2026
b96efeb
test(benchmark): pin that single-repo mode refuses an arm without pat…
SaulMoro Oct 30, 2026
8142e52
feat(benchmark): refuse an arm without a path inside another path it …
SaulMoro Oct 30, 2026
834e08c
refactor(benchmark): decide an arm without paths by what pull's resol…
SaulMoro Oct 30, 2026
beb309a
refactor(benchmark): give each team directory its own reason an arm w…
SaulMoro Oct 30, 2026
b3aed89
fix(benchmark): say benchmarks do not run in single-repo mode, and wh…
SaulMoro Oct 30, 2026
176016e
fix(pull): take a skill copy pull removes as no longer delivered off …
SaulMoro Oct 30, 2026
86b9694
test(benchmark): exclude a skill pull already delivered before an arm…
SaulMoro Oct 30, 2026
5550a06
fix(pull): take a namespace skill copy off the delivery record when i…
SaulMoro Oct 30, 2026
5447926
fix(pull): take a namespace agent copy off the delivery record when i…
SaulMoro Oct 30, 2026
90d7e6d
fix(pull): take a replaced root rule's copy off the delivery record w…
SaulMoro Oct 30, 2026
a904244
docs(cli): describe clone leases, can.tools and can.end_turn in workf…
SaulMoro Oct 30, 2026
24e3d48
fix(benchmark): say why a benchmark cannot pin the team here, in benc…
SaulMoro Oct 30, 2026
29424cb
fix(benchmark): pair arms that differ only in the workflow they run
SaulMoro Oct 30, 2026
3a10de2
fix(workflow): refuse a start of a name two active namespaces define …
SaulMoro Oct 30, 2026
571fc4d
docs(benchmark): describe benchmarks as the benchmark workflow and it…
SaulMoro Oct 30, 2026
0c6d5d4
docs(workflow): document finally, from, clone workspaces, strict and …
SaulMoro Oct 30, 2026
21035a0
docs(scorers): describe sampling: all in place of the benchmark excep…
SaulMoro Oct 30, 2026
c701219
docs(workflow): record that src/workflow never imports src/benchmark …
SaulMoro Oct 30, 2026
1ae2e25
docs(skill-data): say a strict sandbox step waits instead of running …
SaulMoro Oct 30, 2026
5116d68
fix(workflow): write the namespace conflict refusal's code as a literal
SaulMoro Oct 30, 2026
fae9b6f
test(workflow): pin the namespace conflict at the workflow cache
SaulMoro Oct 30, 2026
dfea050
docs(benchmark): say a trial's tool needs leave to edit on the sandbox
SaulMoro Oct 30, 2026
f94fe46
feat(workflow): read permissions: unattended on prompt steps
SaulMoro Oct 30, 2026
9e922ff
feat(workflow): admit an unattended prompt only under a strict sandbox
SaulMoro Oct 30, 2026
c4e2285
feat(workflow): lease an unattended prompt only to a driver with can.…
SaulMoro Oct 30, 2026
281b76d
feat(workflow): launch an unattended prompt in its tool's own unatten…
SaulMoro Oct 30, 2026
4ea7ae3
feat(benchmark): run trial prompts unattended under the strict sandbox
SaulMoro Oct 30, 2026
fa94d07
docs(tools): mark Claude's unattended mode verified by a real benchma…
SaulMoro Oct 30, 2026
bb17124
docs(workflow): document permissions: unattended and the unattended t…
SaulMoro Oct 30, 2026
2106c4b
docs(workflow): make the unattended prompt example runnable
SaulMoro Oct 30, 2026
b1448a8
test(benchmark): declare unattended support in external driver fixtures
SaulMoro Oct 30, 2026
aac5ee2
Merge origin/main into feat/1180-benchmark-suites
SaulMoro Oct 30, 2026
1455e1d
test(benchmark): cover ref-arm freezing, error pairs, lanes and workf…
SaulMoro Oct 30, 2026
08f8c3f
test(benchmark): cover the rest of the suite and arm criteria end to end
SaulMoro Oct 30, 2026
af86209
test(benchmark): retry Windows teardown removals, and time out the 1,…
SaulMoro Oct 30, 2026
ee8ce92
fix(benchmark): keep an arm whose workflow changed apart in its history
SaulMoro Oct 30, 2026
c498623
fix(workflow): stop collecting a clone step's judge evidence at the r…
SaulMoro Oct 30, 2026
ed833b0
fix(benchmark): refuse a named class in check.protect
SaulMoro Oct 30, 2026
a2b77a0
fix(workflow): withhold an admitted workflow's env keys from its othe…
SaulMoro Oct 30, 2026
d8ddcc0
fix(workflow): prepare a strictly sandboxed clone without the credent…
SaulMoro Oct 30, 2026
acc8ce3
fix(benchmark): run a suite that allows more lanes than it has trials
SaulMoro Oct 30, 2026
2e5651a
fix(workflow): refuse a generated workflow whose team scorer holds a …
SaulMoro Oct 30, 2026
01a4ec2
Merge origin/main
SaulMoro Oct 30, 2026
28c4234
fix(benchmark): refuse an arm workflow that requires an input besides…
SaulMoro Oct 30, 2026
e088944
fix(benchmark): refuse an arm workflow that has finally steps
SaulMoro Oct 30, 2026
73590e5
fix(benchmark): refuse a workflow arm with no model whose workflow ru…
SaulMoro Oct 30, 2026
245da60
docs: add the benchmarks column to the README matrix, and a changelog…
SaulMoro Oct 30, 2026
12603ed
docs(workflow): say what workflows.sandbox lets an unattended step do
SaulMoro Oct 30, 2026
dde0913
fix(workflow): point a failed isolated run at a new run, not at retry
SaulMoro Oct 30, 2026
db41e61
fix(benchmark): give every step in an arm's clone the arm's tool's te…
SaulMoro Oct 30, 2026
65eed33
fix(benchmark): point the model-less arm refusal at defaults.model
SaulMoro Oct 30, 2026
984695b
fix(workflow): give the restart command of an isolated run its inputs
SaulMoro Oct 30, 2026
73ae9d8
docs(changelog): say when --fail-on-regression fails a job
SaulMoro Oct 30, 2026
283cbc1
test(benchmark): publish no records from the results table tests
SaulMoro Oct 30, 2026
c254ea6
fix(benchmark): classify a workflow arm's trial by the steps its work…
SaulMoro Oct 30, 2026
193cb45
fix(benchmark): keep each workflow apart in Team changes
SaulMoro Oct 30, 2026
4b96e1f
fix(benchmark): count a loop's earlier attempts when a cancelled tria…
SaulMoro Oct 30, 2026
17cd1f1
fix(workflow): bound the pre-launch head read of a clone by the lease…
SaulMoro Oct 30, 2026
ce7d81b
Merge remote-tracking branch 'origin/main' into feat/1180-benchmark-s…
SaulMoro Oct 30, 2026
b020c44
fix(workflow): keep a run output its step gave as null
SaulMoro Oct 30, 2026
78ec297
fix(benchmark): refuse an arm whose workflow runs a workflow: { from …
SaulMoro Oct 30, 2026
a235078
fix(benchmark): read a workflow arm whose tool cannot launch as not r…
SaulMoro Oct 30, 2026
b17c09b
Merge remote-tracking branch 'origin/main' into feat/1180-benchmark-s…
SaulMoro Oct 30, 2026
09dd8ff
test(benchmark): name the report the outside driver had refused, with…
SaulMoro Oct 30, 2026
6c0e575
docs(workflow): list the keys of a clone's team selection
SaulMoro Oct 30, 2026
2bd1e50
Merge remote-tracking branch 'origin/main' into feat/1180-benchmark-s…
SaulMoro Oct 30, 2026
b067ae9
test(benchmark): keep the trial limit cases of the outside driver off…
SaulMoro Oct 30, 2026
677af10
test(benchmark): keep in-process benchmark runs off the network
SaulMoro Oct 30, 2026
c5eeaa2
Merge remote-tracking branch 'origin/main' into feat/1180-benchmark-s…
SaulMoro Oct 31, 2026
ad09cae
fix(workflow): mask the env value a step is given when it changes mid…
SaulMoro Oct 31, 2026
0573652
fix(workflow): lease one prompt at a time under a workflow step's all…
SaulMoro Oct 31, 2026
811eb7c
perf(workflow): look up only the tools a run's steps name
SaulMoro Oct 31, 2026
c4cfcbd
Merge remote-tracking branch 'origin/main' into feat/1180-benchmark-s…
SaulMoro Oct 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. See [standa
- teamai ships default workflows a team gets without writing them: `teamai-share-learnings` shares what a session taught as team learnings, one or several after one approval, each recorded as an outcome of the session, then runs `teamai-share-session`, which publishes the session's transcript and scores it. pull writes no `teamai-share-learnings` skill while recall is off or the source is read-only, since its learning step runs `share`, and `teamai recall enable`/`disable` add or remove that skill at once. A team file of the same name replaces a default; for one name the project's team file wins, then the user scope's, then teamai's default. A team `teamai-share-session` keeps the five inputs `teamai-share-learnings` passes it, with their types: with other inputs, or one of another type, pull warns and writes no `teamai-share-learnings` skill, `teamai-share-learnings` refuses to start with `invalid_inputs` before any learning is shared, and the friction reminder goes back to `teamai skill get share`. `teamai list skills -v` labels the skills pull generates for workflows `[workflow]`. `teamai list workflows` shows each workflow's source (`team` or `default`), `workflow start --describe` reports it as `source`, a run records it as `origin` with the teamai version of a default, and the dashboard's Workflow Runs page shows it in a Definition column, with the learnings a run shared beside its pull requests in an Outcomes column. A run of a default continued on a machine whose teamai ships another version of it refuses with `definition_mismatch` (for [#1388](https://github.com/Tencent/teamai-cli/issues/1388)).
- `workflow start --describe teamai-share-learnings --driver skill`, and the same for `teamai-share-session`, proposes a `value` and a `why` for each input, for the calling session: the session and its tool, publishing when the attended publish policy is `ask`, the scorers that sample the session when attended scoring is `ask`, and whether teamai's own judge or the session's agent judges. A team override gets values for the inputs that keep their name and type (for [#1388](https://github.com/Tencent/teamai-cli/issues/1388)).
- The dashboard's Overview has a **Member settings** panel: for the selected workspace, each member setting some level sets, its value, the level and file that set it, and what the levels below say, as `teamai doctor` lists them, plus the keys of a settings-only `~/.teamai/config.yaml` that nothing reads. The Session sharing panel names the setting behind the daily judging limit (for [#1459](https://github.com/Tencent/teamai-cli/issues/1459)).
- `teamai benchmark run <suite>` runs a benchmark suite from `benchmarks/<suite>/`: each task, a starting commit with a check or success criteria, goes to every arm (a tool, model, team revision or team workflow) a few times, each trial in its own clean clone on a machine declared a sandbox. The run prints a pass-rate table and publishes its record for the dashboard's Benchmarks page. `try` checks one task before it joins a suite, `plan` and `report` print the plan and the table, and `--fail-on-regression` fails a CI job when an arm's pass rate dropped by more than chance against the last comparable published run. It runs as `teamai-benchmark`, a default workflow the team can replace (for [#1180](https://github.com/Tencent/teamai-cli/issues/1180)).

### Changed

Expand Down
48 changes: 24 additions & 24 deletions README.ja.md

Large diffs are not rendered by default.

48 changes: 24 additions & 24 deletions README.ko.md

Large diffs are not rendered by default.

48 changes: 24 additions & 24 deletions README.md

Large diffs are not rendered by default.

48 changes: 24 additions & 24 deletions README.th.md

Large diffs are not rendered by default.

48 changes: 24 additions & 24 deletions README.zh-CN.md

Large diffs are not rendered by default.

16 changes: 9 additions & 7 deletions docs/dev/workflow-engine.md

Large diffs are not rendered by default.

551 changes: 551 additions & 0 deletions docs/guide/benchmarks.md

Large diffs are not rendered by default.

43 changes: 41 additions & 2 deletions docs/guide/dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ teamai dashboard
teamai dashboard --port 8080
```

Open `http://localhost:3721`. The sidebar is Overview, Team Execution, Workflow Runs, Scorers, Team Context, Resources, Distribution, and Team Improvement. The numbers are from this machine.
Open `http://localhost:3721`. The sidebar is Overview, Team Execution, Workflow Runs, Scorers, Benchmarks, Team Context, Resources, Distribution, and Team Improvement. The numbers are from this machine.

## Session sharing

Expand Down Expand Up @@ -50,7 +50,7 @@ The Workflow Runs page has three lists for the selected workspace. **Local runs*

On the install that offered a run, the next step is `teamai workflow resume <run>` instead, which takes it back there. A local run that is offered, or that another install now holds, says so under its status. **A runner needs** (**Their machine needs** on a run that needs a person) lists the `requires.env` keys and prompt steps of the steps left: set those up on the runner, as [its job](workflow.md#take-offered-runs-from-ci) does. **Not on this machine** is what this machine lacks of them, as `teamai workflow resume` lists it as `cannot run here`. The status line counts the offered runs and the ones that need a person. The page claims nothing: the command runs a driver on the machine that takes the run.

The page shows what a run record publishes, plus each step's live status and the options of a waiting HITL request. Inputs, `for_each` items, outputs, prompts, HITL messages, and local paths stay in the run file. Read a HITL question where the run's driver asks it. A run's details show what each pass delivered: the commits on its branch, the pull request delivered for it, and the learnings `teamai contribute` recorded inside its attempt.
The page shows what a run record publishes, plus each step's live status and the options of a waiting HITL request. Inputs, `for_each` items, outputs, prompts, HITL messages, and local paths stay in the run file. Read a HITL question where the run's driver asks it. A run's details show what each pass delivered: the commits on its branch, the pull request delivered for it, and the learnings `teamai contribute` recorded inside its attempt. The details of a [benchmark](benchmarks.md) run that ended show its results, usage and task × arm tables, as the CLI prints them.

A waiting approve or choose request can be answered from the run's details. The answer goes through the same `respond` operation as the CLI, with channel `dashboard` and `agent: false`, so it can answer a required approval. A dashboard started inside an agent session records `agent: true`, as an answer from that shell would, and cannot answer a required approval. It carries the pass the page showed: if that request was answered or replaced in the meantime, the page shows the refusal and reloads. Another website cannot send an answer. A request without an `Origin` header, such as a plain `curl`, is refused too. This marks an answer as sent from a browser; it does not stop a local script that sets the header.

Expand Down Expand Up @@ -97,6 +97,45 @@ Labels from benchmark runs are left out. The page reads labels and recorded conf

Labels from sessions and workflow runs show how the tools did on the work that came along. To compare tools, models or team assets on the same tasks, run a benchmark.

## Benchmarks

The Benchmarks page shows every ended [benchmark](benchmarks.md) run of the selected workspace: the runs on this machine and the run records on `teamai-reports`, over 30, 90 or 365 days. Pick a suite in **Suites**. Each question below names the panel that answers it, with what that panel showed for a team that ran `fix-auth` every week and `migrate-db` on three Claude models:

| Question | Panel | What it showed |
|---|---|---|
| Should the team switch its auth fixes to claude? | **Leading arm** | `claude 67% · 95% 57%–75% · not separated from codex`. Codex has 56% (47%–65%). The intervals overlap, so these 7 runs do not tell the two apart. Add repetitions or tasks before you switch. |
| Did the auth skill we merged on October 7 help? | **Pass rate per run** | A dotted line, `Team assets changed · 62432de`, marks the first run with the skill. Compare each arm's points on either side. The **Runs** table marks that run's team revision `changed`. |
| Which model is worth paying for on `migrate-db`? | **Pass rate against cost**, on **Cost** | sonnet passes 73% for 0.31 USD a trial, opus 78% for 0.89 USD, and their intervals overlap. The dashed line joins the arms nothing beats on both pass rate and cost: haiku, sonnet, opus. |
| Which task needs fixing, in the code or in the suite? | **Tasks by arm** | `refresh-race` has 7/7 under **Unstable runs**: in every run, some arm both passed and failed it, so one trial says little. `session-fixation` is 0% to 19% on every arm: read its check before blaming the tools. |
| Why did the September 23 run drop to 27%? | **Tasks per run** and **Runs** | `login-copy` is a hatched cell in that run's column, and **Runs** shows `1 not measured` under its pass rate: the task's check passed without changes in that run, so its [baseline](benchmarks.md#baselines) was invalid, and its trials count as planned but not passed. **Tasks by arm** marks it `not measured in 1/7`. Open the run from **Runs** to read its trials. |

**Last run** shows the newest run's trials by result for each arm, with its usage, deviations and the tasks it did not measure. **Open the run** opens its details on the Workflow Runs page.

The panels above are the **Arms** tab. Two more tabs answer what changed between arms, and between team revisions. Here, for `onboarding-docs`, a [matrix](benchmarks.md#cross-tools-with-team-assets) of claude and codex with the pulled team assets and with none, and for `fix-auth` again:

| Question | Tab and panel | What it showed |
|---|---|---|
| How much do our team assets help on onboarding docs? | **Compare**, by **Team assets** | `pulled team against no team assets +41 pp · 95% +16 pp to +59 pp` on claude, over 27 paired trials, and `−60%` cost per passed trial. |
| Do they help codex as much? | **Difference per pair of arms** | codex gains +15 pp, but its interval crosses zero: these runs do not tell its two arms apart. |
| Which task do the assets fix? | **Each task** | `oncall-runbook` goes from 1/9 to 7/9 with the assets; `first-pr-guide` barely moves. |
| Did the auth-tokens skill help claude on `fix-auth`? | **Team changes**, on `claude · claude-opus-5-5` | 67%, 62%, 70% over three team revisions, in commit order, none told apart from the one before it. Click `67ee2ce · Add the auth-tokens skill and a security reviewer`: it changed three files, and `session-fixation` went from 1/12 to 3/12. |
| Did a tool update move the numbers? | **Arms**, **Pass rate per run** | A dashed `Tool updated · claude 2.4.0` line marks the first run on the new version. |

**Compare** lists each two arms of the suite's current version that differ only in their team assets, tool, model or workflow, and pairs their trials by run, task and repetition. **Team changes** follows one tool, model and workflow across the team revisions it ran on with the pulled assets or a ref, and names each revision from this machine's team clone, with the files outside `benchmarks/` it changed since the one before it.

How the numbers are counted:

- A pass rate is passed trials over planned trials, as the run's own table prints it.
- The pooled numbers, the task tables and the leader count only the runs of the suite's current version: the suite files of its newest run. **Pass rate per run** also draws the older runs, after a dashed `Suite changed` line.
- An arm is its name, tool, model, effort and team assets. When one of them changed, the older runs are a separate line, marked `earlier configuration`.
- **Pass rate by arm** also counts the arm's deviations and trials not verified over those runs, as each run's table counts them. A deviation is a trial whose prompt ran on another tool, model or team revision than its arm's.
- The interval is a 95% Wilson score interval. Two arms whose intervals overlap are not told apart by these runs.
- A difference in **Compare** is over paired trials, with a 95% interval for paired proportions (Newcombe). One whose interval crosses zero is `not separated`.
- Usage is the median over the trials whose tool reported it. Cost is per trial.
- A run on this machine that was also published shows once, from this machine.

The page shows what a run record publishes. It never shows a prompt, a diff, or a transcript.

## Resources

The Resources page lists every rule in the team repo for the selected workspace: its name, namespace, description, and whether `pull` delivers it there. Root rules reach everyone; namespaced rules follow the active knowledge namespaces, and a root rule is marked replaced when an active namespace rule of the same name stands for it. Rules left out by tag subscriptions are marked too.
Expand Down
4 changes: 3 additions & 1 deletion docs/guide/distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ sharing:
.teamai/mcp/mcp.yaml
```

`teamai push` sends every distributed resource type — skills, rules, agents, docs, env, hooks, mcp, models, claudemd, learnings, wiki, workflows, prompts, and scorers — with `--project` and `--role` namespace placement.
`teamai push` sends every distributed resource type — skills, rules, agents, docs, env, hooks, mcp, models, claudemd, learnings, wiki, workflows, prompts, scorers, and benchmarks — with `--project` and `--role` namespace placement.

### Git permissions

Expand Down Expand Up @@ -155,6 +155,8 @@ A project is the service they are working on. After this directory is set to tha

`knowledge` covers rules and shared instructions (`claudemd/`). A project can also declare learnings, env, hooks, mcp, models, docs, and wiki on its own.

Benchmark suites follow `resources.benchmarks`. `benchmarks/<suite>/` goes to everyone. Once a role or project lists `<ns>`, `benchmarks/<ns>/<suite>/` goes only to members who have `<ns>` active, and `benchmarks/<ns>/` holds suites, not a `suite.yaml` of its own.

```yaml
# manifest/roles.yaml
version: 1
Expand Down
8 changes: 4 additions & 4 deletions docs/guide/scorers.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ $ teamai score --lease s5d1e07c2a9b4a/a91c0d7e0 --json '{"driver":{"kind":"local
{"data":{"label":{"scorer":"review-quality","label":"good","score":1,"passed":true,…},"published":true}}
```

`samplingRate` picks the succeeded passes to judge, the same way on every machine. `workflow next` never hands out judge work. `--lease <ref>` judges here with the tool the lease names, in a [confined profile](#isolation), and settles the lease like any driver's answer. A failed judge leaves the lease open.
`samplingRate` picks the succeeded passes to judge, the same way on every machine. `workflow next` never hands out judge work. `--lease <ref>` judges here with the tool the lease names, in a [confined profile](#isolation), and settles the lease like any driver's answer. A failed judge leaves the lease open. A step whose `scorers` sets `sampling: all` is the exception: its scorers judge every succeeded pass, and the run waits for them before its `finally` steps and its end, while `workflow next` answers `wait` with `judging`, the judge entries still open. The local driver judges them itself and settles a failed judge at once; another driver's are judged with `teamai score --next` on the install that ran them. A [benchmark](benchmarks.md) judges its trials this way.

The label records `used.skills`, the team skills the pass or its subagents loaded, found as for [a session](#score-a-session) from what the checkout held as teamai delivered it when the pass started. A `workflow:` step's label lists every skill its child passes recorded, and has no `used` when none of them recorded one.

Expand Down Expand Up @@ -319,7 +319,7 @@ Session judging: attended auto, set by scorers/scoring.yaml sessions; unattended

| What is judged | Set by |
|---|---|
| A workflow step's passes | The step's `scorers`, sampled by each scorer's `samplingRate`. `sessions` plays no part. |
| A workflow step's passes | The step's `scorers`, sampled by each scorer's `samplingRate`, or every pass under `sampling: all`. `sessions` plays no part. |
| A captured session: yours, or one a `CI` or `TEAMAI_MODE` job ran that teamai did not launch | `sessions` for the session's run mode, for every scorer with `sessions: true`, sampled by its `samplingRate`. |
| A session teamai launched, such as a workflow step or a judge | Nothing. It writes no capture, and its step is judged as a pass. |
| A session of a tool teamai reads no sessions from, such as Pi | Nothing. `teamai doctor` notes each such tool the team enables, in each mode whose publish or scoring policy is not `off`. With the defaults, that is both modes. |
Expand Down Expand Up @@ -350,7 +350,7 @@ Every unattended driver ends with `teamai score --drain`. The local driver runs
1. In unattended mode, every session this data home captured as unattended counts as finished, the calling session included. Attended sessions keep the six-hour rule.
2. It judges every open judge entry this machine can judge: sampled step passes, and sampled sessions the policies allow, within `daily_limit`. While another judge pass runs on this machine, such as the background judge, it judges nothing and says so. Run the drain again once that pass ends.
3. It publishes every pending label, as `score --push` does, and the workflow run records a run could not publish, as `teamai pull` does.
4. With `publish: auto` for the current mode, it archives on `teamai-reports`, scrubbed, the finished captured sessions of that mode and the step sessions of the runs driven here that are not archived yet. A step session it cannot archive from here, because teamai reads no sessions from its tool or this machine cannot read it, is listed once as skipped with the reason, and never tried again. The other step sessions of that run are still archived.
4. With `publish: auto` for the current mode, it archives on `teamai-reports`, scrubbed, the finished captured sessions of that mode and the step sessions of the runs driven here that are not archived yet. A step session it cannot archive from here, because teamai reads no sessions from its tool or this machine cannot read it, is listed once as skipped with the reason, and never tried again. The other step sessions of that run are still archived. The trial sessions of a [benchmark](benchmarks.md) run stay on the machine that ran it.
5. It reports usage to `stats/<member>.yaml`, as `teamai pull` does, so the counts of an ephemeral runner reach the team.
6. It prints what is left: entries whose scorer pins a model no judge tool here runs (`judge_model_unavailable`), or whose isolation this machine does not meet, and every open entry when no judge tool is installed here. Those wait for another driver's `score --next`.

Expand Down Expand Up @@ -430,4 +430,4 @@ A `best-effort` tool cannot judge for a scorer that requires `verified`, nor can
| `<dataHome>/sessions/captures/` | What each session started as, written by the session-start hook. Removed a day after the session's file is gone. |
| `scores/<member>/<YYYY-MM>.jsonl` on `teamai-reports` | Published labels, the newest per scorer, rubric, subject and judge kind. Labels wait in `<dataHome>/scores/pending/` until a push lands, and stay there while usage reporting is off. |

Labels never enter the run or its record. Workflow Runs shows each pass's labels, and what judging cost apart from the run's own tokens. For a run on this machine that counts every judge attempt; for a run a member published, only the labelled ones. The dashboard's [Scorers page](dashboard.md#scorers) shows each scorer's pass rate over time and by configuration.
Labels never enter a workflow run or its record. A benchmark run freezes each trial's verdict when it ends, and its record carries the trial's result, not the label. Workflow Runs shows each pass's labels, and what judging cost apart from the run's own tokens. For a run on this machine that counts every judge attempt; for a run a member published, only the labelled ones. The dashboard's [Scorers page](dashboard.md#scorers) shows each scorer's pass rate over time and by configuration.
Loading
Loading