Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
407 commits
Select commit Hold shift + click to select a range
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
8177ae1
docs: add plugin architecture guide and update architecture doc to fo…
shivchander Aug 18, 2026
c2d3a94
fix: restore docs/index.md to canonical old README.md content (#1307)
RobotSail Aug 18, 2026
c183d88
ci: parallelize test suite with pytest-xdist (#1299)
lambdabaa Aug 18, 2026
932127c
fix: thread --focus through study subgraph and skill export (#1293)
mihirathale98 Aug 18, 2026
0fed4da
ci: add lambdabaa to ceo-review allowed callers (#1313)
RobotSail Aug 18, 2026
81e2763
fix: remove conflicts.jsonl before branch checkout in conflict detect…
lambdabaa Aug 18, 2026
0ffdf02
fix: document all three execution modes in How It Works section (#1310)
RobotSail Aug 18, 2026
c2161fa
fix: use root-relative links in docs/index.md with mkdocs hook rewrit…
RobotSail Aug 18, 2026
fa17b77
feat: add --plugin and --folder flags for CREATE mode plugin packages
abhi1092 Aug 19, 2026
54172c5
docs: add plugin mode examples to CLAUDE.md
abhi1092 Aug 19, 2026
cfa29c4
fix: plugin mode should not commit to factory repo or open PR
abhi1092 Aug 19, 2026
720fd25
Merge pull request #1322 from abhi1092/factory/run-9cb8e47b
abhi1092 Aug 19, 2026
7f7a370
feat: multi-benchmark support for outer loop (#1325)
akashgit Aug 19, 2026
0277a07
refactor: remove unused evolver.md agent prompt (#1333)
lambdabaa Aug 19, 2026
58733a3
refactor: remove dead runners (bob, codex, opencode) (#1334)
lambdabaa Aug 19, 2026
8c021a5
docs: refresh mkdocs theme — monochrome palette, clean dark mode (#1337)
osilkin98 Aug 20, 2026
30b15e7
docs: overhaul README — strip to essentials, elevate 4 primary workfl…
akashgit Aug 20, 2026
6ea3931
feat: add smoke test harness for core factory modes (#1343) (#1355)
osilkin98 Aug 20, 2026
06485ac
docs: decouple README from symlink, share content via snippets (#1358)
osilkin98 Aug 20, 2026
6632909
fix: run Claude Code postinstall manually in CEO review CI (#1359)
lambdabaa Aug 20, 2026
91bfd4d
fix: gate verdict parsing fails closed on unrecognized output (#1354)
RohanAwhad Aug 20, 2026
fdfbf73
ci: add crqu to CEO review allowed users
gx-ai-architect Aug 20, 2026
60fdf1b
fix: bootstrap factory.md and config.json in design mode (#1336)
lambdabaa Aug 20, 2026
e46a214
Merge pull request #1367 from akashgit/add-crqu-ceo-review
gx-ai-architect Aug 20, 2026
bffc43b
fix: widen convergence_reason assertions to accept all valid values (…
osilkin98 Aug 20, 2026
09fdd73
fix: mock ONNX embedding function in mempalace tests to eliminate fla…
osilkin98 Aug 20, 2026
b7a689c
fix: restore README content from PR #1300 overhaul, lost in #1358 dec…
RobotSail Aug 21, 2026
cfed6e6
test: add integration tests for design and create workflow gate paths…
mihirathale98 Aug 21, 2026
5a1bf57
Extract SkillOpt to separate package under RobotSail (#1371)
osilkin98 Aug 21, 2026
9100b18
feat: add smoke/integration test harness for core CLI surfaces (#1372)
osilkin98 Aug 21, 2026
76d041a
fix: delete orphaned code with zero references (#1344) (#1374)
osilkin98 Aug 21, 2026
e2cfca0
fix: complete runner cleanup — remove remaining codex/bob/opencode re…
osilkin98 Aug 21, 2026
474505b
fix: remove 17 dead workflow modes from definitions.py and registry (…
RobotSail Aug 21, 2026
0c176b8
fix: correct 3 test bugs from workflow migration to build_workflow
RobotSail Aug 21, 2026
cdac5c8
fix: update 5 test files for remaining failures from workflow mode re…
RobotSail Aug 21, 2026
5ed3499
docs: update SPEC.md via spec-generate
RobotSail Aug 21, 2026
992d7d7
fix: remove unused imports and stale noqa directives (F401/RUF100)
RobotSail Aug 21, 2026
2ae67e9
fix: sort unsorted import block in test_user_config.py (I001)
RobotSail Aug 21, 2026
ec5d1b4
fix: remove 2 stale test assertions broken by PR #1376
RobotSail Aug 21, 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
30 changes: 24 additions & 6 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", "lambdabaa", "crqu"]'), 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,15 +56,21 @@ 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
with:
node-version: 22

- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
run: |
npm install -g @anthropic-ai/claude-code
# Run postinstall manually in case optional native binary was skipped
node "$(npm prefix -g)/lib/node_modules/@anthropic-ai/claude-code/install.cjs" || true

- name: Verify Claude Code on PATH
run: |
Expand All @@ -66,13 +79,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
30 changes: 28 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,21 @@ permissions:
contents: read

jobs:
smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync --all-groups
- name: Run smoke tests
run: uv run pytest -m smoke -v --tb=short

test:
needs: smoke
runs-on: ubuntu-latest
strategy:
matrix:
Expand All @@ -24,7 +38,7 @@ jobs:
- name: Install dependencies
run: uv sync --all-groups
- name: Run tests with coverage
run: uv run pytest -v --tb=short --cov=factory --cov-report=xml
run: uv run pytest -n auto -v --tb=short --cov=factory --cov-report=xml
- name: Upload coverage to Codecov
if: matrix.python-version == '3.12'
uses: codecov/codecov-action@v5
Expand Down Expand Up @@ -111,11 +125,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