Skip to content

Releases: CharlesHoskinson/foreman

Return of the ForeDi

Return of the ForeDi Pre-release
Pre-release

Choose a tag to compare

Return of the ForeDi artwork

Return of the ForeDi introduces Pel workflows to Foreman. Pel makes task order, conditions, dependencies, and bounded recovery explicit. Foreman continues to control repository access, provider calls, verification, review, and durable state.

Read the Pel overview and installation guide.

This is an unnumbered prerelease for Linux x64 with Node.js 24. It does not declare the broader v0.5 program complete. The package reports version: null and identifies its exact build.

The release includes:

  • The Pel language engine, workflow checking and previews, durable execution, and installed examples.
  • Exact provider identity and capability checks, with fail-closed API output handling.
  • Portable research, installation, rollback, and support commands.
  • The revised Pel README and a complete inventory mapped to planned K requirements. K execution and proofs remain future work.
  • The source release restores twelve historical controllers unchanged under explicit path-and-hash exceptions. Their TypeScript migration remains open.

Download foreman-foredi-linux-x64.tar.gz and verify it against SHA256SUMS. Extract it, then run its runtime/dist/install.js with Node.js 24 and your chosen --prefix. The installed bin/foreman command provides check, plan, and the other documented commands.

Provider accounts need their own qualification and project authority before execution. A profile in the registry does not establish live readiness. The 40 percent production-code reduction target is deferred to a separate cleanup release. Other retained v0.5, host, provider, and publication-acceptance obligations remain open.

The PNG is also attached below for direct viewing and download.

Source: 967d3fa, merged through PR #60. The merged tree matches the tested candidate.

The required Linux CI run passed:

  • Node verification: 3,315 passed, nine skipped, zero failures.
  • Bats: 757 passed, 19 skipped, zero failures. Baselines and skip budgets are unchanged.
  • Formal checks: all 19 expected bounded simulation results matched. Both dedicated formal CI runs also passed.
  • The archive passed 19 isolated installation and product checks. Two builds produced identical archive bytes.

The final startup test fixture requires 8,118 instruction tokens against the frozen 16,502 baseline, a 50.81 percent reduction. This measurement does not establish live-provider performance or qualification.

See verification.json for build identity, checks, review bindings, and open obligations.

Foreman v0.4.0

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 25 Aug 03:19

Foreman v0.4.0

Status: release candidate prepared 2026-08-24.

v0.4.0 adds stable project identity, a durable external memory projection,
a hermetic appliance, and a deterministic graph-assisted knowledge plane.
Graph data remains derived state. Foreman remains functional when the graph is
absent, stale, disabled, or corrupt.

Product

  • The project registry gives each repository a stable local identity and binds
    cross-project state to the correct SessionStore.
  • The MemoryIndex adapter supports Qdrant 1.19.0, a pinned local embedding
    model, conditional writes, and isolated projection epochs. NullMemoryIndex
    remains available.
  • The appliance builds pinned control, toolchain, and worker images and uses a
    dedicated rootless Podman service without mounting the operator's default
    engine socket.
  • Graphify 0.9.48 is qualified behind a deterministic publication and
    freshness boundary.
  • The work-DAG projector and graph-context builder produce bounded,
    deterministic artifacts with source citations and explicit degraded modes.
  • The release evaluator uses a canonical 2,000-slot paired run set. No
    observations were available for this release, so the result is
    GRAPH_OFF_UNCOMPUTABLE. All 2,000 slots are recorded as not run. Graph
    assistance stays off by default.

Evaluation artifacts:

  • Run-set SHA-256: 4ec22f4d92a711d4a5cfd04bbbc291550664686525d8278db7d0fddbd6980f36
  • Report SHA-256: db1eb64f906f719c1fd7e4d6ffa5df86f78bbaccb6620b2d38e9660c1aed7335

Windows

The Windows workflow provisions the required MSYS2 flock and SQLite tools
and builds the native launcher. BW-004 is an enforcing focused gate for the
lock and worktree create/merge suites. On MSYS, the lock helper keeps a
command-mode flock child alive because descriptor inheritance does not
serialize independent Bash processes reliably. The broader Bats suite remains a
non-gating measurement until its complete native Windows result is qualified.
The complete Node suite remains a Linux/WSL gate; native Windows runs its
static, runtime-build, register, smoke, and test-runner checks. This release
does not represent the unqualified native Windows suites as fully supported.

The local WSL host does not permit unprivileged PID namespaces
(unshare --pid returns Operation not permitted). The launcher suite records
the corresponding degraded-path skip. The hosted Linux gate retains the
namespace-capable launcher check.

Security decision

npm audit reports four high-severity advisories and no critical advisories.
No compatible automatic fix is available on 2026-08-24:

  • Direct dependency @huggingface/transformers 4.2.0 inherits the
    onnxruntime-node and sharp findings.
  • adm-zip is affected by GHSA-xcpc-8h2w-3j85. A crafted archive can request
    a large memory allocation through the inherited ONNX Runtime package.
  • sharp below 0.35.0 inherits the libvips findings grouped under
    GHSA-f88m-g3jw-g9cj.
  • onnxruntime-node remains affected through its adm-zip dependency.

The v0.4.0 release accepts this residual risk. The MemoryIndex adapter uses a
pinned local text-embedding model, does not accept image input, and has a
network-disabled embedding test. Operators must provision trusted model bytes
and must not use untrusted archives or images at this boundary. A later update
will take compatible upstream releases when they are available. This is a
time-bounded acceptance, not a claim that the dependencies are unaffected.

Verification

The release candidate must pass these checks on unchanged bytes before the tag
is created:

  • npm run verify
  • npm run verify-install -- --skill-root skills/foreman
  • bash skills/foreman/scripts/docs-check.sh
  • strict validation for every active OpenSpec change
  • release coverage for every v0.4 lane and the final release phase
  • the hosted Linux gate, the local WSL gate, and the focused native Windows
    BW-004 gate

The final Git commit, hosted run links, and publication state are recorded in
the v0.4.0 checklist and GitHub release.

Deferred work

The SQLite ontology expansion in graph-store-port is deferred to v0.5. The
files-only GraphStore remains the v0.4 default. Council runtime, deliberation,
MCP transport, broad dogfood work, and graph-default-on promotion also remain
outside v0.4.0.

Final verification

George's Odyssey

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 22 Aug 07:57
bb5c8c2

George's Odyssey

George's Odyssey makes session state portable: one SessionStore contract,
two complete implementations.

What shipped

  • complete SQLite and files-only SessionStore backends under one 49-case contract
  • a durable desired-state projection outbox and fm-session sync
  • additive, collision-safe snapshot import with per-kind ID remapping
  • an enforced boundary around raw SQLite access
  • paired files-only snapshot and outbox generations

The delivery guarantee is durable idempotent at-least-once. It is not
exactly-once. A crash after remote success and before local acknowledgement
replays the batch, so external MemoryIndex adapters must make desired-state
operations idempotent.

Exact release evidence

QA

  • complete repository: 1,665 tests found; 1,661 passed, 4 skipped, 0 failed
  • SessionStore package: 171/171 passed
  • CLI Bats and golden tests: 29/29 and 15/15 passed
  • backend boundary: 6/6 passed
  • projection drain: 14/14 passed
  • generated runtime: deterministic build and 19 manifest artifacts verified
  • documentation: lint, spelling, links, agent references, and comments passed
  • independent cold reviews: APPROVED with no blocking finding

No product check was skipped. The full Windows Bats program remains BW-004
and is not a v0.3.1 gate. No external MemoryIndex adapter or live projection
service ships in this release. Files-only writer exclusion is a single-host
claim, not a network filesystem lease.

See the full release notes.

One Runtime

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 08 Aug 13:16
d404031

One Runtime

Foreman v0.3.0

Status: released. The four exit predicates were measured on the commit recorded
in the table below; this commit adds documentation only and carries its own
green gates-linux.

v0.3.0 is one sentence: the Node migration is finished — one runtime, one
language.

Product

Foreman's own Python is gone. git ls-files '*.py' returns seven files: four
vendored scrapling templates, one vendored scrapling test, one vendored
superpowers token-usage utility, and one archived schema checker under
openspec/changes/archive/. None of them is Foreman's.

Three subsystems moved to Node.js 24 and TypeScript in this release.

The session store. skills/foreman/scripts/fm-session.py was 1090 lines
across four tables — facts, measurements, obligations, sessions. It is now
packages/orchestration/src/fm-session-main.ts, bundled behind a thin adapter.
tests/session.bats drives the CLI through FM_SESSION_CMD and passes 29/29
against the bundle. Point that variable at a command that does not exist and all
29 fail, which is how we know the suite is exercising the bundle and not
something else.

The Tier 2 evaluator. tests/tier2_compare.py computed percentiles and
bootstrap confidence intervals. The port reproduces Python's output byte for
byte, which required porting MT19937 including its SHA-512 string seeding, and
Python 3.12's compensated (Neumaier) float summation — naive addition deviates
at the sixteenth decimal, which is enough to move a confidence bound.

Three docs/research/ utilities are retired rather than ported.

The six verified defects

§W2 of the design doc listed six defects found by review agents that ran the
code. All six are fixed in this release.

Defect Landed by
Unguarded recursion in canonical-json.ts threw a raw RangeError a744e9f
POSIX backslash path-confusion, three sites 4c12622
argvWithoutDetach corrupted re-exec argv a744e9f
decodeUtf8Fatal stripped a BOM, so digest and text disagreed a744e9f
Unthrottled spawn fallback discarded the measured vendor caps a744e9f
Six set*RaceHook functions reached the published surface d74600e

The path-confusion one is worth its own paragraph, because it is the defect this
release nearly shipped. On POSIX a backslash is a legal filename character, so a
normalizer that strips a trailing separator turned /tmp/x\ into /tmp/x — a
caller could present a path that compares equal to one directory and denotes
another, inside credential-authority comparison. It existed in three copies. Two
of them were reported fixed earlier in the release run and were not; measurement
on the release candidate found all three still present.

The fix deletes the strip rather than gating it on Windows. resolve() already
removes a trailing separator for the platform's own path flavour and preserves
roots, so the strip was dead code for legitimate input, and its only live
effects were bugs: the POSIX corruption above, and on Windows turning the root
C:\ into C:, which isAbsolute rejects as drive-relative. The originally
planned platform gate would have preserved the second one.

Exit predicates

Four predicates on one unchanged pushed commit. The table in ROADMAP.md
carries the measured verdicts and the commit they were taken against.

Predicate 2 was rewritten during the release. It previously also required a
green gates-windows that ran the Bats suite. That suite was then measured on
Windows for the first time at pass=444 fail=270 skip=26 and does not fit the
60-minute job cap, so Windows is excluded by decision rather than by
omission
— and the exclusion is enforced by a test: re-adding a gating
trigger to the Windows workflow fails hosted-node24-ci.test.ts. Both
polarities were demonstrated before that change landed.

What this release does not do

Windows is not a gating platform and the Bats suite has never passed there. The
absent flock alone accounts for 134 of the 270 failures. Recorded as BW-004.

Sprints 8 through 13 and 16, Sprint 6's project registry, and the knowledge and
graph plane move to v0.4.0. Their change packages are unmodified; only their
release assignment moved.

brokenwindows.md carries the open register. It grew during this release rather
than shrinking, which is the intended behaviour of a log for breakage that is
known, undecided and unassigned.

Notes on the work

Two Tier 2 ports were rejected before the third succeeded. The first passed all
27 tests in its oracle and was still not equivalent: whole-valued floats lost
their decimals and a bootstrap confidence interval landed 16% from Python's on
identical input. The second shipped a string sentinel into output. Neither was
caught, because that suite asserts exit codes and shapes and no statistical
value.

The fix was not a better implementer. It was tests/tier2-golden.bats, which
freezes Python's exact output and diffs against it. The third port was
mechanical once the oracle could see what mattered.

The same shape appeared twice more. In the session port, three project tests
and two white-box Python tests retired with their subject, and their properties
— worktree store sharing, single-snapshot sidecar reads, and
row-check-after-write-lock — were replaced rather than dropped, because a cold
review refused to let concurrency invariants retire uncovered. And in the
path-confusion fix, a cross-vendor audit found that the new tests used a bare
return on Windows, which node:test reports as a pass with zero assertions,
and that the black-box test asserted only that a scan had not refused rather
than which directory it had walked. Both were reworked before the merge; the
stronger test plants a secret in the sibling directory the old normalizer
collapsed onto, so a clean result can only mean the scan bound to the tree it
was handed.

The recurring lesson of this release is that the oracle is usually the defect.
Five separate "it passed" reports in the release run were false, and every one
of them was caught by a check that could discriminate — never by a more careful
reading of the report.

Foreman v0.2.9.0

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 03 Aug 23:25
fbe2325

Foreman v0.2.9.0

Foreman v0.2.9.0 adds a smaller, executable Council preflight boundary. The new
runtime uses Node.js 24 and TypeScript. It builds as one self-contained ESM
file and does not load workspace TypeScript source at run time.

Product changes

  • Add the council-preflight executable.
  • Compile the Attempto Controlled English contract before a provider starts.
  • Support bounded canaries for Grok, Claude, and Codex.
  • Bind each successful canary response to a unique challenge nonce.
  • Return typed, secret-safe failures for invalid input, provider failures,
    timeouts, output limits, and unsupported Google dispatch.
  • Bound input, output, artifacts, observed diffs, process time, and temporary
    files.
  • Resolve relative Council runtime paths once, before provider dispatch.

Validation

  • The Council check passes 39 test files and 1,126 tests.
  • OpenSpec strict validation passes all 31 packages.
  • The full local release gate passes 708 Bats tests, shell checks, formal
    checks, install smoke tests, documentation checks, dependency checks, and
    repository hygiene checks.
  • Hosted Linux and Windows release workflows pass.
  • Exact-merge Grok, Claude, and Codex canaries return nonce-bound ready
    receipts with completed terminal records, exit code 0, no pending or failed
    tool calls, and empty standard error.
  • A cold Codex GPT-5.6 Sol audit approved the implementation with no findings.
  • The exact-merge knowledge graph covers 401 source files with 2,781 nodes,
    5,104 edges, 20 hyperedges, and no missing endpoints or self-loops.

Council preserved quorum_not_met for the audited bundle because the cold
audit was not bound to a Council ready token. This advisory shadow result is
not a release rejection. Deterministic Foreman release gates remain the merge
authority.

Scope boundaries

This release does not include Gemini dispatch, npm publication, complete
Council orchestration, or complete Python removal. New executable code follows
the Node.js and TypeScript migration rule.

Foreman v0.2.8.2

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 03 Aug 14:10
076c014

Foreman v0.2.8.2

Release date: 2026-08-03

Tag target: 076c014a8123d8df341b8037b3be5756c7cf6354

This release proves one bounded result. A cold Grok worker implemented a Gobox fix. Codex independently reviewed the diff. Gobox passed its own make check gate. Foreman then fixed the external-target defects that the pilot found.

Release criteria

  1. Exact-target Linux suite: PASS. A clean source checkout built the POSIX launcher and ran FOREMAN_CI_BATS=1 bash tools/ci-local.sh. Bats reported 685 passed, 0 failed, and 19 skipped. The aggregate result was CI-LOCAL RESULT PASS with zero failed gates. The NATS slice passed 12 of 12 cases.
  2. Exact-main hosted gates: PASS. Linux run 30819569495 and Windows run 30819569488 ran on the tag target. Both workflows completed successfully.
  3. Honest records: PASS. The tagged tree contains the current scope, residuals, release notes, cleanup register, and authority filter. It contains no current v0.2.9 release claim. The v0.2.9-preserve tag is only a recovery point for withdrawn work.

Delivered changes

  • External soft-mode target selection, target-owned checks, target worktrees, and run-scoped SessionDB isolation: Foreman PR 7, merge 525cfb050df8afccdad770b8b3aefb79bb0f8183.
  • Checksum-pinned NATS Server and NATS CLI installation in Linux CI, with 12 of 12 NATS integration cases passing: Foreman PR 10, merge 09e07159ef94b945a6acc2b6c1333864d13291ea.
  • Current release records and removal of stale active release guidance: Foreman PR 12, merge d9eafbb17bcf0d968d8b4c6998ce7476d60dc8c3.
  • Deterministic Quint evaluator staging, without an unauthenticated first-run API lookup: Foreman PR 14, merge 074f3c4d9ac8a02a5cf10cb1b2892ae7d81f59a6.
  • Final release record, cleanup register, current-authority graph filter, and Node.js with TypeScript migration plan: Foreman PR 16, merge and tag target 076c014a8123d8df341b8037b3be5756c7cf6354.

External pilot

  • Gobox worker commit: b0519b25c1c8a5fe46fbd9de27df34775e98c0b0
  • Gobox merge: 24bd736dd92050d886ef59a0237aa2c949acf593
  • Gobox PR 1
  • Target gate: make check

Current knowledge graph

The live authority graph was rebuilt from the exact tag target. It contains 1,434 nodes, 2,618 links, 7 hyperedges, and 115 named communities. It has no duplicate node IDs, duplicate links, dangling endpoints, or unverified nodes.

  • graph.json SHA-256: 90ff4b98158f1c0256e357a2f216f54c6829687fca0467b37537c2c1ad0bd448
  • GRAPH_REPORT.md SHA-256: 276798bef4be59f780d93f4e4644717a7f7de1452a4a48246f3759e60fcf00bb
  • GRAPH_TREE.html SHA-256: d9ee5dbc62a647be1c74bf6c110e913c5ecf268eebeb66dd160645e1f6df8020

The former live graph was moved intact to /home/charl/.foreman/quarantine/graphify-live-stale-20260803T135701Z/graphify-out. It was not deleted.

Known limits

  • The external pilot covers one repository and one workload.
  • Windows Bats remains a non-gating probe.
  • Queue admission can race after socket readiness.
  • Target worktrees can still receive harness and report artifacts.
  • The repository-wide Node.js and TypeScript migration is not complete.
  • Council v0.3 remains a post-release stacked change and is not part of this tag.

Read docs/RESIDUALS.md for the complete shipped boundary.

foreman v0.2.8.1 — field-failure fixes

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 19 Jul 17:27

Fixes the four failures surfaced by the first real external run (a Midnight target), logged in bugeventlog.md and deep-debugged before fixing. Planned and executed via the superpowers brainstorm → plan → subagent-execute flow.

Fixes

  • install.ps1 (Windows) is no longer parse-fragile. The skill link was created with cmd /c mklink /J, which a real operator hit a PowerShell ParserError on — aborting the Windows install entirely. Now a native New-Item -ItemType Junction, with a windows-latest CI smoke test (.github/workflows/windows-smoke.yml) so the whole class is caught going forward.

  • grok --prompt-file empty-burst. grok --prompt-file is a single agentic burst — on an exploration-heavy spec it can spend the burst orienting and write nothing. Added: write-first doctrine (a grok spec's first instruction must be a Write with API facts inlined), an explicit empty-burst vs cancelled-writes distinction, and grok-multiround.sh — a bounded re-prompt loop that feeds forward "prior round wrote nothing; Write now" until files change or the round budget is spent (then a loud EMPTY-BURST FAILED).

  • codex headless auth. codex login --device-auth (codex-cli 0.144.x) falls back to a localhost browser flow that dies on detach — it can't authenticate headless. Documented the real headless path (printenv OPENAI_API_KEY | codex login --with-api-key) and that interactive login is operator-run (! codex login), never orchestrator-launched.

  • Worktree fan-out unfit for a stateful/live target. A target whose runtime lives outside the git checkout (vendored node_modules, a running proof-server, live testnet) breaks worktree isolation. Added a soft_mode.target = live config key + a wt-new guard that refuses to cut a worktree for live targets, plus the stateful/live-target profile doctrine (no worktree; grok in the working checkout; architect verifies against live services).

Quality

Each fix was TDD-implemented by a Sonnet lane and Opus-audited. The final review caught a real config-resolution bug in the live-target guard — it resolved config from the foreman skill's own repo root instead of the target repo's, so it would have silently no-opped for the exact external-target case it was built for. Fixed and regression-guarded (a test now exercises the default config path that hid it).

Full suite green (one T4b VTICK wall-clock flake cleared in isolation). Residuals (documented future options, not built): grok true multi-turn via grok agent stdio; the optional .foreman/live-target.toml preflight-WARN.

foreman v0.2.8 — vendor concurrency + hard mode

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 19 Jul 07:52

Closes the last two v0.2.7.5 "not-usable-yet" gaps: vendor concurrency is verified and uncapped, and hard mode (containerized untrusted workers) is shipped and proven on real Docker.

Vendor concurrency (T5b) — GREEN

Live, user-authorized shared-account destructive matrix: grok GREEN at N=2 and N=3, codex GREEN at N=2. Pueue caps raised to the proven-green N — grok 1→3, codex 1→2 — and grok promoted to a verified default-eligible implementer. Doctrine reconciled across README / SKILL / lanes / orchestration-hardening / CLAUDE; results in docs/research/vendor-concurrency-results.md.

Hard mode — worker-run + pr-open shipped

Two profiles, selected by hard_mode.profile (default launcher-only):

  • launcher-only (no Docker): worker runs in the run's worktree under foreman-launch supervision; clean-slate env (no host secrets); heartbeats mirrored to the event log; host-side evidence + host-side commit — the worker never commits.
  • container: a clean git archive file-copy work dir bind-mounted into a hardened devcontainer on an egress-capable bridge; a root entrypoint applies a default-deny egress firewall (IPv4 + IPv6, two-host allowlist) then gosu-drops to an unprivileged worker that cannot flush it; --read-only rootfs + tmpfs for /tmp,/run,/home/worker; no docker.sock, no host secrets; delete-aware sync-back.
  • pr-open: gate precondition → host-side HTTPS push with a fine-grained, single-repo PAT via GIT_ASKPASS (token never in argv) → gh pr create --draft; gh pr ready stays a separate human step.

Proven live on WSL Docker 29.6.2: image builds; firewall default-deny v4+v6; worker unprivileged; $HOME writable under --read-only; allowlisted host reachable, non-allowlisted host blocked.

Quality

The plan survived 3 Opus audit rounds (6 → 3 → 0 blocking) before implementation. Each of 3 implementation lanes was Sonnet-implemented → Opus-audited → architect-verified (container verified live on Docker) → fixes applied.

Honest residuals

  • The container live bats test skips where Docker isn't on the (Git-Bash) PATH — proven manually on WSL; a full in-container worker E2E needs vendor auth inside the container (API-key mode).
  • codex concurrency proven at N=2 (cap 2); N=3 unrun.
  • grok must be on PATH for grok lanes (installed at /c/root/.local, not on the default inherited PATH — a Setup-stage concern). The lane-run grok Use-path readiness gate runs a network-flaky timeout 10 grok models probe, so the grok-lane / vendor-isolation unit tests are coupled to live grok readiness — a robustness follow-up (stub the probe in those unit tests; have foreman-setup persist grok on PATH).

Release lineage: First Light v0.1.0 → Nightwatch v0.2.0 → Beacon v0.2.5 → v0.2.7.5 → v0.2.8.

Foreman v0.2.7.5 — Usability

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 19 Jul 01:26

Foreman is a cross-vendor architect/worker orchestration skill for coding agents. A high-judgment architect routes five-part specs to implementer and auditor lanes, then ships only after independent verification.

What's in this release — usability

v0.2.7.5 closes the five capabilities v0.2.5 (Beacon) shipped but marked "not usable yet," and reframes foreman around an explicit lifecycle that runs the same on Windows and WSL/Linux. Seven OpenSpec packages; nine planned (two ship as approved specs for the next release). Every package was implemented by a Sonnet 5 lane, independently audited by Opus 4.8, and reworked to closure — the suite grew 245 → 359 tests, all green.

Three-stage lifecycle — Setup & Environment → Use → Cleanup. All model authentication moves into Setup, never mid-run. foreman-setup.sh composes tool-check + bootstrap + non-billing per-vendor auth probes and emits a lane-scoped readiness verdict (MISSING/OUTDATED/NOT_AUTHENTICATED/READY); Use refuses to route to a not-ready lane (a real coded gate in lane-run, not a reminder); foreman-cleanup.sh is a deterministic, idempotent, dirty-safe teardown.

Grok lanes are live. Grok Build wired into the vendor map with per-lane GROK_HOME isolation and a secrets-refusal preflight (a grok lane refuses a worktree bearing .env/key material — the guard against whole-repo upload). Proven end-to-end: a real grok --round wrote its file, passed the gate, and recorded round_done.

Full WSL setup. bootstrap-wsl.sh provisions foreman natively inside WSL (bats, shellcheck, bun, pueue, codex, grok, node/npm), so the three-stage lifecycle runs identically on Linux. Two live bugs fixed along the way: WSL codex was crashing on a leaked Windows npm shim (fixed via native install + appendWindowsPath=false), and the env manifest falsely claimed shellcheck was installed (now genuinely installed both sides). .wslconfig tuned for an agent host; a sleep-resume clock-sync hook protects the event log from post-sleep drift.

POSIX cascade parity. The POSIX launcher self-re-execs as PID-namespace init (unshare --pid --mount-proc --fork --kill-child), so the kernel reaps the whole tree on launcher death — the Linux analog of Windows' KILL_ON_JOB_CLOSE, probed working on WSL. A PR_SET_CHILD_SUBREAPER net and the existing setsid/pgid fast path complete the ladder; the Windows build is untouched.

Concurrent-worktree hardening. A git guard bundle (scheduled maintenance replacing reactive gc, core.fsmonitor/longpaths, GIT_OPTIONAL_LOCKS=0 on polls, GIT_ASK_YESNO=false, a retry wrapper, a stale-lock sweep, SIGINT-before-remove) auto-applied at worktree creation — the stalls-and-git-lock class the operator was hitting. A real concurrency race in the worktree index was found and fixed under a 6-lane test.

Vendor concurrency (T5b). A shim-tested destructive-concurrency harness enforcing all four abort criteria, plus the Claude Code ruling (requires a separate $HOME per lane, from the public issue base). The destructive authenticated verdict remains UNVERIFIED — vendor caps stay at 1 by design until a green result justifies raising them.

Documentation refreshed to the shipped surface: README/USAGE/CLAUDE.md/INSTALL reorganized around the lifecycle with Windows and WSL quickstarts, every command ground-truthed against the code (zero invented flags).

Honest residuals

  • T5b destructive verdict is UNVERIFIED — the authenticated grok/codex concurrency matrix could not run in this environment (isolated per-lane auth staging was blocked, no lower-tier key available). The harness is built and enforces all four abort monitors; a future session with destructive-auth permission or a scoped key can run it and raise caps on a green result. Until then, caps stay at 1.
  • wt-cleanup grandchild orphans on MSYS — neither taskkill //T nor a POSIX process-group reliably reaps a plain bash-forked grandchild on Git Bash/MSYS (a Cygwin constraint, documented, not a defect).
  • Prose pass used russellian-style; the requested blader/humanizer plugin was not installed in the build environment — a one-command follow-up (/plugin marketplace add blader/humanizer) for a future polish.
  • hard-mode-launcher and the v0.3.0 session-transport re-port ship as approved OpenSpec specs, executed next release.

Install

git clone https://github.com/CharlesHoskinson/foreman
cd foreman && ./install.sh    # or .\install.ps1 on Windows; WSL: bash env/bootstrap-wsl.sh

Operating guide: docs/USAGE.md. Reference: skills/foreman/references/orchestration-hardening.md + reference-environment.md.

Foreman v0.2.5 Beacon

Choose a tag to compare

@CharlesHoskinson CharlesHoskinson released this 18 Jul 14:23

Foreman v0.2.5 — Beacon

Foreman is a cross-vendor architect/worker orchestration skill for coding agents. A high-judgment architect routes five-part specs to implementer and auditor lanes, then ships only after independent verification.

What's in this release — orchestration hardening

v0.2.5 makes the dominant workflow failure — an agent backgrounding its work and ending its turn, stranding the round — structurally impossible rather than merely detectable. Six prevention criteria are proven (docs/notes/2026-07-18-v025-sc-proof.md): a round launched through the stack completes, writes its report, and records round_done with the dispatching agent gone, zero manual resumes.

Process ownership — foreman-launch (TypeScript on Bun 1.3.14, compiled Windows x64 + POSIX builds from one source): Job Object with KILL_ON_JOB_CLOSE makes orphans impossible by construction; graded stop, frozen heartbeat schema, --detach, nested-launcher reap proven by test. The POSIX build's no-kernel-cascade asymmetry is honestly documented with the -pgid reaper rule.

Round ownership — lane-run --round: the pueue daemon owns implement → gate → report → round_done; the terminal predicate demands whole-round exit plus an attempt-fresh report, so stale artifacts never masquerade as completion.

Queue admission — lane-queue over pueue: per-vendor concurrency groups, a host-wide gate group serializing every test run, and a per-shell quote-preserving submit layer (PowerShell and POSIX, fail-fast on anything unclassifiable).

Observability — watch v2 on the VTICK injectable clock: ten typed states, phase-aware thresholds, liveness from launcher heartbeats (queued is not running; verifying is not stalled; silence alone never classifies). Production-threshold stall walks test in 2.5 seconds instead of 15 minutes.

Recovery — lane-supervise: bounded auto-resume (default 2 attempts, then one terminal alert) from the event log, checkpoints, and heartbeats alone, with hard never-rules against racing live lanes.

Integrity — merge-gate (merge-base freshness verdicts, no auto-salvage), the wt-merge gitignored-report fix, wt-cleanup report archiving, event schema v2 with atomic compaction, vendor config isolation plumbing, and an LF-pinned, slow/fast-tagged test suite grown 127 → 245.

Four product defects were caught pre-push by the release's own gate discipline (stdbuf LD_PRELOAD poisoning, pueue argv re-parse, unguarded shell quoting, MSYS path conversion) — each sealed with a permanent regression test and a bugeventlog doctrine entry.

Honest residuals: real-vendor concurrency verdict deferred (caps stay 1); [audit.policy] consumed from v0.3.0; launcher-absent lanes outside auto-resume scope.

Install

git clone https://github.com/CharlesHoskinson/foreman
cd foreman && ./install.sh    # or .\install.ps1 on Windows

Operator guide: skills/foreman/references/orchestration-hardening.md. Next: v0.3.0 session transport — adapters spawn through the launcher (see ROADMAP.md).