Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
6919351
fix(cli): send workflow dispatch/result messages for Web UI cards (#1…
coleam00 Apr 10, 2026
7cae3a1
fix(cli): guard dispatch sendMessage, improve comments and add tests …
coleam00 Apr 10, 2026
25757b8
simplify: remove redundant String() wrapping in template literals
coleam00 Apr 10, 2026
b8e367f
simplify: reduce complexity in changed files
coleam00 Apr 10, 2026
5685b41
fix(cli): add cli. domain prefix to log event names
coleam00 Apr 10, 2026
16b47d3
fix: archon setup --spawn fails on Windows when repo path contains sp…
coleam00 Apr 10, 2026
4ee5232
fix(web): interleave tool calls with text during SSE streaming (#1054)
coleam00 Apr 10, 2026
3e3ddf2
feat: inject workflow run context into orchestrator prompt (#1055)
coleam00 Apr 10, 2026
dbe559e
fix(web): address review findings — logging and test extraction
coleam00 Apr 10, 2026
e4555a7
simplify: reduce complexity in changed files
coleam00 Apr 10, 2026
4292c3a
simplify: replace nested ternary with if/else for headerTitle in Work…
coleam00 Apr 10, 2026
bf8bc8e
fix: address review findings for workflow context injection
coleam00 Apr 10, 2026
b620c04
fix(web): add defensive optional chaining for workflow run data access
coleam00 Apr 11, 2026
c208911
chore: update Homebrew formula for v0.3.6
github-actions[bot] Apr 12, 2026
91c184a
refactor: rename IAssistantClient to IAgentProvider
Wirasm Apr 12, 2026
b9a70a5
refactor: complete provider rename in config types, logger domains, a…
Wirasm Apr 12, 2026
a7b3b94
refactor: simplify provider rename follow-through
Wirasm Apr 12, 2026
a4242e6
Merge pull request #1116 from coleam00/rename-iassistantclient-to-iag…
Wirasm Apr 12, 2026
39c6f05
docs: consolidate Claude guidance into CLAUDE.md
Wirasm Apr 12, 2026
eb75ab6
Merge pull request #1130 from coleam00/rules-cleanup
Wirasm Apr 12, 2026
c1ed765
refactor: extract providers from @archon/core into @archon/providers …
Wirasm Apr 13, 2026
6a6740a
fix: make env-integration test cross-platform (Windows CI) (#1160)
Wirasm Apr 13, 2026
37aeadb
refactor: decompose provider sendQuery() into explicit helper boundar…
Wirasm Apr 13, 2026
c9c6ab4
test: add comprehensive e2e smoke test workflows
Wirasm Apr 13, 2026
a8ac3f0
security: prevent target repo .env from leaking into subprocesses (#1…
Wirasm Apr 13, 2026
bf20063
feat: propagate managed execution env to all workflow surfaces (#1161)
Wirasm Apr 13, 2026
b5c5f81
refactor: extract provider metadata seam for Phase 2 registry readine…
Wirasm Apr 13, 2026
d6e24f5
feat: Phase 2 — community-friendly provider registry system (#1195)
Wirasm Apr 13, 2026
af9ed84
fix: prevent worktree isolation bypass via prompt and git-level adopt…
Wirasm Apr 14, 2026
fd3f043
fix: extend worktree ownership guard to resolver adoption paths (#1206)
Wirasm Apr 14, 2026
5a4541b
fix: route canonical path failures through blocked classification (#1…
Wirasm Apr 14, 2026
33d31c4
fix: lock workflow runs by working_path (#1036, #1188 part 2) (#1212)
Wirasm Apr 14, 2026
81859d6
fix(providers): replace Claude SDK embed with explicit binary-path re…
Wirasm Apr 14, 2026
28b2582
Extra backticks for markdown block to fix formatting (#1218)
matt2000 Apr 14, 2026
73d9240
fix(isolation): complete reports false success when worktree remains …
kagura-agent Apr 14, 2026
c4ab0a2
docs(claude.md): codify "no autonomous lifecycle mutation across proc…
Wirasm Apr 15, 2026
f61d576
feat(isolation): auto-init submodules in worktrees (#1189)
halindrome Apr 15, 2026
5c8c39e
fix(test): update stale mocks in cleanup-service 'continues processin…
Wirasm Apr 15, 2026
882fc58
fix: stop server startup from auto-failing in-flight workflow runs (#…
Wirasm Apr 15, 2026
3dedc22
Fix incorrect substep numbering in setup.md (#1013)
jinglesthula Apr 15, 2026
51b8652
fix: complete defensive chaining and add missing test coverage for PR…
coleam00 Apr 16, 2026
68ecb75
Merge pull request #1052 from coleam00/archon/task-fix-github-issue-1…
coleam00 Apr 16, 2026
5acf564
Merge pull request #1063 from coleam00/archon/task-fix-issue-1035
coleam00 Apr 16, 2026
b100cd4
Merge pull request #1064 from coleam00/archon/task-fix-issue-1054
coleam00 Apr 16, 2026
2732288
Merge pull request #1065 from coleam00/archon/task-fix-issue-1055
coleam00 Apr 16, 2026
da1f8b7
fix: replace Telegraf with grammY to fix Bun TypeError crash (#1042)
coleam00 Apr 10, 2026
a5e5d5c
fix: address review findings for grammY Telegram adapter
coleam00 Apr 10, 2026
64bdd30
Merge pull request #1066 from coleam00/archon/task-fix-issue-1042
coleam00 Apr 16, 2026
8188544
fix(workflows): stop warning about model/provider on loop nodes (#1090)
coleam00 Apr 16, 2026
7721259
fix(core): surface auth errors instead of silently dropping them (#1089)
coleam00 Apr 16, 2026
7d90906
feat(ci): add E2E smoke test workflows for Claude and Codex providers
coleam00 Apr 16, 2026
d666b3c
fix(ci): resolve 5 E2E smoke test failures from first CI run
coleam00 Apr 16, 2026
4c259e7
fix(ci): increase Claude E2E job timeout from 10 to 20 minutes
coleam00 Apr 16, 2026
bf90911
refactor(ci): strip E2E smoke tests to bare minimum for speed
coleam00 Apr 16, 2026
1c600f2
fix(ci): add allowed_tools: [] to command node to prevent 30s hang
coleam00 Apr 16, 2026
1868170
fix(ci): remove command node from Claude smoke test
coleam00 Apr 16, 2026
367de7a
test(ci): inject deliberate failure to verify CI red X
coleam00 Apr 16, 2026
7d38716
fix(ci): revert deliberate failure, remove test branch trigger
coleam00 Apr 16, 2026
2682430
test(ci): temporarily re-add branch trigger to verify green CI
coleam00 Apr 16, 2026
47be699
chore(ci): remove test branch trigger before merge
coleam00 Apr 16, 2026
f1c5dcb
Merge pull request #1255 from coleam00/feat/e2e-smoke-tests
coleam00 Apr 16, 2026
d535c83
feat(telemetry): anonymous PostHog workflow-invocation tracking (#1262)
coleam00 Apr 16, 2026
86e4c8d
fix(bundled-defaults): auto-generate import list, emit inline strings…
Wirasm Apr 16, 2026
9dd57b2
fix(web): unify Add Project URL/path classification across UI entry p…
leex279 Apr 16, 2026
b7b445b
Merge pull request #1110 from LocNguyenSGU/fix/issue-1108-settings-ad…
leex279 Apr 16, 2026
75427c7
fix(ci): normalize line endings in bundled-defaults generator
coleam00 Apr 16, 2026
df82859
fix(test): normalize on-disk content to LF in bundled-defaults test
coleam00 Apr 16, 2026
bed36ca
fix(workflows): add word boundary to context variable substitution re…
coleam00 Apr 16, 2026
301a139
fix(core/test): split connection.test.ts from DB-test batch to avoid …
Wirasm Apr 17, 2026
a7337d6
fix(docker): create /.archon subdirs in entrypoint for bind mounts (#…
leex279 Apr 17, 2026
922edbb
Merge pull request #1272 from coleam00/fix/issue-1260-docker-bind-mou…
leex279 Apr 17, 2026
4e56991
feat(providers): add Pi community provider (@mariozechner/pi-coding-a…
Wirasm Apr 17, 2026
c864d8e
refactor(providers/pi): drop rot-prone file:line refs from code comme…
Wirasm Apr 17, 2026
d89bc76
fix(setup): align PORT default on 3090 across .env.example, wizard, a…
leex279 Apr 17, 2026
4c6ddd9
fix(workflows): fail loudly on SDK isError results (#1208) (#1291)
coleam00 Apr 18, 2026
60eeb00
feat(workflows): inline sub-agent definitions on DAG nodes (#1276)
Wirasm Apr 19, 2026
83c119a
fix(providers/pi): wire env injection + harden silent-failure paths (…
coleam00 Apr 19, 2026
fb73a50
feat(providers/pi): best-effort structured output via prompt engineer…
coleam00 Apr 19, 2026
ec5e5a5
feat(providers/pi): opt-in extension discovery via config flag (#1298)
coleam00 Apr 19, 2026
c495175
Fix formatting in README.md (#1059)
AnjishnuSengupta Apr 20, 2026
eb730c0
fix(docs): prevent theme reset to dark after user switches to auto/li…
lifeiyu071 Apr 20, 2026
8ae4a56
feat(workflows): add repo-triage — periodic maintenance via inline Ha…
Wirasm Apr 20, 2026
28908f0
feat(paths/cli/setup): unify env load + write on three-path model (#1…
Wirasm Apr 20, 2026
52eebf9
chore(gitignore): ignore .claude/scheduled_tasks.lock
Wirasm Apr 20, 2026
45682bd
fix(providers/claude): use || instead of ?? in hasExplicitTokens to h…
kuishou68 Apr 20, 2026
cb44b96
feat(providers/pi): interactive flag binds UIContext for extensions (…
coleam00 Apr 20, 2026
c5e11ea
docs(claude-md): surface Pi as peer provider alongside Claude and Codex
coleam00 Apr 20, 2026
39a05b7
fix(db): throw on corrupt commands JSON instead of silent empty fallb…
kagura-agent Apr 20, 2026
235a8ce
Add Star History Chart to README.md (#1229)
ACJLabsDev Apr 20, 2026
cc78071
fix(isolation): raise worktree git-operation timeout to 5m (#1306)
Wirasm Apr 20, 2026
7be4d0a
feat(paths,workflows): unify ~/.archon/{workflows,commands,scripts} +…
Wirasm Apr 20, 2026
5ed38dc
feat(isolation,workflows): worktree location + per-workflow isolation…
Wirasm Apr 20, 2026
08de8ee
fix(web,server): show real platform connection status in Settings (#1…
liorfranko Apr 21, 2026
ba4b9b4
docs(worktree): fix stale rename example + document copyFiles properl…
Wirasm Apr 21, 2026
7ea3214
fix: initialize options.hooks before merging YAML node hooks (#1177)
alexsiri7 Apr 21, 2026
bc25dee
fix: detect completion signal in any XML tag, not just <promise> (#11…
Wirasm Apr 22, 2026
d7f36b2
fix(web): allow deleting nodes from Workflow Builder (#971) (#1113)
medevs Apr 22, 2026
817186d
fix(workflows): make archon-adversarial-dev sed replacement macOS-saf…
LaplaceYoung Apr 22, 2026
6fea392
fix(workflows): filter user-plugin MCP noise out of workflow warnings…
Wirasm Apr 22, 2026
ae2d936
fix(deps): override transitive axios to ^1.15.0 for CVE-2025-62718 (#…
Wirasm Apr 22, 2026
056707d
fix(cli): surface stale-workspace registration error instead of fake …
Wirasm Apr 22, 2026
d5c1cd9
fix(server,web,workflows): web approval gates auto-resume + reject-wi…
Wirasm Apr 22, 2026
7000f9b
Release 0.3.7
Wirasm Apr 22, 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
26 changes: 14 additions & 12 deletions .archon/commands/defaults/archon-fix-issue.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,28 +131,30 @@ git status

### 3.2 Decision Tree

```
```text
┌─ IN WORKTREE?
│ └─ YES → Use it (assume it's for this work)
│ Log: "Using worktree at {path}"
│ └─ YES → Use current branch AS-IS. Do NOT switch branches. Do NOT create
│ new branches. The isolation system has already set up the correct
│ branch; any deviation operates on the wrong code.
│ Log: "Using worktree at {path} on branch {branch}"
├─ ON MAIN/MASTER?
├─ ON $BASE_BRANCH? (main, master, or configured base branch)
│ └─ Q: Working directory clean?
│ ├─ YES → Create branch: fix/issue-{number}-{slug}
│ │ git checkout -b fix/issue-{number}-{slug}
│ └─ NO → Warn user:
│ "Working directory has uncommitted changes.
│ Please commit or stash before proceeding."
│ STOP
│ │ (only applies outside a worktree — e.g., manual CLI usage)
│ └─ NO → STOP: "Uncommitted changes on $BASE_BRANCH.
│ Please commit or stash before proceeding."
├─ ON FEATURE/FIX BRANCH?
│ └─ Use it (assume it's for this work)
├─ ON OTHER BRANCH?
│ └─ Use it AS-IS (assume it was set up for this work).
│ Do NOT switch to another branch (e.g., one shown by `git branch` but
│ not currently checked out).
│ If branch name doesn't contain issue number:
│ Warn: "Branch '{name}' may not be for issue #{number}"
└─ DIRTY STATE?
└─ Warn and suggest: git stash or git commit
STOP
└─ STOP: "Uncommitted changes. Please commit or stash first."
```

### 3.3 Ensure Up-to-Date
Expand Down
26 changes: 14 additions & 12 deletions .archon/commands/defaults/archon-implement-issue.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,28 +132,30 @@ git status

### 3.2 Decision Tree

```
```text
┌─ IN WORKTREE?
│ └─ YES → Use it (assume it's for this work)
│ Log: "Using worktree at {path}"
│ └─ YES → Use current branch AS-IS. Do NOT switch branches. Do NOT create
│ new branches. The isolation system has already set up the correct
│ branch; any deviation operates on the wrong code.
│ Log: "Using worktree at {path} on branch {branch}"
├─ ON MAIN/MASTER?
├─ ON $BASE_BRANCH? (main, master, or configured base branch)
│ └─ Q: Working directory clean?
│ ├─ YES → Create branch: fix/issue-{number}-{slug}
│ │ git checkout -b fix/issue-{number}-{slug}
│ └─ NO → Warn user:
│ "Working directory has uncommitted changes.
│ Please commit or stash before proceeding."
│ STOP
│ │ (only applies outside a worktree — e.g., manual CLI usage)
│ └─ NO → STOP: "Uncommitted changes on $BASE_BRANCH.
│ Please commit or stash before proceeding."
├─ ON FEATURE/FIX BRANCH?
│ └─ Use it (assume it's for this work)
├─ ON OTHER BRANCH?
│ └─ Use it AS-IS (assume it was set up for this work).
│ Do NOT switch to another branch (e.g., one shown by `git branch` but
│ not currently checked out).
│ If branch name doesn't contain issue number:
│ Warn: "Branch '{name}' may not be for issue #{number}"
└─ DIRTY STATE?
└─ Warn and suggest: git stash or git commit
STOP
└─ STOP: "Uncommitted changes. Please commit or stash first."
```

### 3.3 Ensure Up-to-Date
Expand Down
37 changes: 29 additions & 8 deletions .archon/commands/defaults/archon-implement.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,40 @@ Provide a valid plan path or GitHub issue containing the plan.
### 2.1 Check Current State

```bash
# What branch are we on?
git branch --show-current
git status --porcelain

# Are we in a worktree?
git rev-parse --show-toplevel
git worktree list

# Is working directory clean?
git status --porcelain
```

### 2.2 Branch Decision

| Current State | Action |
| ----------------- | ---------------------------------------------------- |
| In worktree | Use it (log: "Using worktree") |
| On base branch, clean | Create branch: `git checkout -b feature/{plan-slug}` |
| On base branch, dirty | STOP: "Stash or commit changes first" |
| On feature branch | Use it (log: "Using existing branch") |
```text
┌─ IN WORKTREE?
│ └─ YES → Use current branch AS-IS. Do NOT switch branches. Do NOT create
│ new branches. The isolation system has already set up the correct
│ branch; any deviation operates on the wrong code.
│ Log: "Using worktree at {path} on branch {branch}"
├─ ON $BASE_BRANCH? (main, master, or configured base branch)
│ └─ Q: Working directory clean?
│ ├─ YES → Create branch: git checkout -b feature/{plan-slug}
│ │ (only applies outside a worktree — e.g., manual CLI usage)
│ └─ NO → STOP: "Stash or commit changes first"
├─ ON OTHER BRANCH?
│ └─ Use it AS-IS. Do NOT switch to another branch (e.g., one shown by
│ `git branch` but not currently checked out).
│ Log: "Using existing branch {name}"
└─ DIRTY STATE?
└─ STOP: "Stash or commit changes first"
```

### 2.3 Sync with Remote

Expand All @@ -116,7 +137,7 @@ git pull --rebase origin $BASE_BRANCH 2>/dev/null || true

**PHASE_2_CHECKPOINT:**

- [ ] On correct branch (not base branch with uncommitted work)
- [ ] On correct branch (not $BASE_BRANCH with uncommitted work)
- [ ] Working directory ready
- [ ] Up to date with remote

Expand Down
27 changes: 20 additions & 7 deletions .archon/commands/defaults/archon-plan-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,26 @@ gh repo view --json nameWithOwner -q .nameWithOwner

### 2.3 Branch Decision

| Current State | Action |
|---------------|--------|
| Already on correct feature branch | Use it, log "Using existing branch: {name}" |
| On base branch, clean working directory | Create and checkout: `git checkout -b {branch-name}` |
| On base branch, dirty working directory | STOP with error: "Uncommitted changes on base branch. Stash or commit first." |
| On different feature branch | STOP with error: "On branch {X}, expected {Y}. Switch branches or adjust plan." |
| In a worktree | Use the worktree's branch, log "Using worktree branch: {name}" |
Evaluate in order (first matching case wins):

```text
┌─ IN WORKTREE?
│ └─ YES → Use current branch AS-IS. Do NOT switch branches. Do NOT create
│ new branches. The isolation system has already set up the correct
│ branch; any deviation operates on the wrong code.
│ Log: "Using worktree branch: {name}"
├─ ON $BASE_BRANCH? (main, master, or configured base branch)
│ └─ Q: Working directory clean?
│ ├─ YES → Create and checkout: `git checkout -b {branch-name}`
│ │ (only applies outside a worktree — e.g., manual CLI usage)
│ └─ NO → STOP: "Uncommitted changes on $BASE_BRANCH. Stash or commit first."
└─ ON OTHER BRANCH?
└─ Q: Does it match the expected branch for this plan?
├─ YES → Use it, log "Using existing branch: {name}"
└─ NO → STOP: "On branch {X}, expected {Y}. Switch branches or adjust plan."
```

### 2.4 Sync with Remote

Expand Down
13 changes: 13 additions & 0 deletions .archon/commands/e2e-echo-command.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
description: E2E test command — echoes back the user message
argument-hint: <any text>
---

# E2E Echo Command

You are a simple echo agent for testing. Your ONLY job is to repeat back the user's message.

User message: $ARGUMENTS

Respond with EXACTLY this format and nothing else:
command-echo: <the user message above>
3 changes: 3 additions & 0 deletions .archon/scripts/echo-args.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Simple script node test — echoes input as JSON
const input = process.argv[2] ?? 'no-input';
console.log(JSON.stringify({ echoed: input, timestamp: new Date().toISOString() }));
7 changes: 7 additions & 0 deletions .archon/scripts/echo-py.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Simple script node test — echoes input as JSON (uv/Python runtime)."""
import json
import sys
from datetime import datetime, timezone

input_val = sys.argv[1] if len(sys.argv) > 1 else "no-input"
print(json.dumps({"echoed": input_val, "timestamp": datetime.now(timezone.utc).isoformat()}))
4 changes: 3 additions & 1 deletion .archon/workflows/defaults/archon-adversarial-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ nodes:
"status": "running"
}
STATEEOF
sed -i "s/SPRINT_COUNT_PLACEHOLDER/$SPRINT_COUNT/" "$ARTIFACTS/state.json"
STATE_TMP="$ARTIFACTS/state.json.tmp"
sed "s/SPRINT_COUNT_PLACEHOLDER/$SPRINT_COUNT/" "$ARTIFACTS/state.json" > "$STATE_TMP"
mv "$STATE_TMP" "$ARTIFACTS/state.json"

echo "{\"totalSprints\": $SPRINT_COUNT, \"appDir\": \"$ARTIFACTS/app\", \"artifactsDir\": \"$ARTIFACTS\"}"
timeout: 30000
Expand Down
26 changes: 26 additions & 0 deletions .archon/workflows/e2e-claude-smoke.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# E2E smoke test — Claude provider
# Verifies: Claude connectivity (sendQuery), $nodeId.output refs
# Design: Only uses allowed_tools: [] (no tool use) and no output_format (no structured output)
# because the Claude CLI subprocess is slow with those features in CI.
name: e2e-claude-smoke
description: "Smoke test for Claude provider. Verifies prompt response."
provider: claude
model: haiku

nodes:
# 1. Simple prompt — verifies Claude API connectivity via sendQuery
- id: simple
prompt: "What is 2+2? Answer with just the number, nothing else."
allowed_tools: []
idle_timeout: 30000

# 2. Assert non-empty output — fails CI if Claude returned nothing
- id: assert
bash: |
output="$simple.output"
if [ -z "$output" ]; then
echo "FAIL: simple node returned empty output"
exit 1
fi
echo "PASS: simple=$output"
depends_on: [simple]
40 changes: 40 additions & 0 deletions .archon/workflows/e2e-codex-smoke.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# E2E smoke test — Codex provider
# Verifies: provider selection, sendQuery, structured output
name: e2e-codex-smoke
description: "E2E smoke test for Codex provider. Runs a simple prompt + structured output node."
provider: codex
model: gpt-5.2

nodes:
- id: simple
prompt: "What is 2+2? Answer with just the number, nothing else."
idle_timeout: 30000

- id: structured
prompt: "Classify this input as 'math' or 'text': '2+2=4'. Return JSON only."
output_format:
type: object
properties:
category:
type: string
enum: ["math", "text"]
required: ["category"]
additionalProperties: false
idle_timeout: 30000
depends_on: [simple]

# Assert both nodes returned output
- id: assert
bash: |
simple_out="$simple.output"
structured_out="$structured.output"
if [ -z "$simple_out" ]; then
echo "FAIL: simple node returned empty output"
exit 1
fi
if [ -z "$structured_out" ]; then
echo "FAIL: structured node returned empty output"
exit 1
fi
echo "PASS: simple=$simple_out structured=$structured_out"
depends_on: [simple, structured]
66 changes: 66 additions & 0 deletions .archon/workflows/e2e-deterministic.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# E2E smoke test — deterministic nodes (no AI, no API calls)
# Verifies: bash nodes, script nodes (bun + uv), $nodeId.output substitution,
# when conditions, trigger_rule join semantics
name: e2e-deterministic
description: "Pure DAG engine test. Exercises bash, script (bun/uv), conditions, and trigger rules with zero API calls."

nodes:
# Layer 0 — parallel deterministic nodes
- id: bash-echo
bash: "echo '{\"status\":\"ok\",\"value\":42}'"

- id: script-bun
script: echo-args
runtime: bun
timeout: 30000

- id: script-python
script: echo-py
runtime: uv
timeout: 30000

# Layer 1 — test $nodeId.output substitution from bash
- id: bash-read-output
bash: "echo 'upstream-status: $bash-echo.output'"
depends_on: [bash-echo]

# Layer 1 — conditional branches (only one should run)
- id: branch-true
bash: "echo 'branch-true-ran'"
depends_on: [bash-echo]
when: "$bash-echo.output.status == 'ok'"

- id: branch-false
bash: "echo 'branch-false-ran'"
depends_on: [bash-echo]
when: "$bash-echo.output.status == 'fail'"

# Layer 2 — trigger_rule merge (one_success: branch-false will be skipped)
- id: merge-node
bash: "echo 'merge-ok: true=$branch-true.output false=$branch-false.output'"
depends_on: [branch-true, branch-false]
trigger_rule: one_success

# Layer 3 — final verification: assert all outputs are non-empty
- id: verify-all
bash: |
fail=0
for name in bash-echo script-bun script-python bash-read-output branch-true merge-node; do
echo "$name output received"
done
bash_echo="$bash-echo.output"
script_bun="$script-bun.output"
script_python="$script-python.output"
bash_read="$bash-read-output.output"
branch_t="$branch-true.output"
merge="$merge-node.output"
if [ -z "$bash_echo" ]; then echo "FAIL: bash-echo empty"; fail=1; fi
if [ -z "$script_bun" ]; then echo "FAIL: script-bun empty"; fail=1; fi
if [ -z "$script_python" ]; then echo "FAIL: script-python empty"; fail=1; fi
if [ -z "$bash_read" ]; then echo "FAIL: bash-read-output empty"; fail=1; fi
if [ -z "$branch_t" ]; then echo "FAIL: branch-true empty"; fail=1; fi
if [ -z "$merge" ]; then echo "FAIL: merge-node empty"; fail=1; fi
if [ "$fail" -eq 1 ]; then exit 1; fi
echo "PASS: all deterministic nodes produced output"
depends_on: [bash-read-output, script-bun, script-python, merge-node]
trigger_rule: all_success
38 changes: 38 additions & 0 deletions .archon/workflows/e2e-mixed-providers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# E2E smoke test — mixed providers (Claude + Codex in same workflow)
# Verifies: per-node provider override, cross-provider $nodeId.output refs
name: e2e-mixed-providers
description: "Tests Claude and Codex providers in the same workflow with cross-provider output refs."

# Default provider is claude
provider: claude
model: haiku

nodes:
# 1. Claude node — default provider
- id: claude-node
prompt: "Say 'claude-ok' and nothing else."
allowed_tools: []
idle_timeout: 30000

# 2. Codex node — provider override (runs parallel with claude-node, different providers)
- id: codex-node
prompt: "Say 'codex-ok' and nothing else."
provider: codex
model: gpt-5.2
idle_timeout: 30000

# 3. Assert both providers returned output
- id: assert
bash: |
claude_out="$claude-node.output"
codex_out="$codex-node.output"
if [ -z "$claude_out" ]; then
echo "FAIL: claude-node returned empty output"
exit 1
fi
if [ -z "$codex_out" ]; then
echo "FAIL: codex-node returned empty output"
exit 1
fi
echo "PASS: claude=$claude_out codex=$codex_out"
depends_on: [claude-node, codex-node]
Loading
Loading