Releases: systeminit/swamp
swamp 20260320.234138.0-sha.dd72c27c
What's Changed
- ci: gate skill-review and skill-trigger-eval on .claude/ path changes (#805)
Summary
- Add a
changesjob usingdorny/paths-filterto detect whether skill-related
files changed (.claude/skills/**,CLAUDE.md, or the review/eval scripts). - Gate
skill-reviewandskill-trigger-evaljobs behind
needs.changes.outputs.skills == 'true'so they only run when relevant files
are touched — avoids burning tessl and claude -p API credits on unrelated PRs. - Add
!failure() && !cancelled()conditions toclaude-review,
claude-adversarial-review, andauto-mergeso they still run when the skill
jobs are skipped (no skill changes) but still block when they actually fail.
Test plan
- PR touching only
src/files — skill-review and skill-trigger-eval skip - PR touching
.claude/skills/— both skill jobs run - PR where skill-review fails — claude-review and auto-merge block
- PR where skill-review skips — claude-review and auto-merge proceed
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.234138.0-sha.dd72c27c/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.234138.0-sha.dd72c27c/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.234138.0-sha.dd72c27c/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.234138.0-sha.dd72c27c/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.233002.0-sha.014259ac
What's Changed
- feat: add skill trigger eval framework with test suites for all swamp skills (#803)
Summary
- Add
scripts/eval_skill_triggers.ts— a Deno-native eval framework that
spawnsclaude -psubprocesses to test whether user prompts trigger the
correct skill. Parses stream-json output to detect Skill/Read tool calls
and measures trigger rates across multiple runs for statistical confidence. - Add
evals/trigger_evals.jsonfor all 12 swamp-* skills (185 total queries)
covering direct triggers, semantic triggers, and cross-skill confusion cases.
Each negative case tests a specific confusion pair (e.g., swamp-vault vs
swamp-extension-vault, swamp-model vs swamp-extension-model). - Improve swamp-troubleshooting skill description to win over domain-specific
skills when users describe errors/failures (50% → 88% pass rate). - Add
deno run eval-skill-triggerstask with scoped env permissions and
skill-trigger-evalCI job. Results render toGITHUB_STEP_SUMMARYas a
markdown table matching the existing skill-review output format. - Eval files are excluded from user repos —
copySkillsTo()uses an explicit
allowlist (BUNDLED_SKILLS) that does not include evals/ paths.
Test plan
-
EVAL_RUNS=1 deno run eval-skill-triggers— all 12 skills pass (≥80%) -
--skill <name>flag filters to a single skill -
--debugflag dumps raw stream events for diagnosis - Negative cases pass across all skills (no false triggers)
- Eval JSON files validated: 185 queries, all have query + should_trigger
-
copySkillsTo()does not copy evals/ dirs (BUNDLED_SKILLS allowlist) - CI job renders results table in GitHub Actions step summary
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.233002.0-sha.014259ac/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.233002.0-sha.014259ac/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.233002.0-sha.014259ac/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.233002.0-sha.014259ac/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.232533.0-sha.358d70ee
What's Changed
- fix: eliminate shell injection in command/shell vault secrets via env var injection (#802)
Summary
Fixes #430 — vault secrets with shell metacharacters (;, |, &, !, $(), etc.) were interpreted as shell syntax when used in command/shell model run fields, enabling arbitrary command execution.
Root cause: Shell-specific escaping lived in resolveVaultExpressions (serves ALL models) — the wrong layer for a shell-only problem. It was also incomplete (missed ;, |, &, !) and corrupted non-shell values ($100 → \$100).
Fix: Move shell safety to the shell model using environment variable injection:
- Vault secrets become sentinel tokens during CEL evaluation (safe alphanumeric strings)
VaultSecretBagvalue object maps sentinels → raw values- Shell model replaces sentinels with
"${__SWAMP_VAULT_N}"env var refs, passes raw values via process environment - All other models get exact raw values via
resolveDeep()— no escaping artifacts
Shell variable expansion happens after command parsing, so secret content is never parsed as shell syntax. This eliminates the entire class of shell injection bugs — no character blocklist to maintain.
User impact
- No breaking changes — same YAML syntax, same output
- Shell commands: injection-proof for all metacharacters (current and future)
- Non-shell models: strictly better — no more
\$/\`corruption - Existing definitions on disk: untouched (expressions stored, not values)
Files changed
| File | Change |
|---|---|
src/domain/vaults/vault_secret_bag.ts |
New VaultSecretBag value object |
src/domain/vaults/vault_secret_bag_test.ts |
Tests for VaultSecretBag |
src/domain/expressions/model_resolver.ts |
Sentinel-based vault resolution, CEL-only escaping |
src/domain/expressions/expression_evaluation_service.ts |
Returns RuntimeResolutionResult with secretBag |
src/domain/models/model.ts |
Added vaultSecrets and unresolvedMethodArgs to MethodContext |
src/domain/models/method_execution_service.ts |
Resolves sentinels before Zod validation and method execution |
src/domain/models/command/shell/shell_model.ts |
Env var injection for vault secrets in run field |
src/libswamp/models/run.ts |
Threads secretBag through execution |
src/domain/workflows/execution_service.ts |
Threads secretBag through workflow execution |
design/expressions.md |
Updated Shell Safety documentation |
| Tests | Updated expected values, added new test cases |
Test plan
- All 3476 unit tests pass
- Type checking (
deno check) clean - Lint (
deno lint) clean - Manual verification: secrets with
;,|,$,&all treated as literal in shell commands - Binary compiled and tested end-to-end
- Integration tests in CI
🤖 Generated with Claude Code
Co-authored-by: Walter Heck walterheck@helixiora.com
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.232533.0-sha.358d70ee/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.232533.0-sha.358d70ee/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.232533.0-sha.358d70ee/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.232533.0-sha.358d70ee/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.205322.0-sha.009deadb
What's Changed
- chore: remove alpha disclaimer from README (#799)
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.205322.0-sha.009deadb/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.205322.0-sha.009deadb/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.205322.0-sha.009deadb/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.205322.0-sha.009deadb/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.202156.0-sha.9f61241f
What's Changed
- The Machine: Hooks proving to be painful (#797)
"the linter is firing between code blocks, so it winds up arguing with itself (for example, type only imports being written when its between edits, so then it just bounces back and forth)"
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.202156.0-sha.9f61241f/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.202156.0-sha.9f61241f/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.202156.0-sha.9f61241f/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.202156.0-sha.9f61241f/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.201208.0-sha.b8d0c34e
What's Changed
- chore: Upgrade CloudControl SDK to 3.1014.0 (#798)
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.201208.0-sha.b8d0c34e/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.201208.0-sha.b8d0c34e/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.201208.0-sha.b8d0c34e/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.201208.0-sha.b8d0c34e/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.192844.0-sha.1bb5fa8f
What's Changed
- docs: guide agents to extend models instead of CLI fallback (#796)
Summary
- Strengthened Rule 2 in generated CLAUDE.md (
generateInstructionsBody()) to explicitly call out CLI tools (gh,aws,curl) as an anti-pattern alongside shell scripts, and point agents toexport const extensionandswamp model type describeto check available methods - Added "model exists but method missing" decision flow to
swamp-extension-modelskill, routing agents to extend existing models viaexport const extensioninstead of falling back to CLI tools - Added "Existing model missing a method" row to the
swamp-modelskill's "Choosing the Right Approach" table - Added "Extend model with new method" row to the
swamp-reportskill's "When to Use Other Skills" table - Improved
swamp-extension-driverskill verification section (tessl review: 94% → 100%) - Tightened
swamp-extension-modelskill verbosity to stay under 500 lines (tessl review: 93% → 100%)
Closes #667
Test plan
-
deno checkpasses -
deno lintpasses -
deno run test— all 3475 tests pass -
deno run compilesucceeds -
npx tessl skill review .claude/skills/swamp-extension-model— 100% -
npx tessl skill review .claude/skills/swamp-extension-driver— 100%
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.192844.0-sha.1bb5fa8f/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.192844.0-sha.1bb5fa8f/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.192844.0-sha.1bb5fa8f/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.192844.0-sha.1bb5fa8f/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.190516.0-sha.5f63dd16
What's Changed
- docs: add report guidance to skills and generated CLAUDE.md (#795)
Summary
Closes #662
Agents default to inline shell scripts (python3 -c, deno eval, complex jq pipelines) when they need to transform model output, instead of using the proper extension points. With reports now available, this PR updates skill documentation so agents automatically choose the right approach based on task intent:
- Reusable pipeline (reports, analysis, summaries) → report extension
- Ad-hoc debugging / one-off inspection → inline is fine
Changes
src/domain/repo/repo_service.ts— Added rule 8 ("Reports for reusable data pipelines") to the generated CLAUDE.md rules, and addedswamp-reportto the generated skills list (afterswamp-data).claude/skills/swamp-model/SKILL.md— Added a "Choosing the Right Approach" decision table before "When to Use Other Skills" that maps task type → approach (extension model, report extension, or inline), and addedswamp-reportto the skills cross-reference table.claude/skills/swamp-extension-model/SKILL.md— Added guidance in the decision flow that if the task is transforming/analyzing existing model output, a report extension is the right choice (not an extension model), and addedswamp-reportto the skills cross-reference table.claude/skills/swamp-report/SKILL.md— Added a "When to Create a Report" positioning section after the intro that defines when reports are the right choice (repeatable analysis, versioned output, multi-model analysis, user asks for report/summary/audit)
Design choices
The key decision was keeping the guidance lightweight and distributed across skills rather than creating a centralized decision document. Each skill now contains just enough context to redirect agents to the right tool — the swamp-model skill has the top-level decision table, swamp-extension-model has a guard clause before its creation flow, and swamp-report has positioning criteria. This means agents get the right guidance regardless of which skill they load first.
We chose not to add any code changes or new CLI behavior — this is purely a documentation/guidance fix that steers agent behavior through better skill content.
Test plan
-
deno checkpasses -
deno lintpasses -
deno run test— all 3475 tests pass - Verify generated CLAUDE.md includes rule 8 and
swamp-reportskill by runningswamp initin a test repo
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.190516.0-sha.5f63dd16/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.190516.0-sha.5f63dd16/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.190516.0-sha.5f63dd16/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.190516.0-sha.5f63dd16/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.184735.0-sha.e821ef40
What's Changed
- The Machine: Remove the stop verify script file (#794)
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.184735.0-sha.e821ef40/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.184735.0-sha.e821ef40/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.184735.0-sha.e821ef40/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.184735.0-sha.e821ef40/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260320.183930.0-sha.b966a910
What's Changed
- The Machine: Moving the stop hook back to CLAUDE.md (#793)
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.183930.0-sha.b966a910/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.183930.0-sha.b966a910/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.183930.0-sha.b966a910/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260320.183930.0-sha.b966a910/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/