Changelog
All notable changes to Soleur.
v3.252.1 — 2026-08-12
Plugin
/workPhase 2 exit now runs theTEST_GROUPshards the diff touches instead of the whole battery./shipPhase 4 pinned toTEST_GROUP=all, named accurately (CI is the merge gate; Phase 4 is the last local checkpoint and the sole blocking gate forapps/web-platform/infra/), withrc=4REFUSED added to its outcome enumeration.- New conditional for projects with no CI-enforced full-suite gate, so self-hosted users keep today's behaviour.
- ADR-181's counted-DECLINE class folded into the reading contract —
N/Nis no longer the ordinary local green spelling. - New guard
plugins/soleur/test/fullsuite-merge-gate.test.ts, enrolled in the suite-integrity floor. - ADR-183.
v3.252.0 — 2026-08-12
- fix(inngest): make the dedicated host's heartbeat prove :8288 instead of proving a timer fired
v3.251.0 — 2026-08-12
Registry host
- Ship
zotcontainer logs offsoleur-registryto Better Stack Logs via a 5-minute cron one-shot, with a self-persisted journald cursor, fail-closed credential-header redaction, a rate cap that advances the cursor on decided rows, and a four-reason drop taxonomy. - Raise the crash-class cap exemption to cover
panic:,fatal error,runtime errorand[signal, and dropRuntimeMaxUse=64Mfrom the journald drop-in.
Architecture
- ADR-184 — the shipper: cron-vs-daemon reversibility argument and the cursor
DELIVEREDsemantics. - ADR-185 — registry
user_dataheadroom policy: 8,000 B, single-sourced from the TS budget constant instead of a transcribed one-shot literal.
Tests
zot-log-shipper.test.shandtest-zot-log-channel-probe.shrebuilt on record-derived counters, a harness canary, and anEXIT-trap floor; new adversarial and non-vacuity fixtures.
v3.250.1 — 2026-08-12
- git-data's cloud-init template is now comment-stripped at render time,
recovering ~30.5 kB of the 32,768 B Hetzner
user_datacap - The strip's magnitude and its application are both pinned by guards that mutation testing proves can fail
- The infra schema gate validates the document a host actually boots from, and fails closed when it cannot resolve the render wrap
Refs #7264. Found and filed: #7485, #7501. Split out: #7481. Deferred: #7460.
v3.250.0 — 2026-08-12
Plugin
- Install now uses a dedicated marketplace.
claude plugin marketplace add jikig-ai/soleur-marketplacethenclaude plugin install soleur@soleur-marketplace. Installs the plugin subtree only (~10 MiB) instead of cloning the whole repository. - Updates work again. Neither manifest carries a
versionkey, so the CLI keys updates on the source commit SHA. - The monorepo marketplace still works and is retained; it is demoted behind a disclosure that names the timeout, with
--sparse .claude-plugin pluginsas the mitigation (78 s at the default timeout, against 329 s plain). - Removed a documented install command that does not exist:
claude plugin install --url …returnsunknown option '--url'on CLI 2.1.227. Both READMEs had documented it. - Migration guidance for existing installs, including the orphaned-cache reclaim (~9.6 MiB survives
uninstall+marketplace remove, with no CLI verb to reclaim it). - The changelog FAQ no longer claims updates are automatic — false before this change and false after.
Web Platform
- Sentry cron monitor for the new drift check, so a schedule that stops firing is itself detectable.
Infra / CI
jikig-ai/soleur-marketplaceadopted into the existinginfra/github/Terraform root via an idempotent first-apply import.scheduled-marketplace-drift.yml— daily, unauthenticated, the sole control on a repo with no CI, no review and no CODEOWNERS.
v3.249.3 — 2026-08-12
Plugin
/soleur:syncand/soleur:gonow presence-guard every anchored producer invocation, emitting a named marker instead of dying on an unattributed interpreter error.- The producer-missing message tells the operator what happened, that it is not their project, exactly which commands to run, what to do if those do not clear it, and what still succeeded — with a separate headless variant.
## Updatingdocumentation added: updating the marketplace does not update an installed plugin, and the frozen0.0.0-devversion sentinel means evenplugin updatemay not converge a stale install.- ADR-179 amended with Decision 7 (producer presence as a fourth precondition), recording that the guard is co-located rather than fail-closed-in-isolation, and why that trade is deliberate.
Web Platform
WEDGE_REnow discriminates onsource=probe-unreachable, so a probe that could not run is mirrored but not paged as a git wedge.
v3.249.2 — 2026-08-12
- fix(legal): eleven legal-corpus defects — dead guards, contradictions, and published-mirror under-disclosure
web-v0.253.0 — 2026-08-12
- fix(inngest): make the dedicated host's heartbeat prove :8288 instead of proving a timer fired
web-v0.252.0 — 2026-08-12
Registry host
- Ship
zotcontainer logs offsoleur-registryto Better Stack Logs via a 5-minute cron one-shot, with a self-persisted journald cursor, fail-closed credential-header redaction, a rate cap that advances the cursor on decided rows, and a four-reason drop taxonomy. - Raise the crash-class cap exemption to cover
panic:,fatal error,runtime errorand[signal, and dropRuntimeMaxUse=64Mfrom the journald drop-in.
Architecture
- ADR-184 — the shipper: cron-vs-daemon reversibility argument and the cursor
DELIVEREDsemantics. - ADR-185 — registry
user_dataheadroom policy: 8,000 B, single-sourced from the TS budget constant instead of a transcribed one-shot literal.
Tests
zot-log-shipper.test.shandtest-zot-log-channel-probe.shrebuilt on record-derived counters, a harness canary, and anEXIT-trap floor; new adversarial and non-vacuity fixtures.
web-v0.251.1 — 2026-08-12
- git-data's cloud-init template is now comment-stripped at render time,
recovering ~30.5 kB of the 32,768 B Hetzner
user_datacap - The strip's magnitude and its application are both pinned by guards that mutation testing proves can fail
- The infra schema gate validates the document a host actually boots from, and fails closed when it cannot resolve the render wrap
Refs #7264. Found and filed: #7485, #7501. Split out: #7481. Deferred: #7460.
web-v0.251.0 — 2026-08-12
Plugin
- Install now uses a dedicated marketplace.
claude plugin marketplace add jikig-ai/soleur-marketplacethenclaude plugin install soleur@soleur-marketplace. Installs the plugin subtree only (~10 MiB) instead of cloning the whole repository. - Updates work again. Neither manifest carries a
versionkey, so the CLI keys updates on the source commit SHA. - The monorepo marketplace still works and is retained; it is demoted behind a disclosure that names the timeout, with
--sparse .claude-plugin pluginsas the mitigation (78 s at the default timeout, against 329 s plain). - Removed a documented install command that does not exist:
claude plugin install --url …returnsunknown option '--url'on CLI 2.1.227. Both READMEs had documented it. - Migration guidance for existing installs, including the orphaned-cache reclaim (~9.6 MiB survives
uninstall+marketplace remove, with no CLI verb to reclaim it). - The changelog FAQ no longer claims updates are automatic — false before this change and false after.
Web Platform
- Sentry cron monitor for the new drift check, so a schedule that stops firing is itself detectable.
Infra / CI
jikig-ai/soleur-marketplaceadopted into the existinginfra/github/Terraform root via an idempotent first-apply import.scheduled-marketplace-drift.yml— daily, unauthenticated, the sole control on a repo with no CI, no review and no CODEOWNERS.
web-v0.250.3 — 2026-08-12
Plugin
/soleur:syncand/soleur:gonow presence-guard every anchored producer invocation, emitting a named marker instead of dying on an unattributed interpreter error.- The producer-missing message tells the operator what happened, that it is not their project, exactly which commands to run, what to do if those do not clear it, and what still succeeded — with a separate headless variant.
## Updatingdocumentation added: updating the marketplace does not update an installed plugin, and the frozen0.0.0-devversion sentinel means evenplugin updatemay not converge a stale install.- ADR-179 amended with Decision 7 (producer presence as a fourth precondition), recording that the guard is co-located rather than fail-closed-in-isolation, and why that trade is deliberate.
Web Platform
WEDGE_REnow discriminates onsource=probe-unreachable, so a probe that could not run is mirrored but not paged as a git wedge.
web-v0.250.2 — 2026-08-12
- fix(legal): eleven legal-corpus defects — dead guards, contradictions, and published-mirror under-disclosure
v3.249.1 — 2026-08-11
Test runner
scripts/test-all.sh: suites can now be declined; declines are counted, named, and printed with a re-run command, and excluded from the pass numerator. Refuses a full-gate run underSOLEUR_SUBAGENT=1(rc 4). Rename-aware diff detection (--name-status -M, so a rename SOURCE is visible). Exit-contract block updated.scripts/lib/test-relevance-paths.sh(new): the declared path predicates, as data.scripts/lib/test-contention.sh: addstc_used_bytes, a per-mount used-bytes probe.scripts/lint-orphan-test-suites.sh: anti-rot checks over the predicate arrays.
Ship pipeline
scripts/ship-incident-pir-gate.sh: boundary-guardprodandliveinPROD_RE.
Docs and rules
- ADR-181 (new), ADR-133 addendum, ADR-177 addendum.
cq-ac-must-not-depend-on-concurrent-sessions+plan-reviewstanding check.- Routed learnings into
work,review, andarchitectureskills.
v3.249.0 — 2026-08-11
Plugin — skills
/plan— new §2.12 Guard Contract Gate. When a deliverable includes a guard, gate, lint, drift-check or anti-vacuity control, the plan must declare per guard: (1) the property in one sentence, (2) the ASSEMBLY the property quantifies over — every code path, array, or file that contributes a member, and (3) a mutation matrix of ≥3 edits that must go RED. Members drift; assembly is structural. Field (2) is the one whose absence cost the five rounds./plantemplates — a## Guard Contractsection at all three detail levels inplan-issue-templates.md./deepen-plan— new §4.11 Guard Contract Halt, conditional on a guard-shaped plan: halts when a guard entry carries a placeholder assembly or a matrix with fewer than three rows./work— fix the CLASS, not the INSTANCE. When a finding says "X can be added at site A", enumerate all sites {A,B,C} before writing the fix. The mutation protocol validates a fix; it never tells you the fix's scope is right./review— a structural-enumeration seat for guard-shaped PRs ("enumerate every path by which a mount / token / write reaches the sink") in place of N adversarial seats each finding one instance; plus a closure-assertion bullet and a fixture-cardinality bullet./compound,/archive-kb— pointers recording that KB archival renames no longer need asecret-scan-allow-renamelabel.
New mechanical guards
scripts/lint-guard-contract.py— validates## Guard Contractsections: per guard entry, a non-placeholder assembly and a ≥3-row mutation matrix. 28/28, 7 mutation seams.scripts/lint-window-closure-assertion.py— a closure assertion (toEqual([…])) fed by a regex-extracted window helper must carry a per-helper// window-assembly: <name> — <justification>declaration. 24/24, 4 seams.scripts/rename-guard.test.sh— first-ever coverage forrename-guard.sh. 17/17, 5 seams.
Both new lints are wired into scripts/test-all.sh and both declare their residual limits in their docstrings rather than implying coverage they do not have.
Security
apps/web-platform/scripts/rename-guard.sh— the allowlist→allowlist rename exemption, corrected from a boolean test to a scope-subset test, plus five closed evasions and fail-closed behaviour on an empty parser result.
Architecture
- ADR-180 — Guard Contract as a plan-time deliverable.
v3.248.12 — 2026-08-11
/soleur:syncnow runs on a customer repo for every area whose producer ships in the plugin payload, and refuses with a named reason instead of silently executing a same-named file from the customer's own tree for the one area that cannot.
v3.248.11 — 2026-08-11
Plugin
- Fixed: the session-state lock/lease library is now reachable from marketplace installs. It ships at
plugins/soleur/scripts/lib/session-state.shand resolves plugin-root-relative, socreateacquires leases andcleanup-mergedcan reap on an installed user's machine for the first time. - Fixed:
ship,merge-pr,product-roadmapandscheduleno longer wedge on a host withoutflock(1)— that case previously reported ">600s contention" on an uncontended lock and exited 1, forever. - Fixed:
pre-merge-rebase.shno longer mis-extracts the PR number when a command contains more than onegh pr merge <number>, which made the review-evidence gate deny PRs that had evidence. - Fixed: the manual-lease snippet in
git-worktreedocumented the branch as the lease key; the reaper keys on the worktree directory slug, so a slash-bearing branch wrote no lease and said so only in a log file no agent reads. - Added: a one-time dry pass the first time
cleanup-mergedcan reap on a given store, so arming the reaper and exercising it are no longer the same event. - Added:
SOLEUR_WORKTREE_LEASE_LIB_OK(success signal, terminal-only) andSOLEUR_SESSION_STATE_UNAVAILABLE(mirrored; paged only atreason=worktree-UNLEASED-and-reapable). - Added: ADR-178, recording where shared bash primitives live and how each consumer class resolves them.
- Coverage: two suites that had never gated CI now run —
session-state.test.sh(34 KB, orphaned because shell globs do not cross/) and.claude/hooks/lib/freeze-lock.test.sh. Repo-wide, zero orphans remain in that class.
Web Platform
SOLEUR_SESSION_STATE_UNAVAILABLEandSOLEUR_WORKTREE_REAPER_ARMEDare mirrored by the git-lock marker telemetry, and its drift guard now derivesSKILL.mdfrom the skills directory — aSOLEUR_*sentinel authored in agent-executed prose was previously invisible to it forever.- That widening is scoped to this telemetry's own domains (
SOLEUR_GIT_/SOLEUR_WORKTREE_/SOLEUR_SESSION_STATE_). Unscoped, it demandedSOLEUR_PREFLIGHT_CHECK10_NOSANDBOX— preflight's sandbox diagnostic, landed by a sibling PR — be registered as a git-lock marker, which would have pressured the next author to mirror a foreign marker into telemetry nobody asked for just to get an unrelated PR green. The.shhalf keeps its unscoped collection. Because a prefix filter can silently reduce the widening to a no-op and reopen the blindness while staying green, the SKILL.md scan is asserted non-empty; both directions are mutation-proven.
v3.248.10 — 2026-08-11
Test runner
- Third result class
[KILLED]for signal-shaped suite exits; excluded from the failure count, named in a summary breakdown, surfaced as exit 3. run_suitenow captures the suite exit code instead of testing it.- Fail-closed handling for an unrecognized or aborting classifier: counted FAILED and warned, never silently passed.
- Declared wall-clock budgets, reported on the
[KILLED]line.
Contention probe
SIBLING_SUITE_DETECTEDbanner for worktrees running an individual suite.SIBLING_RUN_DETECTEDsemantics are byte-unchanged.- Single
/procwalk with ancestry/pgid cancellation, replacing a cwd set-difference that miscounted three measured ways.
Consumers
main-health-monitor.yml: a killed run now names the terminated suite in the issue body, gets its own title/lede, per-armActions requiredthat no longer prescribes a revert, and retitles + re-emits actions when commenting on an existing tracker.grok-pre-push-gate.sh: renders[UNRESOLVED]for exit 3 and forwards it, still non-zero.work/test-fix-loop/one-shotskills: taught that a killed suite is unresolved, not fixed. Thetest-fix-loopchange is the sharpest — a suite that FAILED in iteration N and is KILLED in N+1 lowered the parsed count, which read as improvement, and the rebound in N+2 read as a regression triggeringgit reset --hard HEADover real fixes.- ADR-177 records the taxonomy, the 0/1/3 contract, and two real limits: exit 3 is top-level-only, and three wrappers absorb the signal shape so an OOM of the webplat vitest process still surfaces as
[FAIL](tracked as #7429).
v3.248.9 — 2026-08-11
- fix(security): follow-through verdicts must come from a repo member, not any GitHub user
v3.248.8 — 2026-08-11
Plugin
plan: new pre-research phases0.6b(mechanism minimality) and0.6c(value-proposition measurement); Phase 1.7 now persists the Property List and Cut List into## Research Insights.plan-review: the simplicity reviewer is prompted per mechanism against a requirement, not asked whether the plan is good.review: newdesign-risksignal on the Change Classification Gate that orders the panel (never shrinks it) with mandatory lens dedup; instrument-verification rule generalized to known-positive + known-negative.code-simplicity-reviewer:plan-reviewcarve-out so### Goal Verificationruns instead of rendering N/A.test-design-reviewer: new "Auditing a Mutation Battery" section pointing at the canonical axis catalogue.
v3.248.7 — 2026-08-11
Infra test harness
run-registered-suites.shcaptures per-suite output and prints a bounded, marker-anchored excerpt on RED withrc, elapsed and start offset.- Closes a false green:
PASS + REDmust equal the derived suite count; vanished suites are namedUNACCOUNTEDand their output dumped. - Log dirs are reaped from the EXIT trap plus an age-reap of older siblings (ADR-133's reaper scopes to
/tmp; this runner uses/var/tmp). - New
SOLEUR_INFRA_DIR/INFRA_ORPHAN_LISTtest seams so fixtures never touch the live tree. credential-persist-home-guard.test.shdiffs against a frozen snapshot instead of the live source.
CI
main-health-monitor.ymlfilters the diagnostic sentinel out of the public issue body, widens its anchor to name vanished suites, points the operator at the run log, and widens the redaction set.deploy-script-teststimeout re-derived 12 → 14 min (suite 3s → 67s).
Docs
- ADR-133 records two departures: this instrument is not observe-only (186 files/run), making it a confound for the very capacity hypothesis it measures; and the ships-ahead ordering was departed from while honouring the property that rule protects.
web-v0.250.1 — 2026-08-11
Test runner
scripts/test-all.sh: suites can now be declined; declines are counted, named, and printed with a re-run command, and excluded from the pass numerator. Refuses a full-gate run underSOLEUR_SUBAGENT=1(rc 4). Rename-aware diff detection (--name-status -M, so a rename SOURCE is visible). Exit-contract block updated.scripts/lib/test-relevance-paths.sh(new): the declared path predicates, as data.scripts/lib/test-contention.sh: addstc_used_bytes, a per-mount used-bytes probe.scripts/lint-orphan-test-suites.sh: anti-rot checks over the predicate arrays.
Ship pipeline
scripts/ship-incident-pir-gate.sh: boundary-guardprodandliveinPROD_RE.
Docs and rules
- ADR-181 (new), ADR-133 addendum, ADR-177 addendum.
cq-ac-must-not-depend-on-concurrent-sessions+plan-reviewstanding check.- Routed learnings into
work,review, andarchitectureskills.
web-v0.250.0 — 2026-08-11
Infrastructure
- zot registry image pinned to v2.1.20 per arch, with an explicit version tag
- new
zot-image-staleness.test.sh— 15 offline assertions, exit 0/10/2, anti-vacuity floor + positive control - new
zot-image-staleness-mutation.test.sh— 18 mutations, expected-rc + marker asserted, registered in CI - new
registry-userdata-budget.sh— offlinetemplatefile()/base64gzip()byte measurement, no credentials - new
zot-image.provenance.md— config-compat analysis, non-adoption decisions, previous-known-good pin, bump procedure zot_image_digestadded to theSOLEUR_ZOT_DISKheartbeat via the existingdocker inspect
CI
rule-audit.yml: upstream release poll + digest↔repository probe, one idempotentaction-requiredissueinfra-validation.yml: staleness gate, mutation battery, and a warn-only byte-budget jobrenovate.json5removed
Docs
- ADR-096 "Pin freshness" amendment;
projectZotadded to the C4 model with its trust boundary zotRegistrycorrected fromcx33/7168mtocx23/derived3072m
web-v0.249.9 — 2026-08-11
- fix(security): follow-through verdicts must come from a repo member, not any GitHub user
web-v0.249.8 — 2026-08-11
Plugin
plan: new pre-research phases0.6b(mechanism minimality) and0.6c(value-proposition measurement); Phase 1.7 now persists the Property List and Cut List into## Research Insights.plan-review: the simplicity reviewer is prompted per mechanism against a requirement, not asked whether the plan is good.review: newdesign-risksignal on the Change Classification Gate that orders the panel (never shrinks it) with mandatory lens dedup; instrument-verification rule generalized to known-positive + known-negative.code-simplicity-reviewer:plan-reviewcarve-out so### Goal Verificationruns instead of rendering N/A.test-design-reviewer: new "Auditing a Mutation Battery" section pointing at the canonical axis catalogue.
web-v0.249.7 — 2026-08-11
Infra test harness
run-registered-suites.shcaptures per-suite output and prints a bounded, marker-anchored excerpt on RED withrc, elapsed and start offset.- Closes a false green:
PASS + REDmust equal the derived suite count; vanished suites are namedUNACCOUNTEDand their output dumped. - Log dirs are reaped from the EXIT trap plus an age-reap of older siblings (ADR-133's reaper scopes to
/tmp; this runner uses/var/tmp). - New
SOLEUR_INFRA_DIR/INFRA_ORPHAN_LISTtest seams so fixtures never touch the live tree. credential-persist-home-guard.test.shdiffs against a frozen snapshot instead of the live source.
CI
main-health-monitor.ymlfilters the diagnostic sentinel out of the public issue body, widens its anchor to name vanished suites, points the operator at the run log, and widens the redaction set.deploy-script-teststimeout re-derived 12 → 14 min (suite 3s → 67s).
Docs
- ADR-133 records two departures: this instrument is not observe-only (186 files/run), making it a confound for the very capacity hypothesis it measures; and the ships-ahead ordering was departed from while honouring the property that rule protects.
web-v0.249.12 — 2026-08-11
/soleur:syncnow runs on a customer repo for every area whose producer ships in the plugin payload, and refuses with a named reason instead of silently executing a same-named file from the customer's own tree for the one area that cannot.
web-v0.249.11 — 2026-08-11
Plugin
- Fixed: the session-state lock/lease library is now reachable from marketplace installs. It ships at
plugins/soleur/scripts/lib/session-state.shand resolves plugin-root-relative, socreateacquires leases andcleanup-mergedcan reap on an installed user's machine for the first time. - Fixed:
ship,merge-pr,product-roadmapandscheduleno longer wedge on a host withoutflock(1)— that case previously reported ">600s contention" on an uncontended lock and exited 1, forever. - Fixed:
pre-merge-rebase.shno longer mis-extracts the PR number when a command contains more than onegh pr merge <number>, which made the review-evidence gate deny PRs that had evidence. - Fixed: the manual-lease snippet in
git-worktreedocumented the branch as the lease key; the reaper keys on the worktree directory slug, so a slash-bearing branch wrote no lease and said so only in a log file no agent reads. - Added: a one-time dry pass the first time
cleanup-mergedcan reap on a given store, so arming the reaper and exercising it are no longer the same event. - Added:
SOLEUR_WORKTREE_LEASE_LIB_OK(success signal, terminal-only) andSOLEUR_SESSION_STATE_UNAVAILABLE(mirrored; paged only atreason=worktree-UNLEASED-and-reapable). - Added: ADR-178, recording where shared bash primitives live and how each consumer class resolves them.
- Coverage: two suites that had never gated CI now run —
session-state.test.sh(34 KB, orphaned because shell globs do not cross/) and.claude/hooks/lib/freeze-lock.test.sh. Repo-wide, zero orphans remain in that class.
Web Platform
SOLEUR_SESSION_STATE_UNAVAILABLEandSOLEUR_WORKTREE_REAPER_ARMEDare mirrored by the git-lock marker telemetry, and its drift guard now derivesSKILL.mdfrom the skills directory — aSOLEUR_*sentinel authored in agent-executed prose was previously invisible to it forever.- That widening is scoped to this telemetry's own domains (
SOLEUR_GIT_/SOLEUR_WORKTREE_/SOLEUR_SESSION_STATE_). Unscoped, it demandedSOLEUR_PREFLIGHT_CHECK10_NOSANDBOX— preflight's sandbox diagnostic, landed by a sibling PR — be registered as a git-lock marker, which would have pressured the next author to mirror a foreign marker into telemetry nobody asked for just to get an unrelated PR green. The.shhalf keeps its unscoped collection. Because a prefix filter can silently reduce the widening to a no-op and reopen the blindness while staying green, the SKILL.md scan is asserted non-empty; both directions are mutation-proven.
web-v0.249.10 — 2026-08-11
Test runner
- Third result class
[KILLED]for signal-shaped suite exits; excluded from the failure count, named in a summary breakdown, surfaced as exit 3. run_suitenow captures the suite exit code instead of testing it.- Fail-closed handling for an unrecognized or aborting classifier: counted FAILED and warned, never silently passed.
- Declared wall-clock budgets, reported on the
[KILLED]line.
Contention probe
SIBLING_SUITE_DETECTEDbanner for worktrees running an individual suite.SIBLING_RUN_DETECTEDsemantics are byte-unchanged.- Single
/procwalk with ancestry/pgid cancellation, replacing a cwd set-difference that miscounted three measured ways.
Consumers
main-health-monitor.yml: a killed run now names the terminated suite in the issue body, gets its own title/lede, per-armActions requiredthat no longer prescribes a revert, and retitles + re-emits actions when commenting on an existing tracker.grok-pre-push-gate.sh: renders[UNRESOLVED]for exit 3 and forwards it, still non-zero.work/test-fix-loop/one-shotskills: taught that a killed suite is unresolved, not fixed. Thetest-fix-loopchange is the sharpest — a suite that FAILED in iteration N and is KILLED in N+1 lowered the parsed count, which read as improvement, and the rebound in N+2 read as a regression triggeringgit reset --hard HEADover real fixes.- ADR-177 records the taxonomy, the 0/1/3 contract, and two real limits: exit 3 is top-level-only, and three wrappers absorb the signal shape so an OOM of the webplat vitest process still surfaces as
[FAIL](tracked as #7429).
v3.248.6 — 2026-08-10
Plugin
plan: new Phase 0.7 writes a skeleton plan file before the Phase 1 research fan-out; Phase 1.7 persists## Research Insightsin a single Edit; an interrupted run is continued in place rather than duplicated or overwritten.plan: filename derivation moves out of Step 2 into Phase 0.7 (one derivation site, before research). Save Tasks now stages the exact plan path with a:?guard instead of theplans/directory.one-shot: plan-artifact recovery selects by frontmatterbranch:(bounded, non-recursive,plans/archive/excluded by construction) and branches on a single content predicate. Recovery runs at most once, then files anaction-requiredissue.plan-issue-templates.md: documents the two-stage frontmatter lifecycle and drops thelane:pre-seeding that contradictedplan's own rule.- Corrects a stale skill-description budget across
brainstorm,plan,review,skill-creator,AGENTS.rules.md(injected into every session) andplugins/soleur/AGENTS.md: all asserted 1800 against a real cap of 2400. Each now namesSKILL_DESCRIPTION_WORD_BUDGETrather than a literal. Also restores the correct ~2,500 agent-description figure that the first pass wrongly deleted. - ADR-175 records the decision, including why the cursor was rejected.
Common Questions
Frequently Asked Questions
How often is Soleur updated?
Soleur ships continuously — updates are released when ready and tagged with semantic versioning. There is no fixed release schedule. Changes range from new agents and skills to bug fixes and documentation improvements.
How do I upgrade Soleur?
Run claude plugin update soleur@soleur-marketplace, then restart Claude Code — plugin changes apply on restart, so the update is not picked up until you do. If you installed with --scope project or --scope local, pass the same scope. Check the changelog or GitHub releases page for details on what changed.
Does Soleur use semantic versioning?
Yes. Soleur follows semantic versioning — major versions for breaking changes, minor versions for new agents or skills, and patch versions for bug fixes and documentation updates. Version labels are set during PR review and applied automatically at merge.