Repository navigation
Releases: GabrielCpp/stablemate
Releases · GabrielCpp/stablemate
Release list
workhorse-workflows: v2.0.0
2.0.0 (2026-09-11)
⚠ BREAKING CHANGES
- workflows: the
qa_stack_manifestparam is gone; a run in flight holding it fails to reload.
Features
- ostler: derive owning keys from the registry (1f402e1)
- ostler: doctor checks for the judgment gap (b965a1b)
- ostler: let a config: bullet own a declared configuration file (d87ad6f)
- ostler: map diffs across source repositories (dea798f)
- ostler: resolve stories by external key (51da445)
- ostler: template-outside-repeat doctor check (f6bff33)
- ostler: trim rows, import-graph walk, repo declaration (7a99e80)
- ostler: unspecified bullet class with grounded citation (7b1a64f)
- workflows: adjudicate a blocked finding before the operator gate (9d198e6)
- workflows: answer audit packets from the verdict memo first (06f21c2)
- workflows: author approved roadmaps (3f22692)
- workflows: bound the audit reviewer's provider retries (df74b25)
- workflows: budget the behavior audit in turns and passes (84ca19f)
- workflows: build OKF docs from story source diffs (f236b42)
- workflows: carry book limitations into the audit packets (229cb94)
- workflows: carry the minted story id in commit trailers (4e18027)
- workflows: coder docs lane scopes worklist builder to story paths (8365629)
- workflows: commit completed OKF books (074e531)
- workflows: derive the implementer's standards from the layer (f5284ea)
- workflows: flatten author into resumable stages (dfc77c9)
- workflows: gate the okf-builder commit on a semantic audit (ca89211)
- workflows: give the research loop program-level judgement (0d17f92)
- workflows: hold the docs prompts to the written OKF model (9c19533)
- workflows: make the builder's verdict see drift, not just coverage (b04ba58)
- workflows: map coder stories across source repositories (e18ce1d)
- workflows: move the research measurement out of the agent turn (1c17318)
- workflows: okf-builder authors the judgment layer (30446b0)
- workflows: okf-builder drops the entry fork; rescan is the seeder (1357482)
- workflows: park a stalled book on the operator gate, not a waiver (4ed8c25)
- workflows: queue undocumented source files as behavior repairs (0e5b729)
- workflows: read the QA stack from the book, not a manifest path (992079f)
- workflows: record what a converged book was written against (24dc214)
- workflows: refuel okf-builder's budget as each item closes (9e86087)
- workflows: route difficult okf repairs to high power (127182d)
- workflows: scaffold the machine envelope into program.yml (eac1227)
- workflows: scope okf-builder backfills to the squashed diff (ab66208)
- workflows: seed the code fixes the book cannot make (5dace48)
- workflows: separate story scope from qa invariants (9063307)
- workflows: settle stale repair rows during the drain (89ac0bc)
- workflows: state audit links once on the claim (c094de8)
- workflows: suffix coder commits with story ids (1ca3823)
- workflows: teach audit reviewer to use mixed candidate status (f0bcd8a)
- workflows: teach okf-builder the one-per repeat grammar (19a63c4)
- workflows: worklist builder composes four joins into one answer (96896a9)
- workhorse: arm the wake file before a watcher parks on it (ae808c2)
- workhorse: let an Await say a machine owes it the answer (b3e33ec)
Bug Fixes
- ostler: teach the relation-subject slug shape at every surface (a2d3511)
- workflows: accept farrier's repo-prefixed ostler-okf install (f9977b9)
- workflows: address a group finding as the group it is about (64887dc)
- workflows: approve author splits before stories (00f1eba)
- workflows: audit emits per-packet labels (fc174fd)
- workflows: audit recovers from a null-ctx resume (6b0933f)
- workflows: audit survives a sustained models.dev outage (60a664e)
- workflows: author current fix-story sections (aaae440)
- workflows: clear the two type findings in the dossier node (31c01b1)
- workflows: close repair rows whose finding stopped firing (065dc33)
- workflows: collect a result where the command could write it (8756cd8)
- workflows: derive adjudication prompt contract (46eb700)
- workflows: drain drifted okf books via registry-rendered prompts (5bdcba9)
- workflows: emit review findings in the shape the router reads ([1845e5...
workhorse-agent: v3.0.0
3.0.0 (2026-09-11)
⚠ BREAKING CHANGES
- core: bump stablemate config schema to v2
Features
- capture full opencode session transcripts (e03d1bd)
- core: let a power tier scale every wall-clock budget (50b5081)
- core: persist a nested config table, and groom's attend settings (3c51cca)
- workhorse: arm the wake file before a watcher parks on it (ae808c2)
- workhorse: bound transient provider retries per agent node (22a0330)
- workhorse: control answer and questions subcommands (089772b)
- workhorse: draw a Done as an edge to END, never as a green state (d18d588)
- workhorse: draw a handoff as a coloured step, not a cross edge (89aadb8)
- workhorse: draw a state as the chain of steps it runs (44ee85f)
- workhorse: let a registry declare its own package (a1c17b4)
- workhorse: let a transition say why, and print it on the edge (bed8d77)
- workhorse: let an Await say a machine owes it the answer (b3e33ec)
- workhorse: questions and answer verbs on the control channel (0debb61)
- workhorse: re-attempt a capped turn every probe interval (4ac6481)
- workhorse: refill the transition budget on forward progress (780e06c)
- workhorse: resolve control --run through groom on a local miss (279b6a3)
- workhorse: resume re-arms a parked operator wait (cbe7c58)
- workhorse: run a measurement detached under a bounded supervisor (3c0cb8c)
- workhorse: stamp repository scopes on telemetry (0e77048)
- workhorse: the operator await answers over the socket (c5eff11)
Bug Fixes
- workflows: audit survives a sustained models.dev outage (60a664e)
- workhorse: accept the type package actually has (0e5e3f1)
- workhorse: add skill_path_ref so prompts cite installed skill files (f65ff19)
- workhorse: apply the tier's clock scale, and make the env var work (c697fed)
- workhorse: deliver large prompts outside argv (2814b02)
- workhorse: find the reloaded registry in its composition root (6df4629)
- workhorse: keep a handoff's START in its flow, colour END apart (eb00514)
- workhorse: lift opencode's 32k output cap to the model's own limit (ecb2545)
- workhorse: match an opencode store lock by class, not statement (4348c57)
- workhorse: name every spent agent turn, not just the timeout (3dae471)
- workhorse: pin opencode's title helper to the turn's model (1786e93)
- workhorse: promote settled opencode exports (8322375)
- workhorse: reassemble a control message across packets (13c34de)
- workhorse: reread partial opencode session exports (10aef37)
- workhorse: retry opencode project-store contention (4a35507)
- workhorse: route an exhausted output budget to compaction (ab094a5)
- workhorse: stamp previous-process death on resume for groom (8a87d6e)
- workhorse: stop a machine wait asking for an answer nobody owes (2d75da8)
- workhorse: survive long agent CLI replacement gaps (a6607f7)
- workhorse: treat a session id as an opaque string (7a0c66b)
- workhorse: treat opencode's session-store write race as transient (133dd06)
Performance Improvements
Code Refactoring
- core: bump stablemate config schema to v2 (586d593)
- core: move the clock port into shared plumbing (fa5a4f5)
- ostler: own the durable QA stack, hard-cut workhorse.stack (6191e5d)
- rename the top power tiers to max and ultra (66a017d)
- workflows: drop the coder lanes' session_id parameter (8db22d9)
- workhorse: answer the findings basedpyright reports (9dba9dd)
- workhorse: inline one-use private helpers (25c578c)
- workhorse: share the control and inbox run-target resolver (f8026d7)
saddlebag: v1.1.0
ostler: v2.0.0
2.0.0 (2026-09-11)
⚠ BREAKING CHANGES
- core: bump stablemate config schema to v2
- ostler:
ostler.waivers,Okf.add_doctor_waiver, thewaivedfield on doctor findings and thewaiversepoch input are gone; adocs/doctor-waivers.jsonfile is no longer read. Coverage waivers (coverage --waivers) are a different concern and stay.
Features
- core: let a power tier scale every wall-clock budget (50b5081)
- core: persist a nested config table, and groom's attend settings (3c51cca)
- ostler: add known-defect, a code-fault record with two exits (8654c88)
- ostler: add story-for-node query over code-ref trailers (9f89954)
- ostler: admit mixed candidate status for internal-and-relevant (b3e6d18)
- ostler: advance one file's watermark without rewriting the catalog (9ceae73)
- ostler: ask one question about what a book owes its code (8c9d53b)
- ostler: audit tier-1 candidates by default (6ed3e36)
- ostler: autofix a null equals into an absent check (d97e6aa)
- ostler: autofix drifted verify: test citations into tests: (51b83cd)
- ostler: carry a story-conflict finding for the operator gate (cb894a6)
- ostler: classify seed visual design (b582ed2)
- ostler: classify story acceptance criteria (1496a39)
- ostler: compile repeated families into qa obligations and plans (111a749)
- ostler: concept judgment keys — rule:, prefers:, deprecates: (bba5372)
- ostler: declare detail: on every implementation-bearing node type (c09a13d)
- ostler: delete the doctor waiver register (7f427d6)
- ostler: derive candidate links instead of echoing them in verdicts (188c7cd)
- ostler: derive owning keys from the registry (1f402e1)
- ostler: doctor checks for the judgment gap (b965a1b)
- ostler: exempt field nodes from undeclared-obligation (df451fc)
- ostler: extract PHP behavior candidates (1174c85)
- ostler: extract TypeScript and TSX behavior candidates (fb73043)
- ostler: give every declaration a content watermark (9368d3c)
- ostler: identify stories in QA context packets (ec654da)
- ostler: judgment and unspecified reach the qa context packet (ed75eee)
- ostler: key spec dirs and story identity by the minted id (14664ea)
- ostler: let a config: bullet own a declared configuration file (d87ad6f)
- ostler: let a surface declare itself not exercised (a7af68a)
- ostler: map diffs across source repositories (dea798f)
- ostler: memoize behavior verdicts in the index (d762fb3)
- ostler: migrate legacy stories on demand (c46c914)
- ostler: name the port holder when a stack bring-up fails (cd0b008)
- ostler: parse the one-per repeat grammar for generated elements (3a08fbb)
- ostler: place each step in the recording and pull its frames (2742846)
- ostler: prepare two-way behavior audit packets (efcdcbe)
- ostler: query story and OKF provenance (43e3d6e)
- ostler: read the qa stack from the book's ops nodes (ff0a324)
- ostler: record owned stack processes and reap them across runs (c9da94d)
- ostler: report duplicate-bullet instead of a locator collision (6dd7acc)
- ostler: report uncited exported files without building a packet (ed273e0)
- ostler: resolve stories by external key (51da445)
- ostler: salvage the verdicts a short reply did answer (ed807b1)
- ostler: seed reachability from the surface's root screen (4cdcb34)
- ostler: template-outside-repeat doctor check (f6bff33)
- ostler: trim audit packets to their scope and claim window (4a2abd3)
- ostler: trim rows, import-graph walk, repo declaration (7a99e80)
- ostler: unspecified bullet class with grounded citation (7b1a64f)
- ostler: verify source context freshness (e6cf1d8)
- ostler: warn unminted-claim on a claim no obligation carries (ce6bc00)
- ostler: watermark the whole book, not only its cross-repo refs (77b8049)
Bug Fixes
- ostler: adopted stacks must still pass seed and health gates (1f444c7)
- ostler: bound extract recursion and read text off the source (190495e)
- ostler: brief step failures with the exit code and stdout tail (fb58684)
- ostler: competing-implementations needs a shared symbol (592b33b)
- ostler: competing-implementations skips parts of one declared whole (dafc9e5)
- ostler: exempt a verb alternation from unstated-precondition (a42ea79)
- ostler: film a viewport recording at the viewport (0a70a5c)
- ostler: film the app under test, not the operator's desktop ([77852d1](https://...
groom: v1.2.0
1.2.0 (2026-09-11)
Features
- capture full opencode session transcripts (e03d1bd)
- groom: answer and discover gates over the run socket (7a24f15)
- groom: archive run telemetry to disk before pruning it (b4ab404)
- groom: dispatch an attendant to a run that parked or died (27dfaf7)
- groom: list the last N runs ordered by telemetry recency (9e152fd)
- groom: memory-only liveness and a never-blocked event loop (8c066af)
- groom: persist repository telemetry scopes (9540ae0)
- groom: print each live run's control command in status (b2bff5d)
- groom: record every attendance and show it in an Attendant pane (5aaee72)
- groom: show a gate's full context file in the dashboard (f0c9a40)
- groom: show a run's whole id in the detail pane, selectable (ee93ff6)
- groom: show the stablemate logo as the dashboard favicon (8dd1c7b)
- groom: sidecar getQuestions and answerGate RPCs (ca5cf2a)
- workhorse: let an Await say a machine owes it the answer (b3e33ec)
Bug Fixes
- groom: answer an empty telemetry batch without the store lock (1e8f419)
- groom: attend a gate the announcement already put on the row (d017b69)
- groom: drop a held gate whose file has flipped to ANSWERED (2617ff3)
- groom: extract latest question from rearmed gate (5e3706f)
- groom: give the attendant the whole gate and the groom reads (049dfe2)
- groom: heal the store connection instead of wedging on it (880f0ca)
- groom: log a gate poll the run answered unreadably (ad4cd71)
- groom: log details when otlp trace payload decoding fails (32cc6a9)
- groom: order a node's laps by more than the start instant (60d2fc6)
- groom: put settings next to attendant in the activity bar (4b43f2e)
- groom: show a native run's whole id in the fleet list (5ba2f33)
- groom: stop the row sync erasing a socket-discovered gate (a5519cc)
- groom: surface a native gate outside the run's claimed workspace (05976fd)
- workhorse: keep a handoff's START in its flow, colour END apart (eb00514)
Performance Improvements
- consolidate package test startups (10a5bf8)
- groom: give telemetry ingest its own thread pool (933c6df)
- groom: index dashboard telemetry queries (495cb64)
- groom: read from a per-thread connection instead of the write lock (9fc833f)
Code Refactoring
farrier: v3.0.0
3.0.0 (2026-09-11)
⚠ BREAKING CHANGES
- farrier: bare
farrier hooksno longer defaults to install; usefarrier hooks installexplicitly. - core: bump stablemate config schema to v2
Features
- core: let a power tier scale every wall-clock budget (50b5081)
- core: persist a nested config table, and groom's attend settings (3c51cca)
- farrier: add hooks install/list verbs with dry-run support (e8b3ed3)
- farrier: delete only files tagged generated_by: farrier (518154e)
- farrier: hold skills to the open agent skills spec (d41bcf1)
- farrier: install skills into the harness home directory (811f71d)
- farrier: read the library from the CLI (846fc81)
- farrier: seed a new agents.yml with the base library's two packs (f33cae3)
- workhorse: run a measurement detached under a bounded supervisor (3c0cb8c)
Bug Fixes
- farrier: let the aggregated AGENTS.md be regenerated (5cf584c)
- farrier: stop the generated launcher taking over the help target (aa2161f)
- workhorse: keep a handoff's START in its flow, colour END apart (eb00514)
Performance Improvements
- consolidate package test startups (10a5bf8)
Code Refactoring
workhorse-workflows: v1.1.0
1.1.0 (2026-08-14)
Features
- ostler: add created/removed paired lifecycle checks (6eaf82a)
- ostler: record response status in the browser diagnostics (a88591b)
- ostler: record the whole console and network in the diagnostics (79e7f91)
- ostler: record why a failed request failed, not just its url (c7c0ddc)
- ostler: stamp a schema key on the browser diagnostics (105cb82)
- workflows: author the QA plan as a python module (622e4dd)
- workflows: backfill a missing placement from the running ui (3a7cd25)
- workflows: gate okf-builder on every non-waived finding (d581fe1)
- workflows: give each okf repair item a prompt for its own code (03502c9)
- workflows: give the qa planner its plan-context and a dry run (b53e1ea)
- workflows: hand a spent QA budget to the operator before giving up (f9f3678)
- workflows: hold the QA lane to a wall-clock budget (014ebcb)
- workflows: let the author ratify a documentation block (b8c2b9e)
- workflows: let the coder QA lane run its scenarios sandboxed (95d05df)
- workflows: queue undeclared obligations as okf-builder worklist (ee41f57)
- workflows: read the qa context in slices, not whole, in plan-qa (30fa1f8)
- workhorse: keep machine scratch in the cache, not the repo (0f9c663)
Bug Fixes
- ostler: say a required section is missing, not empty (809b18c)
- workflows: bound checkpointed docs repair notes (3742fbc)
- workflows: catch a set-aside epic branch up to its base (659dd3d)
- workflows: clear the review sidecars before each review round (7571ac7)
- workflows: close a prose qa finding by editing the prose (51e9c2f)
- workflows: compact repeated docs gate findings (5a16eb3)
- workflows: continue reducing docs gate repairs (f42595c)
- workflows: declare the playwright extra the coder's qa stage needs (568a465)
- workflows: escalate a QA repair that changes nothing (eaf2899)
- workflows: forbid the qa fixer from rewriting the evidence ledger (2139a55)
- workflows: gate CI on the branch the epic PR is opened from (151b0d1)
- workflows: gate on a repeated identical blocked qa bundle (5d64207)
- workflows: group repair items by the node the ref really names (cc10736)
- workflows: hand branch_epic the run dir so its claim ledger fills (370fb34)
- workflows: hold the QA context join point to the plan budget (0b28885)
- workflows: judge okf coverage across scenarios, not one by one (b2c0ef6)
- workflows: keep a story's Dependencies section through a rewrite (906671e)
- workflows: let a blocked qa fix reach the operator gate (500750f)
- workflows: let a drain return to an epic branch it cut itself (d0253a9)
- workflows: make the okf-build scratch ignore itself (a95b31f)
- workflows: make the QA lane's wall clock advisory (a02e58d)
- workflows: make the QA plan defeat the test runner's cache (351395d)
- workflows: put the check vocabulary in the repair prompt (4518672)
- workflows: repair a cut-off QA plan instead of failing the run (ef29840)
- workflows: require a listing before a QA absence finding (efffb5d)
- workflows: require qa evidence for universal claims (0b1461b)
- workflows: require structured evidence for docs checks (d77064f)
- workflows: require terminal evidence for print qa (9436b4f)
- workflows: retry qa after docs repair (581a2ec)
- workflows: route an overlong bullet to a grounded repair (8cf0abc)
- workflows: show the doctor's expected form in the rework brief (678a8d1)
- workflows: steer qa repairs to declared checks (5cc6831)
- workflows: stop a named doc file owning every error already in it (2aa7a6e)
- workflows: stop a plan repair from stalling the fix loop (0e20a19)
- workflows: stop a spent plan budget re-running the failing QA plan (c71a8bc)
- workflows: stop entering the plan review once it is demoted (072414f)
- workflows: stop the QA audit blocking a pass forever (db005d0)
- workflows: stop the qa operator granting its own verdict (670ade6)
- workflows: teach the qa planner $QA_DIR, not a pinned ledger path (cdcd299)
- workflows: teach the qa planner what a vacuous assertion looks like (f8de205)
- workflows: try the other hypothesis before abandoning a QA story (c6b839b)
Performance Improvements
- workflows: cap the QA plan turns and cut their lap budgets (3bafc23)
...
workhorse-agent: v2.1.0
2.1.0 (2026-08-14)
Features
- core: read the fallback agent cli from the shared config (8cc0836)
- workhorse: fall back to the configured cli, not always claude (49f72e2)
- workhorse: keep machine scratch in the cache, not the repo (0f9c663)
- workhorse: let a node set its own retry budget (c6a9c4a)
- workhorse: raise a catchable AgentTimeout from an overrun turn (e7cb40c)
Bug Fixes
- workhorse: stop a dead agent CLI escaping as a raw traceback (1542242)
ostler: v1.1.0
1.1.0 (2026-08-14)
Features
- ostler: add created/removed paired lifecycle checks (6eaf82a)
- ostler: check a rendered region against its documented placement (c20e489)
- ostler: declare where a component sits on the screen (cba4cfd)
- ostler: drive the browser from inside the scenario process (765cd59)
- ostler: expose fmt on the Ostler api (e3b9646)
- ostler: expose the QA sandbox on the Python API (8aad923)
- ostler: flag a normative bullet too long to prove (595ea9b)
- ostler: let a mid-journey photograph vet part of a screen (fab484f)
- ostler: let a scenario assert on the live browser diagnostics (5d8c150)
- ostler: load a python QA plan through a describe pass (37fa53f)
- ostler: make a UI scenario vet the screen it photographed (a4c0d80)
- ostler: make QA evidence declared, live and computable (223a01e)
- ostler: measure the layout beside every QA screenshot (ea4de08)
- ostler: read the qa context packet in filtered, paged slices (7cb3ed4)
- ostler: record every screenshot's regions in vet's own format (fa2d893)
- ostler: record response status in the browser diagnostics (a88591b)
- ostler: record the whole console and network in the diagnostics (79e7f91)
- ostler: record why a failed request failed, not just its url (c7c0ddc)
- ostler: refuse a UI scenario that vets nothing (441451a)
- ostler: report checks that cannot go red (e5cfe9c)
- ostler: run a QA scenario as a python function (ba333d7)
- ostler: run a QA scenario as a python function (8f4797d)
- ostler: run a single qa scenario into a scratch directory (16f1acb)
- ostler: scan a mobile screen's regions from its view hierarchy (bfe9563)
- ostler: stamp a schema key on the browser diagnostics (105cb82)
Bug Fixes
- ostler: bind each QA obligation to the assertion that proves it (08580cb)
- ostler: catch a heading that re-parents its neighbour's fields (a66d92d)
- ostler: fail a qa step when an upstream pipeline stage fails (b02467c)
- ostler: follow module helpers and constants when reading a plan (70a70df)
- ostler: ignore doctor waiver ledger in qa context (77612cd)
- ostler: ignore opencode session artifacts in qa context (4bba7c0)
- ostler: keep a dry run out of the scored qa ledger (f2e8040)
- ostler: keep the check a scenario verified on its ledger record (1aa9d5c)
- ostler: let a waiver reach a warn-level finding (23ac850)
- ostler: make a passing ready_check survive the daemon it describes (f613b98)
- ostler: make the recorded QA video playable (41cfbeb)
- ostler: name the near-miss call a declared check refusal is about (df8fd5f)
- ostler: name the node behind a value-level covers id (8f40092)
- ostler: reach the QA harness by a path the platform spells (a076fea)
- ostler: read a $-rooted json_path as the field it names (f20cccd)
- ostler: record an unmet expect_status as a failed assertion (8541739)
- ostler: register a loaded harness module under its own name (980f72b)
- ostler: reject a qa-evidence left over from an earlier run (dcb4785)
- ostler: report a missing declared check once, not per obligation (9f15b15)
- ostler: say a required section is missing, not empty (809b18c)
- ostler: say why a device screen cannot be vetted yet (ab8b593)
- ostler: say why a helper's checks read as no checks at all (20f9c99)
- ostler: sink a qa criterion its own run log disproves (ecb7a5b)
- ostler: sort obligations by natural index (f6f2104)
- ostler: stop a process-exit assertion from satisfying coverage (d7577aa)
- ostler: stop a QA plan writing bytecode into the docs tree (c77af2b)
- ostler: stop qa.by_text pinning an exact match nothing renders (9f29f81)
- ostler: stop the grounding gate calling every binary file missing (84faf4a)
- ostler: stop unstated-precondition inflecting an inflected verb (79a998c)
- ostler: stop vet demanding every state in one photograph (afe0b82)
- ostler: tell an author the check they got wrong, not a canned one (b3db085)