Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,46 @@

- **Human `/plan` respects `maxChildrenPerTask` but not `dailyLimit` (AGT-4123).** `POST /api/plan/dispatch` now refuses with `decomposition_child_cap` when an approved plan would leave more children than `autonomous.decomposition.maxChildrenPerTask` on the new parent (sharing `refuseForChildCap` with the autonomous path). The automation-pacing `dailyLimit` / `reserveDailyCreations` budget remains runner-only — an explicitly confirmed plan is not refused because the daemon already spent today's slots.

## 0.24.1 — 2026-09-20

### Added

- **Cost-capped GitHub Action reviews.** `openswarm review --model <id>` is now
exposed by the CLI and the composite action forwards its optional `model`
input through the same reviewed call chain. The action refuses as
gate-not-run when an older installed package lacks the option, rather than
silently falling back to an uncontrolled default model. The dogfood workflow
pins `deepseek/deepseek-v4-flash`.
- **Backfill for pre-publication parked branches (AGT-4124).** `openswarm
drain-parks --path <repo>` finds unowned `NEEDS_HUMAN` rows, creates or
reuses their draft PRs, and records zero-ahead or missing-branch reasons with
CAS-protected ledger updates. `--dry-run` performs no GitHub or ledger write.
- **Resource-aware test fan-out.** Test parallelism now scales with available
CPU and memory instead of unconditionally consuming the host.

### Changed

- **OpenSwarm is documented as an agentic CI/CD gate first.** The README now
leads with review → fix → re-review → deterministic verification and presents
the Linear daemon as an optional orchestration layer.
- **Fleet supervision exposes thinking effort.** The supervisor can configure
reasoning effort for every role instead of treating it as an inaccessible
model default.

### Fixed

- **Reproducible package installation on every supported platform.** LanceDB is
pinned to the last stable release whose declared macOS, Linux, and Windows
optional native packages all exist in the registry, so `npm ci` no longer
rejects the committed lockfile.
- **OpenRouter flash routing fails over to GLM.** A failing or unavailable
`deepseek/deepseek-v4-flash` review can promote to `z-ai/glm-5.3-flash` under
the existing fallback policy.
- **Durable run state has stronger recovery evidence.** Session transcripts,
watchdog causes, staged memory promotion, write scopes, and parked
publication records now survive the retries and handoffs that previously
obscured them.


## 0.24.0 — 2026-09-10

Expand Down
35 changes: 29 additions & 6 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,18 +219,41 @@ runs:
if [ -n "${REVIEW_MODEL:-}" ]; then ARGS+=(--model "$REVIEW_MODEL"); fi
if [ "${READ_ONLY:-true}" = "true" ]; then ARGS+=(--read-only); fi

# stdout is the JSON document; diagnostics go to stderr and stay on the
# job log.
# The CLI's JSON contract puts diagnostics on stderr. A dependency can
# still emit a late stdout diagnostic from a background task, so parse
# the one review document into a clean runner-temp file before trusting
# it for outputs or the exit contract below.
set +e
openswarm "${ARGS[@]}" > "$REVIEW_JSON"
STATUS=$?
set -e

DECISION=""
GATE_RAN="false"
if [ -s "$REVIEW_JSON" ]; then
DECISION=$(REVIEW_JSON="$REVIEW_JSON" node -e 'try{process.stdout.write(String(JSON.parse(require("fs").readFileSync(process.env.REVIEW_JSON,"utf8")).decision??""))}catch{}')
GATE_RAN=$(REVIEW_JSON="$REVIEW_JSON" node -e 'try{process.stdout.write(String(JSON.parse(require("fs").readFileSync(process.env.REVIEW_JSON,"utf8")).gateRan??false))}catch{process.stdout.write("false")}')
PARSED_REVIEW_JSON="$RUNNER_TEMP/openswarm-review-parsed.json"
if [ -s "$REVIEW_JSON" ] && REVIEW_JSON="$REVIEW_JSON" PARSED_REVIEW_JSON="$PARSED_REVIEW_JSON" node -e '
const fs = require("fs");
const raw = fs.readFileSync(process.env.REVIEW_JSON, "utf8");
let review;
try { review = JSON.parse(raw); } catch {
// A review document is emitted at the start of a line. Keep the
// first complete JSON document with the required gate fields,
// rather than treating a diagnostic prefix as a successful pass.
for (const match of raw.matchAll(/^[ \t]*\{/gm)) {
try {
const candidate = JSON.parse(raw.slice(match.index));
if (typeof candidate?.gateRan === "boolean") { review = candidate; break; }
} catch {}
}
}
if (!review || typeof review.gateRan !== "boolean") process.exit(1);
fs.writeFileSync(process.env.PARSED_REVIEW_JSON, JSON.stringify(review));
'; then
REVIEW_JSON="$PARSED_REVIEW_JSON"
DECISION=$(REVIEW_JSON="$REVIEW_JSON" node -e 'process.stdout.write(String(JSON.parse(require("fs").readFileSync(process.env.REVIEW_JSON,"utf8")).decision??""))')
GATE_RAN=$(REVIEW_JSON="$REVIEW_JSON" node -e 'process.stdout.write(String(JSON.parse(require("fs").readFileSync(process.env.REVIEW_JSON,"utf8")).gateRan))')
elif [ -s "$REVIEW_JSON" ]; then
echo "::warning::OpenSwarm produced output but no parseable review document"
fi

echo "decision=$DECISION" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -278,7 +301,7 @@ runs:
# an unknown option, a crash, output that is not the JSON document — is
# a gate that did not run, and calling that a reject both misreports the
# change and hides the real failure.
if [ "$STATUS" != "0" ] && [ "$GATE_RAN" != "true" ]; then
if [ "$GATE_RAN" != "true" ]; then
echo "::error::OpenSwarm exited $STATUS without producing a verdict — the gate did not run"
if [ "$FAIL_ON_GATE_NOT_RUN" = "true" ]; then exit 2; fi
exit 0
Expand Down
102 changes: 65 additions & 37 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@intrect/openswarm",
"version": "0.24.0",
"version": "0.24.1",
"description": "Autonomous AI agent orchestrator — Claude, GPT, Codex, and local models (Ollama/LMStudio/llama.cpp)",
"license": "MIT",
"type": "module",
Expand Down Expand Up @@ -50,7 +50,7 @@
"@huggingface/transformers": "^4.2.0",
"@inquirer/prompts": "^8.5.2",
"@intrect/cxt": "^0.3.0",
"@lancedb/lancedb": "^0.23.0",
"@lancedb/lancedb": "0.22.3",
"@linear/sdk": "^19.0.0",
"@modelcontextprotocol/sdk": "^1.29.0",
"@types/better-sqlite3": "^7.6.13",
Expand Down
Loading