Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
369 commits
Select commit Hold shift + click to select a range
27c4cfc
fix: swebench workflow fixes — auto_merge removal, terminal flag, tra…
osilkin98 Jul 5, 2026
ba12aaa
fix: re-add auto_merge to swebench workflow using git branch -f (#968)
osilkin98 Jul 6, 2026
57f449f
Merge remote-tracking branch 'origin/main' into factory/doc-freshness…
eshwarprasadS Jul 6, 2026
0bbbe64
fix: update gate_doc_freshness reads for deep-QA subgraph
eshwarprasadS Jul 6, 2026
0c6de40
feat: extract DOC_FRESHNESS_GATE_PROMPT constant + add doc-generate a…
eshwarprasadS Jul 6, 2026
a5ef3cc
fix: switch swebench to deterministic executor + fix auto_merge + tra…
osilkin98 Jul 6, 2026
9b644ac
Merge pull request #928 from eshwarprasadS/factory/doc-freshness-gate
osilkin98 Jul 6, 2026
9c99f28
fix: use straight line segments in benchmark charts
RobotSail Jul 6, 2026
d17e944
feat: display trace analysis on benchmarks dashboard
RobotSail Jul 6, 2026
1eb1bc3
fix: HTML-escape trace_summary and use with-statement for file reads
RobotSail Jul 6, 2026
cc54cc1
Merge pull request #972 from akashgit/factory/run-92e69240
osilkin98 Jul 6, 2026
9867cca
fix: use straight line segments in benchmark charts
RobotSail Jul 6, 2026
1a4d3b9
fix: split FactoryCeo into benchmark-specific agent classes (#954)
RobotSail Jul 6, 2026
8506776
Merge pull request #973 from akashgit/factory/run-a29dc19b
osilkin98 Jul 6, 2026
95c2667
feat: use --focus for generic benchmark solver instead of --mode build
RobotSail Jul 6, 2026
39dc754
fix: use correct field name human_reviewed in seeded eval_profile.json
RobotSail Jul 6, 2026
d867d73
Merge pull request #976 from akashgit/fix/954-benchmark-agent-split
osilkin98 Jul 7, 2026
10dc1af
feat: add terminalbench deterministic workflow (closes #975)
RobotSail Jul 7, 2026
72c576d
fix: correct agent name in terminalbench log message
RobotSail Jul 7, 2026
b37c896
refactor: broaden terminalbench workflow for full TerminalBench-2 tas…
RobotSail Jul 7, 2026
e9ca554
feat: add featurebench deterministic workflow (closes #974)
RobotSail Jul 7, 2026
3a834bf
fix: install factory from current commit SHA in Harbor containers
RobotSail Jul 7, 2026
742e64c
fix: use double quotes for shell variable expansion in factory install
RobotSail Jul 7, 2026
7b9a086
fix: parse gate verdict by line prefix, not substring match
RobotSail Jul 7, 2026
fe0ba32
Merge pull request #977 from akashgit/fix/954-benchmark-agent-split
osilkin98 Jul 7, 2026
a297907
fix: rewrite legacybench as lean pipeline — remove broken improve_wor…
RobotSail Jul 7, 2026
0324a79
Merge pull request #979 from akashgit/fix/954-benchmark-agent-split
osilkin98 Jul 7, 2026
5129869
feat: add programbench discovery-first workflow
RobotSail Jul 7, 2026
63a1b97
Merge pull request #980 from akashgit/fix/954-benchmark-agent-split
osilkin98 Jul 7, 2026
19d1c87
fix: set --max-turns 1000 for headless Claude Code invocations (#982)
osilkin98 Jul 7, 2026
72ab0b2
fix: use vars instead of secrets for LANGFUSE_BENCH_HOST to prevent t…
osilkin98 Jul 7, 2026
211c485
feat: GRAPH-SPEC behavioral specification engine (#981)
mihirathale98 Jul 7, 2026
55efb86
feat: restructure contributed workflows into self-contained directori…
osilkin98 Jul 8, 2026
066e4ed
refactor: unify benchmark pipeline — shared Harbor invocation infrast…
osilkin98 Jul 8, 2026
1334878
refactor: programbench workflow — adversarial discovery verification …
osilkin98 Jul 8, 2026
234005d
feat: add contributed workflow linter (#991)
osilkin98 Jul 8, 2026
acb1eb3
feat: support adversarial (GAN-style) eval loops (#935) (#936)
lambdabaa Jul 8, 2026
cef6290
Fix Node.js eval: detect vitest, auto-detect language for observabili…
lukeinglis Jul 8, 2026
fcebd56
feat: add --no-worktree flag to factory ceo and factory run (#938)
mihirathale98 Jul 8, 2026
fcd5aa8
fix: persist trace_id.txt across worktree cleanup (#965) (#994)
osilkin98 Jul 9, 2026
dec28b6
refactor: rename GRAPH-SPEC.md to SPEC.md (#995)
mihirathale98 Jul 9, 2026
372f373
fix: disallow Claude Code native Agent tool in factory subprocesses
crqu Jul 9, 2026
1c80be8
fix: add --disallowedTools Agent to cmd_refactory and missing tests
crqu Jul 10, 2026
e39bdd1
Merge pull request #997 from crqu/fix/disallow-native-agent-tool
gx-ai-architect Jul 10, 2026
c5d71e0
fix: convert disallowed-tools tests to async to fix IndexError (#1002)
osilkin98 Jul 14, 2026
fccc475
fix: increase benchmark timeouts to 2h, forward node timeout in execu…
osilkin98 Jul 15, 2026
c71c631
fix: design mode routing preserves ceo_mode='design' for ALL design i…
osilkin98 Jul 15, 2026
2aa5770
fix: remove --max-turns caps from benchmark failure analysis script (…
osilkin98 Jul 15, 2026
0ca3f1f
fix: resolve Langfuse trace misidentification in CI concurrent benchm…
osilkin98 Jul 15, 2026
f31b4f5
fix: harden legacybench gate_verify with independent build verificati…
osilkin98 Jul 16, 2026
a5d8df3
fix: add notes field to FnNode and render prose context in SKILL.md (…
osilkin98 Jul 16, 2026
3b0db8f
fix: preserve Harbor exception details in benchmark CI artifacts (#1012)
osilkin98 Jul 16, 2026
bb63c37
fix: expose granular test failure details in ProgramBench gate_verify…
osilkin98 Jul 17, 2026
9f7b702
docs: add benchmark contribution guide (#1016)
osilkin98 Jul 17, 2026
d965dd5
feat: add Harbor-Index benchmark integration (#1017) (#1018)
osilkin98 Jul 17, 2026
ebfa1b8
feat: inject workflow SKILL.md into CEO system prompt to survive comp…
akashgit Jul 18, 2026
9bfb144
fix: use Harbor artifacts in analyze_failure.py when no Langfuse trac…
osilkin98 Jul 20, 2026
740459c
update README installation instructions to be global
harrisonstropkay Jul 20, 2026
ca61fe2
streamline instructions
harrisonstropkay Jul 20, 2026
3d60b0c
fix CI
harrisonstropkay Jul 20, 2026
2f7f6a3
add simple tests
harrisonstropkay Jul 20, 2026
4a026d4
more docs
harrisonstropkay Jul 20, 2026
f84f294
expand explanation for global install
harrisonstropkay Jul 20, 2026
601b8d9
Merge pull request #1026 from harrisonstropkay/global-installation
gx-ai-architect Jul 20, 2026
d6591cf
feat: make ToM-SWE benchmark CI-interoperable (#1020)
osilkin98 Jul 21, 2026
9cb79c4
fix: make CEO prompt resilient to session transitions (#1028)
crqu Jul 21, 2026
ae6e641
Merge pull request #1032 from crqu/factory/run-d9f46aca
gx-ai-architect Jul 21, 2026
c9dfab3
feat: parallel-improve workflow for concurrent experiment execution (…
lambdabaa Jul 21, 2026
26bb7fe
docs: add docs site badge to README.md (#1042)
osilkin98 Jul 22, 2026
6e8227d
fix: wire WorkflowRegistry into workflow CLI for user/project discove…
RohanAwhad Jul 23, 2026
782aa47
feat: extend create mode to update existing workflow modes (#1044)
akashgit Jul 23, 2026
f2cc10d
docs: sync README.md with website content and structure
lukeinglis Jul 22, 2026
20f03c9
docs: simplify README to document design and create modes only
lukeinglis Jul 24, 2026
97c5e20
Merge pull request #1043 from akashgit/factory/run-821aaa61
lukeinglis Jul 24, 2026
900b2ca
feat: add two-layer artifact verification for workflow system (#1047)
gx-ai-architect Jul 24, 2026
6ae4379
fix: handle unborn repos in worktree creation (#1035)
georgosgeorgos Jul 24, 2026
97997ea
Add founder mode (#1036)
georgosgeorgos Jul 28, 2026
6ebbe45
fix: apply SPEC Diff from strategy to SPEC.md in improve workflow (#1…
mihirathale98 Jul 28, 2026
40d347b
chore: clean up stale QA agent references after deep-QA migration (#9…
osilkin98 Jul 28, 2026
bbb36d7
feat: add deprecation warnings for non-create/non-design CLI modes (#…
osilkin98 Jul 28, 2026
9e76f97
feat: add CEO session resume via Claude --resume/--session-id (#1065)
mihirathale98 Jul 29, 2026
c93124c
ci(review): add mihirathale98 to CEO review allowlist (#1075)
mihirathale98 Jul 29, 2026
67beb75
refactor: split cli/ceo.py into 6 modules, reduce CC, fix import cycle
xukai92 Jul 1, 2026
21c9ce1
refactor: extract tmux commands, reduce ceo.py to 160 lines, clean __…
xukai92 Jul 1, 2026
f53fda5
refactor: reduce 3 CC violations, eliminate god file, fix coupling (#…
xukai92 Jul 29, 2026
ecbf1a6
fix: update test imports and mock paths after ceo.py module extraction
xukai92 Jul 29, 2026
f3d462b
Merge pull request #921 from akashgit/factory/run-57c0f6cf
xukai92 Jul 29, 2026
4830693
refactor(spec): replace LLM extraction with graphify code knowledge g…
mihirathale98 Jul 30, 2026
e89788a
feat: add standalone PR conflict detector with hotspot tracking (#1078)
osilkin98 Jul 30, 2026
45f76f2
fix: ensure SKILL.md generated before CEO prompt resolution (#1080) (…
osilkin98 Jul 30, 2026
214bbe1
feat: add --overwrite flag for runtime workflow mutation + /workflow-…
xukai92 Jul 30, 2026
7e40a50
fix: propagate resolved base_branch to CEO task instead of raw CLI fl…
osilkin98 Jul 30, 2026
04dbaed
Refactor create mode section in README
akashgit Aug 1, 2026
d5c2728
Merge pull request #1084 from akashgit/feat/workflow-overwrite
xukai92 Aug 1, 2026
1925cdf
feat(worktree): add FACTORY_REMOVE_WORKTREE config for worktree reten…
mihirathale98 Aug 3, 2026
ee32e19
feat: add GitHub Actions Job Summary dashboard to PR conflict detecto…
osilkin98 Aug 3, 2026
89d53a2
fix: increase ceo-review workflow timeout from 30m to 2h (#1094) (#1095)
RobotSail Aug 3, 2026
2043118
Add frontend-design workflow mode (#1066)
nehamalepati Aug 3, 2026
b2db8fd
feat(benchmark): add SaliTrap as contributed benchmark (#1091)
osilkin98 Aug 4, 2026
cbc5f20
feat: add multi-issue --focus parsing and resolution (#1093)
lukeinglis Aug 4, 2026
8ffd485
chore: add lukeinglis and nehamalepati to ceo-review callers (#1103)
RobotSail Aug 4, 2026
a2eb51f
feat: add --auto-approve CLI flag for design mode (#1096)
osilkin98 Aug 5, 2026
ed8c86b
Add frontend-design-discover mode and design system persistence (#1102)
nehamalepati Aug 5, 2026
4f8f731
chore: add abhi1092 to ceo-review callers (#1108)
RobotSail Aug 5, 2026
dfd1507
feat: add InnerLoop and CycleAnalyzer for outer-loop optimizer integr…
abhi1092 Aug 5, 2026
5cd06e8
fix: handle long prompts in design mode without crashing (#1111)
akashgit Aug 6, 2026
ee503f9
feat(workflow): add plan mode (W₁₅) (#1098)
colehurwitz Aug 6, 2026
2e62900
docs: unify README.md and docs landing page via symlink (#1100)
lukeinglis Aug 6, 2026
f787dab
feat(plan): auto-create GitHub repo when no remote exists (#1117)
colehurwitz Aug 6, 2026
142afb4
feat: add OpenCode runner (#1119)
RohanAwhad Aug 6, 2026
df6cb94
feat: add --from-plan flag for design mode (#1118)
colehurwitz Aug 7, 2026
a116940
feat: add SWE-benchify-hard benchmark (284 synthetic Go instances) (#…
lambdabaa Aug 7, 2026
29c0b53
feat: inject Study node in design mode for existing projects (#1126) …
akashgit Aug 7, 2026
3c58ec0
fix: prevent CEO auto-approval of user gates in skill_export.py (#1129)
akashgit Aug 7, 2026
f401f0f
fix: deduplicate PR conflict detector comments (#1116)
osilkin98 Aug 7, 2026
65a4b02
Add GitHub Action to auto-close stale issues without linked PRs (#1131)
osilkin98 Aug 7, 2026
485acd4
fix: route design mode HALT path through discover before study (#1136)
akashgit Aug 7, 2026
64003e9
feat: add frozen_nodes constraint to InnerLoop (#1124)
Maxusmusti Aug 7, 2026
7347649
fix: sanitize subprocess output to prevent Claude Code rendering corr…
osilkin98 Aug 7, 2026
d0676f8
Get access to trigger ceo review workflow (#1138)
s-akhtar-baig Aug 7, 2026
f27858e
perf: reduce workflow executor startup overhead via lazy loading + ti…
osilkin98 Aug 7, 2026
9e30a25
feat: add pfexec — probabilistic workflow execution engine
xukai92 Aug 1, 2026
fd1c999
fix: 3 code-review bugs in pfexec — shallow-copy aliasing, fragile pa…
xukai92 Aug 1, 2026
cec47ce
fix: use correct --system-prompt flag for Claude CLI in ClaudeBackend
xukai92 Aug 1, 2026
1a9d9c3
fix: add --bare flag and increase timeout for ClaudeBackend
xukai92 Aug 1, 2026
6f14c13
fix: strip markdown code fences from LLM JSON output in pfexec init/fork
xukai92 Aug 1, 2026
70ee454
fix: disable tool usage in ClaudeBackend for fast raw LLM calls
xukai92 Aug 1, 2026
898721e
fix: use --disallowedTools instead of --allowedTools '' in ClaudeBackend
xukai92 Aug 1, 2026
56dacc9
fix: resolve CI lint and test failures for pfexec
xukai92 Aug 1, 2026
7458451
feat: add HotpotQA and CRAG benchmark workflows for pfexec
xukai92 Aug 1, 2026
0951b87
fix: resolve pfexec data-flow bugs in state, sample, langgraph, and p…
xukai92 Aug 2, 2026
5876b87
fix: fork only on effectful nodes and output from terminal node
xukai92 Aug 2, 2026
857b385
fix: prevent pfexec from being worse than deterministic mode
xukai92 Aug 3, 2026
c7e5935
fix: improve HotpotQA benchmark data quality
xukai92 Aug 3, 2026
dc6307e
feat: add Claude Code backend compiler for pfexec
xukai92 Aug 3, 2026
0b3adad
feat: add orchestrated and agentic execution modes for pfexec/dist/cc
xukai92 Aug 3, 2026
5c93ea1
fix: remove --session-id from pfexec orchestrated mode
xukai92 Aug 3, 2026
27524d4
feat: rebuild agentic mode with PostToolUse hooks and precise protocol
xukai92 Aug 3, 2026
a65b5b8
fix: use Thompson sampling and increase timeout in cc runner
xukai92 Aug 4, 2026
1582f5b
feat: add sequential, rewind, and lightweight observe modes to pfexec
xukai92 Aug 4, 2026
dfc8623
feat: add --observe-mode CLI argument to hotpotqa benchmark
xukai92 Aug 4, 2026
120e66d
feat: add factory SKILL.md baseline execution mode for pfexec
xukai92 Aug 4, 2026
cc54b5f
feat: redesign agentic SKILL.md to advisory prose and add --agentic b…
xukai92 Aug 4, 2026
9a97abc
feat: add --start argument to hotpotqa benchmark for skipping questions
xukai92 Aug 4, 2026
4e6285d
feat: add B2 agentic runner with engine-computed hints via PostToolUs…
xukai92 Aug 4, 2026
017644d
fix: update agentic SKILL.md test assertions to match new prose-style…
xukai92 Aug 4, 2026
88c4685
fix: restrict agentic runner to Write-only tool access
xukai92 Aug 4, 2026
b855776
refactor: switch agentic runner from Claude Code session to --bare mode
xukai92 Aug 4, 2026
a9ad93e
fix: skip hints for uniform particle distributions and limit to Phase 1
xukai92 Aug 4, 2026
b3872d0
feat: add wrapped B2 runner — claude --bare with engine logic in wrapper
xukai92 Aug 5, 2026
eb14a8d
feat: dispatch observe_mode in wrapped runner instead of always calli…
xukai92 Aug 5, 2026
c579bb3
feat: add pfexec tool-based architecture — CLI tool + runner + benchm…
xukai92 Aug 5, 2026
6eb62e2
feat: add --particles CLI arg to hotpotqa benchmark
xukai92 Aug 5, 2026
1202ce1
feat: improve tool-based runner answer quality with conciseness, trun…
xukai92 Aug 5, 2026
942fd09
feat: add session baseline runner — SKILL.md + tools, no engine
xukai92 Aug 5, 2026
f27cabc
feat: add DevOps Dockerfile benchmark for effectful fork recovery
xukai92 Aug 5, 2026
41c9541
feat: replace DevOps benchmark with adversarial multi-constraint scen…
xukai92 Aug 5, 2026
754d629
fix: set check.sh permissions to 0o755 instead of 0o111
xukai92 Aug 5, 2026
1e3600a
feat: add code generation benchmark for fork recovery via real pytest
xukai92 Aug 5, 2026
95c8dbb
feat: add investigation benchmark for multi-step fact extraction
xukai92 Aug 5, 2026
4e3d339
feat: add forensic analysis benchmark with 15-node deep workflows
xukai92 Aug 6, 2026
07da9cd
feat: add factory workflow → pfexec bridge compiler and CLI
xukai92 Aug 6, 2026
e7b6280
feat: add tool-based workflow execution interface (init/next/submit/s…
xukai92 Aug 6, 2026
ae176e8
feat: add --tool-exec flag to factory ceo
xukai92 Aug 6, 2026
06a3459
fix: ensure tool-exec nodes are tracked via mandatory submit + auto-c…
xukai92 Aug 6, 2026
0f0703f
feat: make tool_next auto-submit nodes via artifact detection
xukai92 Aug 6, 2026
6d1dffc
feat: add finalize, startup caching, and event logging to workflow tool
xukai92 Aug 6, 2026
04ad154
fix: three workflow tool bugs — headless finalize, event path, disk c…
xukai92 Aug 7, 2026
ec5f443
feat: DONE triggers finalize + rename --tool-exec to --engine
xukai92 Aug 7, 2026
8e4876a
fix: strengthen --engine tool protocol to override ceo.md skill routing
xukai92 Aug 7, 2026
e08de87
revert: restore original tool protocol text, keep only ensure_skills …
xukai92 Aug 7, 2026
dd335be
polish: forward --engine to tmux, document in refactory/factory-run
xukai92 Aug 7, 2026
cd43c76
fix: complete engine matrix — wire --engine tool+headless and --engin…
xukai92 Aug 7, 2026
1dfb46a
fix: revert CI --all-extras and remove pfexec optional dep
xukai92 Aug 7, 2026
d29077b
Merge pull request #1087 from akashgit/factory/run-b54b74c0
xukai92 Aug 7, 2026
4eb9a37
feat: add --format {linear,phased} to workflow tool next/status
xukai92 Aug 7, 2026
6e489fa
feat: workflow tool — stale file fix, overview/curr/dry-run, compact …
xukai92 Aug 7, 2026
9e889ba
feat: integrate MemPalace into factory for study and archive phases (…
s-akhtar-baig Aug 7, 2026
6472827
fix: reorder tool-exec protocol — overview map before commands and pr…
xukai92 Aug 7, 2026
3b46892
feat: consolidate --mode plan into --mode design --just-plan (#1133)
colehurwitz Aug 7, 2026
564f9cc
fix: include full spec in study output
mihirathale98 Aug 9, 2026
04999c4
Merge pull request #1144 from akashgit/ma/fix-spec-n
mihirathale98 Aug 9, 2026
869a2cd
fix: guard tool_finalize() calls with dry_run check
xukai92 Aug 9, 2026
75e21ae
test: add dry_run side-effect tests for tool_next
xukai92 Aug 9, 2026
48e5441
feat(contained): run the factory in a podman container or a cluster p…
beatsmonster Aug 10, 2026
0665be8
Merge pull request #1142 from akashgit/factory/run-b54b74c0
xukai92 Aug 10, 2026
3c4aad9
fix: load MCP config from .refactory/.mcp.json for refactory agent
xukai92 Aug 10, 2026
3530a28
Merge pull request #1154 from akashgit/fix/refactory-mcp-config
xukai92 Aug 10, 2026
4726590
Extract research subgraph into modular helper (#1159)
colehurwitz Aug 11, 2026
af826da
feat: wire project-local workflow discovery into skill generation and…
xukai92 Aug 11, 2026
9438e6c
fix: design mode no longer instructs CEO to transition to Improve mod…
RobotSail Aug 11, 2026
dd737f4
feat: add auto version incrementing via hatch-vcs (#1195)
RobotSail Aug 12, 2026
fc9d351
Draft PR lifecycle — create as draft, mark ready on KEEP verdict (#1194)
RobotSail Aug 12, 2026
d7534e9
feat: Automatic loop context injection for tool mode (#1199)
colehurwitz Aug 12, 2026
b74f953
Merge pull request #1191 from akashgit/factory/run-50677c06
xukai92 Aug 12, 2026
d692951
feat: support project-local workflow modes via project: prefix
xukai92 Aug 12, 2026
9be4e3e
fix: use metavar instead of choices=None for --mode argparse
xukai92 Aug 12, 2026
3e44604
fix: only accept project-local modes, not all registry entries
xukai92 Aug 12, 2026
ff28de3
refactor: remove dead code across the codebase (#1210)
mihirathale98 Aug 12, 2026
0914a8e
feat: add factory/compress/ package with CompressEvaluator, CompressI…
Maxusmusti Aug 12, 2026
267d839
Remove redundant test_loop_context_e2e_ab.py (#1215)
colehurwitz Aug 12, 2026
17098b3
Add deep-research mode (W₁₅ v4): single-agent iterative research with…
abhi1092 Aug 11, 2026
e1cfdcc
fix: update workflow count assertion and reduce _build_ceo_task compl…
abhi1092 Aug 12, 2026
570e5b3
refactor: extract focus directive logic from _build_ceo_task to reduc…
abhi1092 Aug 12, 2026
ce2291a
fix: extract deep_research_workflow to own module to reduce definitio…
abhi1092 Aug 12, 2026
ed8306e
refactor: trim deep-research workflow to pure research mode
abhi1092 Aug 12, 2026
47f8e51
fix: correct RELOOP verdict file path from ceo-verdict-research to ce…
abhi1092 Aug 12, 2026
771f3b2
Merge pull request #1197 from abhi1092/factory/run-1e0d37af
abhi1092 Aug 12, 2026
df15d98
Merge pull request #1211 from akashgit/fix/project-local-mode-routing
xukai92 Aug 12, 2026
fb34e20
fix: restore detect_research_plateau removed by dead-code cleanup (#1…
osilkin98 Aug 12, 2026
8d350ba
feat: add decomposer node to deep-research workflow
abhi1092 Aug 13, 2026
7588efb
feat: SkillOpt prompt optimization + LLMNode primitive (#1212)
osilkin98 Aug 13, 2026
8aafc65
fix: restore researcher.md, keep protocol in workflow prompt
abhi1092 Aug 13, 2026
520d1aa
fix: add timeout guidance for parallel researchers in workflow skills…
ash-ding Aug 13, 2026
e1c101d
feat: add CLI plugin architecture via entry points
shivchander Aug 13, 2026
87ccc43
fix: update test to match _sandbox_mode returning read-only for unkno…
shivchander Aug 13, 2026
7308a37
Merge pull request #1225 from abhi1092/factory/run-e0144f00
abhi1092 Aug 13, 2026
048695a
fix: guard plugin commands against builtin name collisions
shivchander Aug 13, 2026
ed6cc97
feat: add parser extension API and CEO pre-hook invocation
shivchander Aug 13, 2026
b9d6d9e
fix: guard parser._subparsers access against None in build_parser()
shivchander Aug 13, 2026
f67dcfb
feat: integrate DevOps Gym as contributed benchmark (#1161)
osilkin98 Aug 13, 2026
039d4a6
Merge pull request #1227 from akashgit/factory/run-a615a5a5
shivchander Aug 13, 2026
b613f31
fix: validate plugin-registered modes and run pre-hooks before path a…
shivchander Aug 13, 2026
123cdae
fix: guard Path(raw_path) against None when pre-hooks may supply path
shivchander Aug 13, 2026
4998c63
Merge pull request #1232 from akashgit/fix/plugin-mode-validation
shivchander Aug 13, 2026
b528071
fix: replace directory symlink with selective symlinks in CEO run wor…
akashgit Aug 14, 2026
806ac21
fix: slow update writes to prompt slots, not just SKILL.md (#1241)
osilkin98 Aug 14, 2026
4129ba2
feat: add study mode workflow with graph exploration (#1217)
mihirathale98 Aug 14, 2026
02c19e5
fix: widen CycleState.mode from Literal to str for plugin modes
shivchander Aug 14, 2026
3e9a439
fix: widen CycleState.mode from Literal to str for plugin modes
shivchander Aug 14, 2026
9f682cc
fix: allow plugin-registered agent roles in factory agent CLI (#1260)
shivchander Aug 14, 2026
00d303e
fix: carry plugin-created .factory/ subdirs into worktrees
shivchander Aug 14, 2026
5fcb483
fix: add user-global tier to agent prompt resolution and widen AgentR…
shivchander Aug 14, 2026
fa047f9
Merge pull request #1269 from akashgit/fix/plugin-integration-bugs
shivchander Aug 14, 2026
cdb91af
feat: parallelize deep-QA pipeline + add worktree anchoring and strat…
gx-ai-architect Aug 12, 2026
745662e
fix: update tests for parallel QA topology
gx-ai-architect Aug 12, 2026
2cd7c59
fix: address CEO review — topo sort, stale prerequisites, loop topology
gx-ai-architect Aug 14, 2026
8d94e67
Merge pull request #1213 from akashgit/fix/parallel-qa-agents-v2
gx-ai-architect Aug 14, 2026
f33b35b
fix: reorder _detect_artifact to check declared writes before generic…
shivchander Aug 16, 2026
9765a0a
Merge pull request #1266 from akashgit/fix/1262-cycle-state-mode-literal
shivchander Aug 16, 2026
3ea2079
Merge pull request #1278 from akashgit/factory/run-1cc63fcc
shivchander Aug 16, 2026
51244fa
fix: eliminate TOCTOU race in tmux-persist session creation (#1279) (…
shivchander Aug 16, 2026
f9fc6c8
feat: add env overlay support to config.toml credential profiles (#1233)
lukeinglis Aug 17, 2026
cdcaa8b
feat: Outer Loop v2 — evolutionary workflow search (#1284)
akashgit Aug 17, 2026
dc11cf3
docs: add outer-loop to mkdocs nav
akashgit Aug 17, 2026
ce92fe1
fix: write slim CEO identity to .claude/CLAUDE.md instead of full pro…
crqu Aug 17, 2026
ecee3d9
fix: update test helper to write declared artifacts, preventing infin…
osilkin98 Aug 17, 2026
7f8a105
Merge pull request #1295 from crqu/factory/run-e5645614
gx-ai-architect Aug 18, 2026
22a62b8
fix: restore missing README content and fix symlink-relative links in…
RobotSail Aug 18, 2026
c0a7e48
fix: mock ONNX embedding function in mempalace tests to eliminate fla…
RobotSail Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions .containerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Build context for containers/factory/Containerfile.
#
# The image needs pyproject.toml, uv.lock, README.md, factory/ and skills/ — nothing else. The
# repository as a whole is several hundred megabytes, most of it history, benchmark data and
# virtualenvs, and every byte of it is streamed to the engine on each build.
*
!pyproject.toml
!uv.lock
!README.md
!factory/
!skills/

# Re-excluded inside the directories that are included: caches and virtualenvs are large, are
# rebuilt inside the image anyway, and an arm64 .venv copied into an amd64 image is actively wrong.
**/__pycache__/
**/*.pyc
**/.venv/
**/.pytest_cache/
**/.ruff_cache/
**/.mypy_cache/
146 changes: 135 additions & 11 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ name: Benchmark CI
on:
push:
branches: [main]
schedule:
- cron: '17 6 * * 1-5'
workflow_dispatch:
inputs:
benchmark:
Expand All @@ -16,6 +14,11 @@ on:
- featurebench
- terminalbench
- programbench
- legacybench
- harborindex
- tomswe
- salitrap
- devopsgym
- all
instance_id:
description: 'Instance ID (leave default for smoke test)'
Expand Down Expand Up @@ -78,6 +81,26 @@ jobs:
solver: factory
default_instance: 'cmatrix'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'programbench' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
- benchmark: legacybench
solver: factory
default_instance: '1907c2-c-debug-legacy-buddy-fix'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'legacybench' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
- benchmark: harborindex
solver: factory
default_instance: 'bix-filter-chip-variants'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'harborindex' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
- benchmark: tomswe
solver: factory
default_instance: 'sympy__sympy-20590'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'tomswe' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
- benchmark: salitrap
solver: factory
default_instance: 'salitrap-001'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'salitrap' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
- benchmark: devopsgym
solver: factory
default_instance: 'build-maven-dependency-resolution'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'devopsgym' || inputs.benchmark == 'all') && (inputs.solver != 'claude-code') }}
# Claude Code solver entries — enabled on schedule, release, or workflow_dispatch with matching benchmark+solver
- benchmark: swebench
solver: claude-code
Expand All @@ -95,6 +118,26 @@ jobs:
solver: claude-code
default_instance: 'cmatrix'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'programbench' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}
- benchmark: legacybench
solver: claude-code
default_instance: '1907c2-c-debug-legacy-buddy-fix'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'legacybench' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}
- benchmark: harborindex
solver: claude-code
default_instance: 'bix-filter-chip-variants'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'harborindex' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}
- benchmark: tomswe
solver: claude-code
default_instance: 'sympy__sympy-20590'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'tomswe' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}
- benchmark: salitrap
solver: claude-code
default_instance: 'salitrap-001'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'salitrap' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}
- benchmark: devopsgym
solver: claude-code
default_instance: 'build-maven-dependency-resolution'
enabled: ${{ github.event_name == 'schedule' || github.event_name == 'push' || ((github.event_name != 'workflow_dispatch') || inputs.benchmark == 'devopsgym' || inputs.benchmark == 'all') && (inputs.solver == 'claude-code' || inputs.solver == 'both') }}

steps:
- name: Skip if not enabled
Expand Down Expand Up @@ -136,7 +179,7 @@ jobs:
- name: Install Factory CLI
if: steps.gate.outputs.run == 'true' && matrix.solver == 'factory'
run: |
uv tool install 'remote-factory @ git+https://github.com/akashgit/remote-factory.git'
uv tool install 'remote-factory[telemetry] @ git+https://github.com/akashgit/remote-factory.git'
export PATH="$HOME/.local/bin:$PATH"
echo "PATH=$HOME/.local/bin:$PATH" >> "$GITHUB_ENV"
factory --help > /dev/null
Expand All @@ -161,7 +204,7 @@ jobs:
if [ '${{ github.event_name }}' = 'workflow_dispatch' ]; then
echo "value=$BENCHMARK_TIMEOUT" >> "$GITHUB_OUTPUT"
elif [ '${{ github.event_name }}' = 'schedule' ]; then
echo 'value=3600' >> "$GITHUB_OUTPUT"
echo 'value=7200' >> "$GITHUB_OUTPUT"
else
echo 'value=7200' >> "$GITHUB_OUTPUT"
fi
Expand All @@ -178,17 +221,15 @@ jobs:
CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: "1"
MAX_THINKING_TOKENS: "128000"
CLAUDE_CODE_EFFORT_LEVEL: "XHIGH"
LANGFUSE_HOST: ${{ vars.LANGFUSE_BENCH_HOST }}
LANGFUSE_BASE_URL: ${{ vars.LANGFUSE_BENCH_HOST }}
LANGFUSE_PUBLIC_KEY: ${{ secrets.LANGFUSE_BENCH_PUBLIC_KEY }}
LANGFUSE_SECRET_KEY: ${{ secrets.LANGFUSE_BENCH_SECRET_KEY }}
FACTORY_GIT_REF: ${{ github.sha }}
run: |
chmod +x benchmarks/run.sh benchmarks/lib.sh benchmarks/run-*.sh
benchmarks/run.sh ${{ matrix.benchmark }} ${{ steps.config.outputs.instance }} --timeout ${{ steps.timeout.outputs.value }} --solver ${{ matrix.solver }}

- name: Upload results
uses: actions/upload-artifact@v4
if: always() && steps.gate.outputs.run == 'true'
with:
name: benchmark-results-${{ matrix.benchmark }}-${{ matrix.solver }}
path: benchmarks/results/

- name: Print summary
if: always() && steps.gate.outputs.run == 'true'
run: |
Expand All @@ -203,6 +244,47 @@ jobs:
done
fi

- name: Analyze failures
if: always() && steps.gate.outputs.run == 'true'
continue-on-error: true
env:
CLAUDE_CODE_USE_VERTEX: "1"
ANTHROPIC_VERTEX_PROJECT_ID: ${{ secrets.GCP_PROJECT }}
CLOUD_ML_REGION: ${{ secrets.GCP_REGION }}
LANGFUSE_HOST: ${{ vars.LANGFUSE_BENCH_HOST }}
LANGFUSE_BASE_URL: ${{ vars.LANGFUSE_BENCH_HOST }}
LANGFUSE_PUBLIC_KEY: ${{ secrets.LANGFUSE_BENCH_PUBLIC_KEY }}
LANGFUSE_SECRET_KEY: ${{ secrets.LANGFUSE_BENCH_SECRET_KEY }}
run: |
pip install python-dotenv requests --quiet
for result_file in benchmarks/results/*.json; do
[ -f "$result_file" ] || continue
resolved=$(python3 -c "import json; print(json.load(open('$result_file')).get('resolved', False))")
if [ "$resolved" = "False" ]; then
echo "Analyzing failure: $result_file"
base="$(basename "$result_file" .json)"
python3 scripts/langfuse/analyze_failure.py "$result_file" \
--summary --output "benchmarks/results/${base}-summary.md" \
|| echo "Summary failed for $result_file (non-fatal)"
python3 scripts/langfuse/analyze_failure.py "$result_file" \
--output "benchmarks/results/${base}-analysis.md" \
|| echo "Analysis failed for $result_file (non-fatal)"
for suffix in summary analysis; do
f="benchmarks/results/${base}-${suffix}.md"
if [ -f "$f" ]; then
cat "$f" >> $GITHUB_STEP_SUMMARY
fi
done
fi
done

- name: Upload results
uses: actions/upload-artifact@v4
if: always() && steps.gate.outputs.run == 'true'
with:
name: benchmark-results-${{ matrix.benchmark }}-${{ matrix.solver }}
path: benchmarks/results/

report:
needs: benchmark
if: always()
Expand Down Expand Up @@ -253,6 +335,23 @@ jobs:
print(f'Processing: {f}', file=sys.stderr)
with open(f) as fh:
data = json.load(fh)

base = os.path.splitext(os.path.basename(f))[0]
summary_path = os.path.join(results_dir, base + '-summary.md')
analysis_path = os.path.join(results_dir, base + '-analysis.md')

if os.path.isfile(summary_path):
with open(summary_path) as sf:
data['trace_summary'] = sf.read().strip()
if os.path.isfile(analysis_path):
with open(analysis_path) as af:
data['trace_analysis'] = af.read().strip()

trace_id = (data.get('details') or {}).get('trace_id', '')
langfuse_host = os.environ.get('LANGFUSE_HOST', '')
if trace_id and langfuse_host:
data['trace_url'] = f'{langfuse_host}/trace/{trace_id}'

data['run_id'] = os.environ.get('RUN_ID', '')
data['commit'] = os.environ.get('COMMIT', '')
data['ref'] = os.environ.get('REF', '')
Expand All @@ -269,6 +368,7 @@ jobs:
REF="${{ github.ref }}" \
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
TRIGGER="${{ github.event_name }}" \
LANGFUSE_HOST="${{ vars.LANGFUSE_BENCH_HOST }}" \
python3 /tmp/append_results.py

echo 'DEBUG: results dir contents:'
Expand Down Expand Up @@ -354,6 +454,30 @@ jobs:
body += '_No benchmark results found._\n';
}

const summaryFiles = new Set();
for (const file of files) {
if (file.endsWith('-summary.md')) {
summaryFiles.add(file);
const benchName = file.replace('-summary.md', '').replace(/^\d{8}T\d{6}Z-/, '');
const summaryText = fs.readFileSync('results/' + file, 'utf8').trim();
const analysisFile = file.replace('-summary.md', '-analysis.md');
body += '**' + benchName + ':** ' + summaryText + '\n';
if (fs.existsSync('results/' + analysisFile)) {
const analysis = fs.readFileSync('results/' + analysisFile, 'utf8');
body += '<details><summary>Detailed analysis</summary>\n\n' + analysis + '\n</details>\n\n';
}
}
}
for (const file of files) {
if (file.endsWith('-analysis.md') && !summaryFiles.has(file.replace('-analysis.md', '-summary.md'))) {
const analysis = fs.readFileSync('results/' + file, 'utf8');
const benchName = file.replace('-analysis.md', '').replace(/^\d{8}T\d{6}Z-/, '');
body += '<details><summary>Failure Analysis: ' + benchName + '</summary>\n\n';
body += analysis;
body += '\n</details>\n\n';
}
}

const historyPath = 'benchmark-data/results.jsonl';
let baselines = {};
if (fs.existsSync(historyPath)) {
Expand Down
25 changes: 20 additions & 5 deletions .github/workflows/ceo-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ jobs:
if: >-
github.event.issue.pull_request &&
contains(github.event.comment.body, '@ceo-review') &&
contains(fromJSON('["akashgit", "xukai92", "colehurwitz", "shivchander", "osilkin98", "gx-ai-architect"]'), github.event.comment.user.login)
contains(fromJSON('["akashgit", "xukai92", "colehurwitz", "shivchander", "osilkin98", "gx-ai-architect", "RobotSail", "mihirathale98", "lukeinglis", "nehamalepati", "abhi1092", "s-akhtar-baig"]'), github.event.comment.user.login)
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 120

steps:
- name: React with eyes
Expand All @@ -34,11 +34,18 @@ jobs:
id: pr
run: echo "number=${{ github.event.issue.number }}" >> "$GITHUB_OUTPUT"

- name: Checkout PR merge ref
- name: Checkout default branch (trusted factory)
uses: actions/checkout@v4
with:
ref: ${{ github.event.repository.default_branch }}
path: factory-trusted

- name: Checkout PR merge ref (code under review)
uses: actions/checkout@v4
with:
ref: refs/pull/${{ steps.pr.outputs.number }}/merge
fetch-depth: 0
path: pr-code

- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
Expand All @@ -49,7 +56,10 @@ jobs:
uses: astral-sh/setup-uv@v4

- name: Install factory
run: uv sync
working-directory: factory-trusted
run: |
uv sync --extra telemetry
uv tool install -e .

- name: Set up Node.js
uses: actions/setup-node@v4
Expand All @@ -66,13 +76,18 @@ jobs:
claude --version

- name: Run CEO review
working-directory: factory-trusted
env:
CLAUDE_CODE_USE_VERTEX: "1"
ANTHROPIC_VERTEX_PROJECT_ID: ${{ secrets.GCP_PROJECT }}
CLOUD_ML_REGION: ${{ secrets.GCP_REGION }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FACTORY_MODEL: "claude-opus-4-6[1m]"
LANGFUSE_HOST: ${{ secrets.LANGFUSE_HOST }}
LANGFUSE_PUBLIC_KEY: ${{ secrets.LANGFUSE_PUBLIC_KEY }}
LANGFUSE_SECRET_KEY: ${{ secrets.LANGFUSE_SECRET_KEY }}
run: |
uv run factory ceo . --mode review --pr ${{ steps.pr.outputs.number }} --headless
factory ceo ${{ github.workspace }}/pr-code --mode deep-qa --pr ${{ steps.pr.outputs.number }} --headless

- name: Approve PR if verdict is KEEP
if: success()
Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,23 @@ jobs:
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync --all-groups
run: |
uv sync --all-groups
uv tool install -e .
- name: Ruff check
run: uv run ruff check .
- name: Mypy
run: uv run mypy factory/
- name: Lint contributed workflows
run: factory workflow lint-contributed
- name: Check plugin agents in sync
if: hashFiles('agents/') != ''
run: uv run python scripts/sync_agents.py --check
- name: Check no generated workflow skills committed
run: |
tracked=$(git ls-files 'skills/workflow-*/SKILL.md' 'skills/workflow-*/SKILL.annotations.yaml')
if [ -n "$tracked" ]; then
echo 'ERROR: Generated workflow skills should not be committed'
echo "$tracked"
exit 1
fi
Loading