Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
7797875
feat: Strategy.PLAN_EXECUTE — PAC/PAE compile-and-execute for LLM plans
v1r3n May 14, 2026
b9fe590
fix(java-sdk-example): Example48Planner — use enablePlanning(true) no…
v1r3n May 14, 2026
a8a3909
fix(server): bump SQLite credential pool from 1 to 8
v1r3n May 14, 2026
9c32fca
fix(server): backfill task names on SUB_WORKFLOW WorkflowDefs (SWARM/…
v1r3n May 14, 2026
d90f12c
feat(ts-sdk): named planner=/fallback= slots for Strategy.PLAN_EXECUTE
v1r3n May 14, 2026
384c3b7
fix(server): guard collectSimpleTaskNamesFromTasks against PAC/PAE ru…
v1r3n May 14, 2026
646758c
fix(server): bump conductor 3.30.0.rc3 -> rc12 (resolves PAC/PAE sche…
v1r3n May 14, 2026
503d296
fix(server): bump conductor rc12 -> rc13 (latest published)
v1r3n May 14, 2026
f617242
fix(server): bump conductor rc13 -> rc14
v1r3n May 14, 2026
a65ab26
fix(ts-e2e): put tool catalog on the PLAN_EXECUTE harness, not just f…
v1r3n May 14, 2026
db259f2
fix(compiler): three TS-e2e regressions — LLM task name, ctx_inject s…
v1r3n May 14, 2026
d1fe1a0
fix(py-e2e): suite12 max_message — mirror TS fix, force tool use in p…
v1r3n May 15, 2026
a1c8ff4
fix(ts-e2e): suite20 plan_execute — accept loose tool-arg shapes from…
v1r3n May 15, 2026
ed19ea1
fix(ts-e2e): suite18 — stagger concurrent launches, log start failures
v1r3n May 15, 2026
9716f16
fix(sdk-ts): include server response body in AgentAPIError message
v1r3n May 15, 2026
380f769
diag(ts-e2e): suite20 max_tokens — dump WORK_DIR + executionId on mis…
v1r3n May 15, 2026
d4d2865
fix(ts-e2e): suite17 INST_SECRET — make the echo prompt retry-friendly
v1r3n May 15, 2026
ca75041
test(py-integration): mirror INST_SECRET fix + wire tests/integration…
v1r3n May 15, 2026
ddd7c40
fix(ts-e2e): suite20 max_tokens — assert any substantive output, not …
v1r3n May 15, 2026
30cb385
fix(ts-e2e): suite17 — strengthen retry-friendly prompts for INST_SEC…
v1r3n May 15, 2026
c9113b9
fix(ts-e2e): suite20 max_tokens — mirror the simpler 2-section planne…
v1r3n May 15, 2026
4678ea2
fix(ci): scope python integration to guardrail-matrix only + 10-min t…
v1r3n May 15, 2026
7776ed8
fix(java-sdk): apply PR #223 e2e layout to E2eSuite13ToolTypes + E2eP…
v1r3n May 16, 2026
3a37350
ci: consolidate java-sdk / java-spring / csharp-sdk / docs into ci.yml
v1r3n May 16, 2026
8aaf6a0
ci: kick
v1r3n May 16, 2026
475492b
feat(java-sdk): add PLAN_EXECUTE named-slot ``planner()`` / ``fallbac…
v1r3n May 16, 2026
5e3b47f
fix(server): restore AgentConfig.synthesize + final-LLM elision
v1r3n May 16, 2026
f139446
fix(java-sdk): emit strategy when PLAN_EXECUTE named slots are set
v1r3n May 16, 2026
85dba1a
ci(rebase): drop PAC/PAE-era duplicate java-sdk-tests / csharp-sdk-bu…
v1r3n May 17, 2026
b0dc569
test(ts-e2e): allow 2 retries on suite20 max_tokens test
v1r3n May 17, 2026
c0c9240
feat(pac/pae): cross-step output piping via Ref('step_id')
v1r3n May 18, 2026
e16de9e
fix(server): import LinkedHashSet instead of inlining FQN (checkNoInl…
v1r3n May 18, 2026
5c6576c
style(server): spotlessApply on PlanAndCompileTask + tests
v1r3n May 18, 2026
6ead494
test(java-e2e): loosen testMaxTokensInGenerate filename + word-count …
v1r3n May 18, 2026
2b0d580
test(java-e2e): retry Suite12 HITL approve-with-event once on timeout
v1r3n May 18, 2026
a19cf28
test(java-e2e): two pre-existing flake fixes
v1r3n May 18, 2026
ddc639b
test(ts-e2e): retry suite20 happy-path test on LLM under-production
v1r3n May 18, 2026
10ed2f3
test(java-e2e): drop too-strict negative assertion in Suite10 test_lo…
v1r3n May 18, 2026
87e6479
docs(py-example): self-evidencing trace in 108_plan_execute_refs
v1r3n May 19, 2026
7ac30c0
feat(ts,java,csharp): typed Plan + Ref for Strategy.PLAN_EXECUTE
v1r3n May 19, 2026
31ab90e
fix(sdk-parity): include modifications that were missing from 7ac30c0f
v1r3n May 19, 2026
6ceca51
test(java-e2e): bump Suite12 HITL test timeout to 900s
v1r3n May 19, 2026
3ae56a4
Merge branch 'main' into feat/pac-pae
v1r3n May 19, 2026
ccfdc63
revert(ci): drop workflow changes from this PR
v1r3n May 19, 2026
5c68d56
test(e2e): deterministic PAC/PAE Ref tests across all four SDKs
v1r3n May 19, 2026
eb5336d
docs(plan-execute): add lifecycle + compiled-DAG diagrams
v1r3n May 20, 2026
b6de931
fix(csharp): Strategy.PlanExecute must serialize to 'plan_execute'
v1r3n May 20, 2026
37a4b2e
fix(java-e2e): Suite12 HITL hang — bound parent + poll instead of SSE
v1r3n May 20, 2026
6c97330
Merge branch 'main' into feat/pac-pae
v1r3n May 21, 2026
5d7e7f2
fix(python-sdk): enforce Op XOR — neither-set was silently accepted
v1r3n May 21, 2026
18a71d0
fix(ts-sdk): enforce Op XOR — neither-set was silently accepted
v1r3n May 21, 2026
49a1d4d
fix(java-sdk): enforce Op XOR — neither-set was silently accepted
v1r3n May 21, 2026
65f144b
fix(csharp-sdk): make Op XOR structural — remove the neither-set loop…
v1r3n May 21, 2026
230e262
docs(plan-execute): correct Ref validation location; mark plan_source…
v1r3n May 21, 2026
534cc1c
fix(server): bump spring-security 6.3.4 → 6.3.5 + enforce 72-char pas…
v1r3n May 21, 2026
b0d664c
fix(server): PAC fails compile when a guardrailed tool can't serialize
v1r3n May 21, 2026
d6441c4
fix(server): PAC fails compile on on_fail=retry|fix|human without fal…
v1r3n May 21, 2026
199e079
chore(ts-examples): clear protobufjs RCE + fast-uri/langsmith/tar adv…
v1r3n May 21, 2026
7158782
fix(pac): reject parallel-step Ref feeding scalar-arg consumers at co…
v1r3n May 21, 2026
80085eb
docs(plan-execute): add 109 plan-execute-replan loop example + tests
v1r3n May 22, 2026
c6bc66d
docs(plan-execute): add 110 adaptive plan-execute-replan goal-seeking…
v1r3n May 22, 2026
3488a62
docs(plan-execute): add 111 binary-search plan-execute-replan loop
v1r3n May 22, 2026
08d1d62
docs(plan-execute): add 112 — DO_WHILE loop INSIDE a single workflow
v1r3n May 22, 2026
310679c
fix(ex 112): use real PAC + SUB_WORKFLOW inside DO_WHILE
v1r3n May 22, 2026
2ae3138
docs(ex 111): print execution_id per iteration so the per-loop workfl…
v1r3n May 22, 2026
9fe8aad
style: spotlessApply on PAC + compiler + tests touched by dg-recommen…
v1r3n May 22, 2026
655329a
docs(examples): add 113 — AML/SAR investigation loop with DO_WHILE + PAC
v1r3n May 22, 2026
799cebc
docs(examples): add 114 — portfolio rebalance loop with multi-constra…
v1r3n May 22, 2026
56700fe
fix(ex 113, 114): populate output.result with a readable summary
v1r3n May 23, 2026
5a578df
test(java-e2e): bump PlanExecuteTest timeout 300s → 600s
v1r3n May 23, 2026
15b9fc4
fix(pac): gate planner LLM behind a SWITCH on static_plan (dg-recomme…
v1r3n May 23, 2026
3dfdcd3
fix(pac): close dg-recommendations #12 + #14 — JSON-Schema validator …
v1r3n May 23, 2026
d691d5f
refactor(pac): extract emitPlannerStage helper (dg-recommendation #10)
v1r3n May 23, 2026
35b9c43
fix(pac): replace inline java.util.ArrayList FQN with import
v1r3n May 23, 2026
1360232
fix(ts-e2e): suite18 — serial start to match Python's working pattern
v1r3n May 23, 2026
6732883
test(e2e): PAC/PAE tool whitelist enforcement — adversarial coverage
v1r3n May 23, 2026
ae39538
feat(pae): planner context — text + URL fetches w/ credentialed headers
v1r3n May 23, 2026
8807f2c
feat(py-sdk): planner_context — Context dataclass + Agent/factory wiring
v1r3n May 23, 2026
8aa9356
test(e2e): planner_context text snippets reach the planner prompt
v1r3n May 23, 2026
daf348c
feat(sdks): planner_context — TS + Java + C# SDK mirrors + Python exa…
v1r3n May 23, 2026
f47b925
examples(115): planner_context customer-onboarding example in TS + Ja…
v1r3n May 23, 2026
16ab81b
fix(pae): plannerContextBuilderScript — split ${ literal to dodge Con…
v1r3n May 23, 2026
5b47892
fix(pae): two issues caught by CI run on 16ab81b4
v1r3n May 23, 2026
427efa3
fix(csharp-tests): look up AgentConfigSerializer by string, not direc…
v1r3n May 23, 2026
339f71b
fix(pae): /dg review Batch 1 — gate tightening + interpreter + doc/deps
v1r3n May 24, 2026
f1fbae0
fix(pae): /dg review Batch 2 — credential escape, fail-closed seriali…
v1r3n May 24, 2026
268e0d4
fix(pae): /dg #1 — reject schema keywords the runtime validator silen…
v1r3n May 24, 2026
b582169
fix(pae): /dg #5 — output selector reads workflow variable, drops tem…
v1r3n May 24, 2026
ab01cc7
fix(pae): /dg #4 — planner_context fetch cache + ETag + parallel FORK…
v1r3n May 24, 2026
4fa6f83
feat(pae): /dg #6 — POST /api/agent/inspect-plan endpoint
v1r3n May 24, 2026
8eaf058
ci(ts-sdk): /dg #12 — npm audit gate at high-severity, runtime deps only
v1r3n May 24, 2026
8daade3
fix: CI failures from /dg fix stack — inline FQNs + openai upper bound
v1r3n May 24, 2026
49b7d66
docs(agents): codify the no-flaky-tests rule
v1r3n May 24, 2026
8366d0e
fix(ts-e2e): rewrite two suite15 tests to assert on server state, not…
v1r3n May 24, 2026
e390e8e
fix(ts-e2e): test_order_routed_and_looked_up — assert output not inpu…
v1r3n May 24, 2026
14d42bb
docs(agents)+fix(ts-e2e): clarify retry policy for upstream LLM varia…
v1r3n May 24, 2026
8d9a54e
test(java-e2e): instrument testMaxTokensInGenerate with diagnostic dump
v1r3n May 24, 2026
3d3dc06
docs(plan-execute): document planner_context, inspect-plan, schema ga…
v1r3n May 24, 2026
d57323a
fix(py-e2e): test_local_timeout — assert deterministic contract, not …
v1r3n May 25, 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
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@ jobs:
run: npm run build
- name: Run unit tests
run: npx vitest run tests/unit/
# /dg #12: high-severity dep CVEs that ship to users (not dev or
# examples workspace) fail the build. Scoped to non-dev deps +
# the root workspace only — examples are a separate workspace
# and don't reach end users via the published package.
- name: npm audit (high-severity, runtime deps only)
run: npm audit --workspaces=false --omit=dev --audit-level=high

# ── Java SDK Unit Tests ────────────────────────────────────────────
# Runs the Java SDK core + Spring auto-configuration unit tests in one
Expand Down
20 changes: 20 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,24 @@ mypy src/agentspan/agents/ --ignore-missing-imports --no-strict-optional
| `tests/integration/test_basic_execution.py` | End-to-end single agent execution |
| `tests/integration/test_multi_agent.py` | End-to-end multi-agent execution |

### No Flaky Tests

**There are NO flaky tests in this repo. Any test failure is a regression and must be fixed.**

This is not negotiable and not subject to per-session interpretation:

- A "flake" framing is forbidden. If a test fails once and passes on retry, that's still a regression — diagnose the underlying race, missing await, time-dependence, LLM non-determinism, or upstream-dep instability, and **fix the root cause**.
- Never re-run CI to "make it pass" without first understanding why it failed. A re-run that turns green doesn't mean the bug went away; it means you got lucky and shipped the bug.
- "Pre-existing flake" / "happens on main too" is not a get-out clause. If a test is flaky on main, that's a regression on main that we now own. File it, fix it, or remove the test — but don't tolerate it.
- Re-enqueueing a failed CI job without changing code is only allowed AFTER you've identified the root cause and have a fix in flight.

When a test reveals non-determinism that the test itself caused (timing-sensitive assertions, ordering assumptions), fix the **test** so it's robust. When the non-determinism is in the system under test (real race, real instability), fix the **system**. Don't add retries to mask either case.

**The narrow exception — upstream LLM provider variability.** Some e2e tests validate a non-LLM property (a strategy compiles, a sub-workflow fires, a worker registers) but depend on the LLM to drive the scenario (call a tool, pick a route). When gpt-4o-mini occasionally skips a tool call or paraphrases away a number, that's external provider variability — not Agentspan's bug and not the test's bug. For these cases:
- Strongly prefer asserting on deterministic server-side state (workflow status, task names, `outputData` shapes from `@tool` stubs that return fixed data).
- When that's not enough, `{ retry: 2 }` is acceptable, but only with a comment explaining *which* property is the real subject of the test and *why* LLM variability is incidental. See the pattern in `test_suite20_plan_execute.test.ts`.
- Never use retries to paper over a real race in the system or a brittle assertion in the test. The retry is a coping mechanism for upstream variability, not for our own bugs.

### Writing Tests

- Unit tests must run without an Agentspan server (mock all external calls)
Expand All @@ -152,6 +170,7 @@ mypy src/agentspan/agents/ --ignore-missing-imports --no-strict-optional
- Use `pytest` fixtures and parametrize where appropriate
- do NOT use mocks. Mocks considered harmful. Write tests that use the actual server
- SDK e2e tests MUST rely on the Agentspan server to ensure we are testing the actual communication
- E2E tests that depend on an LLM's behavior (output content, tool-call timing) must assert on **deterministic** server-side state — workflow status, task names, compiled DAG structure, `outputData` shapes — never on free-form LLM text. If a test fails because the LLM didn't say the magic word, the test is wrong.

### Examples
- Every feature MUST have an example in all the supported sdks (python/ etc)
Expand Down Expand Up @@ -226,6 +245,7 @@ The `server/` directory contains the Agent Runtime — a Spring Boot server that
|---|---|---|
| `/api/agent/start` | POST | Compile, register, and start an agent execution |
| `/api/agent/compile` | POST | Compile agent config (inspect only) |
| `/api/agent/inspect-plan` | POST | Compile a plan against a PLAN_EXECUTE harness config and return the resulting `WorkflowDef` + error + warnings + stats without dispatching the SUB_WORKFLOW. Body: `{agentConfig, plan}`. Same compile path PAC uses at runtime. See [docs/concepts/plan-execute.md](docs/concepts/plan-execute.md) |
| `/api/agent/list` | GET | List all registered agents (filtered by `agent_sdk` metadata) |
| `/api/agent/executions` | GET | Search agent executions (with `start`, `size`, `sort`, `freeText`, `status`, `agentName` params) |
| `/api/agent/executions/{id}` | GET | Get detailed execution status (agent name, version, status, input, output, current task) |
Expand Down
Loading
Loading