Skip to content

Releases: ozankasikci/sol-skill

1.11.1 — live progress for backgrounded runs

Choose a tag to compare

@ozankasikci ozankasikci released this 05 Oct 18:17

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.md now has Claude start a Monitor on the watcher for every
    launch, --resume and --research.

Added

  • sol-watch.py --run <run-dir> follows a whole launcher run: every
    worker's event log, through a stall relaunch or a --resume replacing the
    log, until the launcher has written summary.json. It closes with one run:
    line per worker and exits 0 only if all ended ok or no-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/grep exit 1) is
    no longer a failed line, 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

Choose a tag to compare

@ozankasikci ozankasikci released this 05 Oct 17:55

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, and summary.json embeds the parsed result under report:
    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.patch per worker (diff_path in summary.json): everything the
    worker changed against the pre-run commit, including files it created. Review
    reads this instead of git 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 is SOL_RESEARCH_EFFORT
    (xhigh), independent of SOL_EFFORT. Needs no clean tree.
  • Failure detail in summary.json: error (last error event), stderr_tail,
    token usage, plus top-level model and mode.
  • 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 from CLAUDE.md.

Changed

  • --wait blocks 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 after SOL_WAIT_TIMEOUT (540s). The retry budget is
    counted per worker, so a takeover neither skips nor repeats a retry.
  • Model resolution. With SOL_MODEL unset the launcher follows the Codex
    config's default model when that is a Sol model, and falls back to
    gpt-6.1-sol otherwise. The model is recorded per run. check-codex.sh
    resolves it the same way.
  • SKILL.md routes corrections and research through the launcher (--resume,
    --research) and tells Claude to launch in the background. The hand-rolled
    codex exec resume --last is 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 -i arguments; 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 now ok with the commit recorded, and
    the default brief tells Sol not to commit.
  • A stalled --resume orphaned its codex process. 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

Choose a tag to compare

@ozankasikci ozankasikci released this 05 Oct 16:25

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.md and the README moved from gpt-6-sol. The README's worked example
    still shows its original gpt-5.6-sol transcript.
  • SOL_EFFORT defaults to high again, reverting the xhigh default from
    1.9.0. A stalled worker now steps down to medium. Set SOL_EFFORT=xhigh
    for algorithmically hard briefs; research mode still runs at xhigh.

1.9.0 — GPT-6 Sol, xhigh by default

Choose a tag to compare

@ozankasikci ozankasikci released this 27 Sep 17:49

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.md and the README moved from gpt-5.6-sol. The README's worked
    example keeps its original gpt-5.6-sol transcript, since that is the run
    that was actually recorded.
  • SOL_EFFORT defaults to xhigh again. The stall ladder and the
    300-second first-event budget from 1.8.1 stay, so a stalled xhigh launch
    costs at most that budget and then relaunches at high. Set
    SOL_EFFORT=high for mechanical briefs where speed matters more.

1.8.1 — high effort by default, in-place recovery fixed

Choose a tag to compare

@ozankasikci ozankasikci released this 02 Sep 19:31

[1.8.1] — 2026-09-02

Changed

  • SOL_EFFORT now defaults to high, not xhigh. 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 — an xhigh worker sat 900s without a single
    tool call, while high made its first call in 36s. With a compiler and a test
    suite in the loop, high verifies its own work, which is the property the
    effort was buying. xhigh stays 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 a high launch now
    degrades to medium on a stall.
  • SOL_FIRST_EVENT_TIMEOUT now defaults to 300 seconds, not 900. 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-place run 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 ran codex 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: an xhigh worker stalled at 900s and its high retry never ran.
    --resume failed the same way (the wrapper's cd fell straight through to
    its exit 2), and --cleanup pointed 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>/worktree at launch, next to brief, and read back
    instead of recomputed; <run-dir>/in-place marks the run itself, so --wait,
    --resume and --cleanup re-attach correctly without the caller retyping
    --in-place — which nothing in the output ever prompted for.

  • The stall relaunch and --resume now check the workspace exists before
    launching and say workspace <path> missing with the slug, rather than
    leaving codex to fail with an opaque OS error two seconds later.

  • --cleanup on 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 reached git worktree remove would 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

Choose a tag to compare

@ozankasikci ozankasikci released this 28 Aug 07:11

[1.8.0] — 2026-08-23

Added

  • SOL_SANDBOX (default workspace-write) sets the -s policy for every codex
    invocation. It exists because SOL_CODEX_CONFIG structurally cannot reach the
    sandbox mode: an explicit -s flag 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-access removes all confinement rather than one restriction.
  • SKILL.md now covers Docker specifically. Its daemon socket is a unix socket
    connect, which neither network_access nor writable_roots unblocks —
    verified, both leave docker ps at connect: 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

Choose a tag to compare

@ozankasikci ozankasikci released this 27 Aug 23:50

[1.7.0] — 2026-08-23

Added

  • SOL_CODEX_CONFIG: extra -c key=value overrides, 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 HTTP 000 without it and 200 with
    sandbox_workspace_write.network_access=true.
  • SKILL.md Sandboxed toolchains: how to recognise a repo whose build cannot
    run under workspace-write at 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, so git commit fails deterministically, not intermittently.

Full changelog: https://github.com/ozankasikci/sol-skill/blob/main/CHANGELOG.md

1.6.0 — every run under the watchdog

Choose a tag to compare

@ozankasikci ozankasikci released this 19 Aug 13:23

[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 bare codex exec
    leaves them — but supervised by the inactivity watchdog, with stall retries,
    a summary.json status 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 at xhigh with thread.started, turn.started
    and 101 bytes — silent for nearly three hours. SOL_FIRST_EVENT_TIMEOUT would
    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-place removes 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

Choose a tag to compare

@ozankasikci ozankasikci released this 19 Aug 07:31

[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_gen tool —
    a model-side tool, invisible in codex 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 used image_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 diff reports only Binary 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_TIMEOUT is 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

Choose a tag to compare

@ozankasikci ozankasikci released this 17 Aug 15:03

[1.4.2] — 2026-08-17

Fixed

  • The inactivity watchdog never worked on Linux. mtime_of tried BSD
    stat -f %m first and fell back to GNU stat -c %Y, but GNU's -f means
    --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_of now 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_of returns 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