Repository navigation
Releases: ozankasikci/sol-skill
Release list
1.11.1 — live progress for backgrounded runs
Fixed
- A running Sol was no longer visible in Claude Code. 1.11.0 moved the
launcher into the background and told Claude there was nothing to poll, so
the Monitor it used to attach disappeared and a run became one silent shell
command.SKILL.mdnow has Claude start a Monitor on the watcher for every
launch,--resumeand--research.
Added
sol-watch.py --run <run-dir>follows a whole launcher run: every
worker's event log, through a stall relaunch or a--resumereplacing the
log, until the launcher has writtensummary.json. It closes with onerun:
line per worker and exits 0 only if all endedokorno-changes. A batch
whose launcher died unclassified, or never started, is reported as such.
Changed
- The watcher is quieter. A search that finds nothing (
rg/grepexit 1) is
no longer afailedline, a heredoc body that mentions a test runner is no
longer a verification run, and a JSON final report is not printed as the plan.
1.11.0 — supervised corrections and research, structured reports
Every run now goes through the supervised launcher, and the brief and the report
are contracts in both directions.
Added
- Structured worker report. The launcher passes
references/report-schema.json
as--output-schema, andsummary.jsonembeds the parsed result underreport:
done/partial/blocked, one entry per numbered acceptance criterion with
evidence, commands run with exit codes, deviations, blocked checks, open
questions.SOL_REPORT_SCHEMA=(empty) returns to a free-text report. diff.patchper worker (diff_pathinsummary.json): everything the
worker changed against the pre-run commit, including files it created. Review
reads this instead ofgit diff, which omits untracked files.--research: a read-only run with live web search under the same watchdog
and stall retry as an implementation run. Effort isSOL_RESEARCH_EFFORT
(xhigh), independent ofSOL_EFFORT. Needs no clean tree.- Failure detail in
summary.json:error(last error event),stderr_tail,
tokenusage, plus top-levelmodelandmode. - Brief template blocks:
<environment>(sandbox, network, known-blocked
checks),<when_blocked>(stop and report rather than guess), numbered
criteria (AC1…), and a slot in<action_safety>for the user's standing
rules, which Codex cannot read fromCLAUDE.md.
Changed
--waitblocks and supervises. It used to poll once and return 75. It now
takes over the watchdog and the stall retry when the launching call is gone,
and returns 75 only afterSOL_WAIT_TIMEOUT(540s). The retry budget is
counted per worker, so a takeover neither skips nor repeats a retry.- Model resolution. With
SOL_MODELunset the launcher follows the Codex
config's default model when that is a Sol model, and falls back to
gpt-6.1-solotherwise. The model is recorded per run.check-codex.sh
resolves it the same way. SKILL.mdroutes corrections and research through the launcher (--resume,
--research) and tells Claude to launch in the background. The hand-rolled
codex exec resume --lastis gone, along with file paths that predated the
launcher.
Fixed
- A stall relaunch dropped the brief's reference images. The relaunch was a
second copy of the worker command without the-iarguments; both now share
one command. - An in-place worker that committed its own work was reported
no-changes.
A clean tree was the whole test. It is nowokwith the commit recorded, and
the default brief tells Sol not to commit. - A stalled
--resumeorphaned itscodexprocess. Job control was only
enabled on the launch path, so the watchdog's group kill reached the wrapper
alone.
1.10.0 — GPT-6.1 Sol, high by default
Changed
- The implementer is now GPT-6.1 Sol (
gpt-6.1-sol). The default model in
sol-parallel.sh(SOL_MODEL),check-codex.sh, and every command in
SKILL.mdand the README moved fromgpt-6-sol. The README's worked example
still shows its originalgpt-5.6-soltranscript. SOL_EFFORTdefaults tohighagain, reverting thexhighdefault from
1.9.0. A stalled worker now steps down tomedium. SetSOL_EFFORT=xhigh
for algorithmically hard briefs; research mode still runs atxhigh.
1.9.0 — GPT-6 Sol, xhigh by default
Changed
- The implementer is now GPT-6 Sol (
gpt-6-sol). The default model in
sol-parallel.sh(SOL_MODEL),check-codex.sh, and every command in
SKILL.mdand the README moved fromgpt-5.6-sol. The README's worked
example keeps its originalgpt-5.6-soltranscript, since that is the run
that was actually recorded. SOL_EFFORTdefaults toxhighagain. The stall ladder and the
300-second first-event budget from 1.8.1 stay, so a stalledxhighlaunch
costs at most that budget and then relaunches athigh. Set
SOL_EFFORT=highfor mechanical briefs where speed matters more.
1.8.1 — high effort by default, in-place recovery fixed
[1.8.1] — 2026-09-02
Changed
SOL_EFFORTnow defaults tohigh, notxhigh. Stalls are
effort-correlated (openai/codex#24260, #23807), and the cost is asymmetric: a
stalled worker burns the entire first-event budget before it does anything at
all. Observed on the same brief — anxhighworker sat 900s without a single
tool call, whilehighmade its first call in 36s. With a compiler and a test
suite in the loop,highverifies its own work, which is the property the
effort was buying.xhighstays available as an explicit opt-in for
algorithmically hard briefs, and research mode still writes it out, because
nothing there compiles. The stall ladder is unchanged, so ahighlaunch now
degrades tomediumon a stall.SOL_FIRST_EVENT_TIMEOUTnow defaults to300seconds, not900. A real
think before the first file read rarely runs past five minutes; 900 turned a
single stall into fifteen lost minutes before the retry could even start.
Fixed
-
An
--in-placerun could not be relaunched, resumed or cleaned up. Only
the launch knew about--in-place; every path after it recomputed the
workspace as$WORKTREE_ROOT/<slug>, a directory an in-place run never
creates. The stall relaunch therefore rancodex exec -C <nonexistent>, died
in about two seconds with a bare "No such file or directory", and recorded
failed-launch, exit 1, elapsed 2 — a stall recovery that reads as a broken
invocation, on precisely the runs the watchdog exists to save. Seen in
production: anxhighworker stalled at 900s and itshighretry never ran.
--resumefailed the same way (the wrapper'scdfell straight through to
itsexit 2), and--cleanuppointed at a worktree that never existed.In-place mode is now remembered in the run directory rather than inferred from
the command line. Each worker's workspace is written to
<run-dir>/workers/<slug>/worktreeat launch, next tobrief, and read back
instead of recomputed;<run-dir>/in-placemarks the run itself, so--wait,
--resumeand--cleanupre-attach correctly without the caller retyping
--in-place— which nothing in the output ever prompted for. -
The stall relaunch and
--resumenow check the workspace exists before
launching and sayworkspace <path> missingwith the slug, rather than
leaving codex to fail with an opaque OS error two seconds later. -
--cleanupon an in-place run prints one line saying there are no worktrees
or branches to remove and exits 0 without touching anything. The workspace
there is the user's own checkout, which may itself be a linked worktree, so a
path that reachedgit worktree removewould have deleted it.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md
1.8.0 — SOL_SANDBOX for toolchains the sandbox cannot reach
[1.8.0] — 2026-08-23
Added
SOL_SANDBOX(defaultworkspace-write) sets the-spolicy for every codex
invocation. It exists becauseSOL_CODEX_CONFIGstructurally cannot reach the
sandbox mode: an explicit-sflag beats-c sandbox_mode=, so setting it
through the config channel is silently ignored — verified with both on one
command, which still failed. Any non-default value warns on stderr, since
danger-full-accessremoves all confinement rather than one restriction.- SKILL.md now covers Docker specifically. Its daemon socket is a unix socket
connect, which neithernetwork_accessnorwritable_rootsunblocks —
verified, both leavedocker psatconnect: operation not permitted.
Verified end to end through the launcher: the same brief gets permission
denied under the default sandbox and lists real containers under
SOL_SANDBOX=danger-full-access.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md
1.7.0 — sandbox overrides for blocked toolchains
[1.7.0] — 2026-08-23
Added
SOL_CODEX_CONFIG: extra-c key=valueoverrides, space separated, applied
to all three codex invocations the launcher makes (launch, stall relaunch,
and resume). Unset by default — relaxing the sandbox is the caller's call per
repo, never the script's. Verified end to end against real codex: the same
probe brief reports HTTP000without it and200with
sandbox_workspace_write.network_access=true.- SKILL.md Sandboxed toolchains: how to recognise a repo whose build cannot
run underworkspace-writeat all, and why it matters more than it looks — a
worker that cannot compile verifies by grep instead, reports green on grep
evidence, and silently turns the role split into "Sol implements blind."
Covers the worktree case specifically: a worktree's git dir lives outside the
write root, sogit commitfails deterministically, not intermittently.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md
1.6.0 — every run under the watchdog
[1.6.0] — 2026-08-19
Added
- Reference images for workers. A brief may carry a sidecar,
<run-dir>/tasks/NN-<slug>.images, one path per line with#comments; each
entry resolves against the repo root and is passed to that worker as
codex exec -i. A path that does not resolve fails the run at preflight,
before any worktree exists. Verified end to end against real codex. --in-place: run a single brief in the repo itself — no worktree, no branch,
no commit, changes left in the working tree exactly as a barecodex exec
leaves them — but supervised by the inactivity watchdog, with stall retries,
asummary.jsonstatus and a real exit code.
Changed
-
Phase 2 now launches through the script in single-worker mode too. The
skill used to end its stall guidance with "parallel mode does all of this
automatically; single-worker mode is your job", which is the one thing this
project has repeatedly established does not work: a flow depending on the
model reliably doing something degrades to silence when it doesn't, and that
is what the 1.2.0 revert was about.It cost hours in practice. A visual brief could not use the launcher, because
workers could not take reference images, so the run went out on the
unsupervised path and hung atxhighwiththread.started,turn.started
and 101 bytes — silent for nearly three hours.SOL_FIRST_EVENT_TIMEOUTwould
have killed and retried it in fifteen minutes; it was simply unreachable from
where the work had to run. The images sidecar removed that reason, and
--in-placeremoves the remaining one, so the unsupervised path is now an
explicitly-documented fallback rather than the default.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md
1.5.0 — image input and asset output
[1.5.0] — 2026-08-19
Added
- Image input. The brief command can now take
-i <file>(repeatable) to attach
screenshots, mockups, or a failing chart, and the brief template shows how to
reference the attachment from<task>. Verified against a real run: Sol reads
the image and describes its actual content. - Guidance for asset-producing briefs. Codex ships a built-in
image_gentool —
a model-side tool, invisible incodex exec --help, which is why this went
unnoticed — so a brief may ask for a raster asset and get AI-generated pixels.
Sol routes to code on its own when the visual is code-native: asked for a solid
red circle it rendered with ImageMagick and said so; asked for a painterly
title screen it usedimage_gen. Acceptance criteria for an asset cannot be a
test command, so the template shows the checkable form instead.
Changed
- Phase 3 now covers binary artifacts.
git diffreports onlyBinary files differ, so an image is reviewed by opening it and judging its content against
the brief — the review phase exists precisely so the model that produced the
artifact does not certify it, and that argument does not stop applying at the
file-format boundary.
Fixed
- Phase 2 said a silent in-flight command was backstopped by "the 30-minute
absolute cap", which 1.4.1 turned off by default.SOL_COMMAND_TIMEOUTis the
backstop now, and the text says so.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md
1.4.2 — fix the watchdog being dead on Linux
[1.4.2] — 2026-08-17
Fixed
-
The inactivity watchdog never worked on Linux.
mtime_oftried BSD
stat -f %mfirst and fell back to GNUstat -c %Y, but GNU's-fmeans
--file-system: it prints a filesystem dump and exits 0, so the fallback
never fired. The dump then reached[ "$last" -gt 0 ]as a syntax error, and
every stall check — first-event, idle, and the new command budget — was dead
on every Linux host from 1.4.0 onward. macOS was unaffected, which is why the
local suite passed while CI failed.mtime_ofnow tries GNU first and
validates the result is numeric before returning it.This mattered most on 1.4.1, which turned the absolute cap off and left Linux
workers with no watchdog at all. Linux users on 1.4.0 or 1.4.1 should upgrade. -
A unit test now asserts
mtime_ofreturns an epoch. The behavioural stall
tests only exercise the platform they run on, so a BSD-first ordering passed
every macOS run while being broken everywhere else; this asserts the contract
itself, so either platform catches a regression.
Includes 1.4.1: the absolute SOL_WORKER_TIMEOUT is off by default and silence is bounded instead.
Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md