Repository navigation
v0.4.1
·
76 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Compared against 0.4.0 (9a83868). Released channel stable points at v0.4.1. Patch bump: the closed-loop groundwork — every escalation carries a mechanical code, OMP worker transcripts persist per ticket, factory watch files the factory's own runtime failures as bugs, factory score rates sessions from those transcripts, and a release gate tier runs only on tags.
- Worker transcripts and escalation codes (#241): OMP workers run with
--session-dir .factory/transcripts/<n>/, and theattemptrow'stranscriptnames the session file (null for other workers or--no-session).escalate()takes a requiredcodefromdispatch.ESCALATION_CODES(gate_failed,worker_stuck,budget,ci_failed,review_revise,approval_drift, …) journaled beside the prosereason;factory statsandhuman_touch_metricsreport the trailing weekescalations_by_code, and handoff routing reads the code. - Review and manager rounds default to 3 (#231).
factory score [--last N] [--dry-run](#234): scores every finished ticket's worker attempts from the OMP transcripts the dispatcher keeps per ticket and journals onescorerow per attempt (tool_calls,edits,retries,gate_first_pass,efficiency,compliance,judge_model). Counts come from the session JSONL alone;complianceis a 0–1 LLM-as-judge score through the triage model transport, judging the ticket's Scope and Exit gate against the worker's final message and handoff (the worktree copy, or the retained accepted result once the worktree is removed), that isnull, never guessed, when the model is unreachable or does not answer with a number in range. Scored attempts are skipped on later runs, a missing transcript journalsskipped: "missing", and a run reads at most 50 attempts and 2 MB per transcript.learnstill reads log tails; wiring it to scores is a later ticket.- Post-ship monitor (#232):
factory watchreads local evidence only — lifecycle exit rows withmechanism_failure(orunknownwithworker_exit:*/check_timeout), this repository's failedfactory-*user units, anddashboard --runtime-jsonsource errors — and files onebug,needs-triageissue per new failure fingerprint (sha256 of kind/stage/reason-or-unit, 12 hex) with the triggering rows, the newest attempt log tail, the observation excerpt and the reproducing command; filings are journaled aswatchrows, never refiled while open, refiled once closed and recurring, at most 5 per pass;--dry-runmakes noghcall.factory installruns it from the pass unit'sExecStopPost=, so it runs after a crasheddispatchtoo and reads that crash from$SERVICE_RESULT. - Add-only protected paths (#228):
[gate].add_only_pathsglobs (read from the base ref's.factory.toml, likeprotected_paths) let a worker add a file or append lines to an existing one without an override; a deletion, rename, mode change, binary change or any removed or changed line (git diff --numstatdeleted lines > 0) failsprotected-pathswith the offending diff and escalates asworker removed or changed existing tests. This repository movestests/**fromprotected_pathstoadd_only_paths;.factory.toml,**/acceptance/**, review prompts and TRACKING stay fully protected andfactory-protected-overridestill bypasses both.factory learn's CURATE allowlist includes the base ref'sadd_only_paths, so a regression test undertests/**is still accepted. - Named human actions (#227):
factory/actions.pydefinesrequeue_agent,resolve_and_closeandadd_needs_triageonce — input schema, preconditions, and thedecisionsrequest each compiles to. The Ops Attention Re-queue, Close and new Send-to-triage buttons post{repository, action, args}to/api/decisions/prepare, andfactory mcpgainsfactory_prepare_action/factory_apply_action; both paths run the same validation and return the same structured refusal (unknown_action,invalid_args,precondition_failed,routing_refused).requeue_agentandadd_needs_triagerefuseupstream sync:issues (covers #169). Proposals, journal rows (now including apreparedrow) and receipts recordcaller(dashboardormcp) and the namedaction. - Release gate tier (#236):
[[gate.check]]acceptswhen = "release"; anywhenoutsideattempt/pr/releaseis a config error naminggate.check[<i>].when. Release checks are reportedSKIP (release tier)by the attempt gate and by--tier pr;factory gate --tier releaseruns only them (no built-ins, no pr or attempt checks) and titles its reportGate report (release tier).factory init'sci.ymlgains areleasejob that installs factory and runsfactory gate --tier releaseonpushof av*tag (thegatejob is unchanged), andfactory doctorwarns (release gate workflow) when.factory.tomlhas release checks but no workflow runs--tier release.