Skip to content

v0.4

Choose a tag to compare

@Giamme Giamme released this 15 Oct 15:58
· 232 commits to main since this release

Every forge run now records its inputs and outcomes in a dataset outside your repos, built for training and calibrating decision models on how forge really performs: it exports labeled decision cases, follows merged work into later history, and can add a second, independent review or an exploratory model pick to measure what a single run cannot.

Highlights

  • Every forge run now records its inputs and outcomes in a dataset outside your repos (~/.local/share/forge/dataset/). The record includes the resolved model of each dispatch, prompts, the diff of each attempt, verdicts and findings, tokens, merge and verification outcomes, and the full request behind each Jev judgment. It survives deleting run directories and exists for training decision models on how forge actually performs. forge dataset status shows what has been captured, forge dataset import brings in runs from before this change, and FORGE_DATASET=off turns capture off.

Added

  • forge dataset export turns the run dataset into labeled decision cases in the System One format that decision-model benchmarks and fine-tuning tools read. Each case is a decision Jev makes in forge, labeled by what happened next: whether a task's first attempt passed review, whether a retry passed given the findings it was handed, whether the reviewer passed a diff (the reviewer's model and effort are part of the case), which undeclared files a task really edited, whether a review describes the diff it was given, and whether a memory fact concerned a file the task went on to edit. Hosted Jev's own answers are kept alongside as baselines. The export stays private in ~/.local/share/forge/exports/.
  • forge dataset outcomes records what integrated work became, from your repo's history alone: for every task an integrate brought in, how many of the lines it added are still there 14 days later (--horizon-days to change it) and whether a later commit reverted it. It only reads git objects, never your working tree or index, writes nothing for a horizon not yet reached, and adds nothing when run again. The export turns it into the first label no reviewer decides: whether a merged diff survived. Verification results now also name the commit they verified.
  • plan --shadow-qa <spec>[,<spec>...] sends a sampled share of reviewed attempts (--shadow-rate, default 10%) to a second, independent reviewer of another model family, chosen only from the specs you list. Its verdict is recorded in the run dataset and never read by the run: it cannot change a status, a merge, memory or a retry, and a shadow that runs long is stopped soon after the main review finishes. forge dataset status reports how often the two reviewers agree, overall and per model pair, which tells you how much of a review verdict is the diff and how much is who reviewed it. The approval table shows the extra reviews before anything runs.
  • plan --explore E (0 to 0.5, or FORGE_ROUTE_EXPLORE) now and then gives a task you left to forge another of the models you passed to that plan, instead of its pool's turn, and records each decision with its probability in the run dataset. Until now every outcome was the outcome of the model the router chose, so nothing could say whether another model would have done better; these recorded odds make that estimable later. Forge still never uses a model you did not name, explored rows are marked * in the approval table so the spend is visible before you approve, pinned rows are never touched, and without the flag a plan is exactly as before. A model change made by retry --dwarf is now recorded too, at the moment it happens, and Jev's routing calibration leaves explored tasks out.

Changed

  • The run dataset now records which forge produced every event: besides the release, a fingerprint of the exact scripts, references and registry a run used (code_sha) and the checkout's commit (forge_rev), taken when the execution starts and flagged if the code changed before it ended. Imported runs no longer carry the importer's version. The store upgrades itself on first use. forge dataset export uses this to label outcomes more honestly: an attempt that says nothing about the implementer (a reviewer timeout, a harness crash, no verdict) is left out and counted instead of letting a later success count as the first attempt's, reviews gain a severity label (none to P0) when every finding is graded, routing and retry states gain an explicit task-size block, and each case's metadata says which forge decided and ran it and how the task went (attempts, raw verdict, gate pass, human accept, why it stopped). The orchestrator now records the decompose level it split at even when the user named none.