Project Info
Inspiration
According to Stripe's Developer Coefficient — a study conducted with Harris Poll across thousands of engineers and C-suite executives in 30+ industries — 42% of every developer's working week is spent dealing with technical debt and bad code. That's nearly $85 billion in lost productivity every year, not from building the wrong things, but from fighting the accumulated mess in codebases that already exist. Every codebase we've worked on has the same graveyard: god-files no one touches, duplicate logic scattered across five modules, functions that were "temporary." Linters tell you what's wrong but not how to fix it. AI suggests restructuring, but is disconnected from the filesystem, hallucinates edits that don't apply, misses call sites, and forgets everything the moment the session ends. We wanted a tool that could act — read the code, propose a structural change, apply it, prove it's safe, and remember what it did. Something that makes mechanical cleanup as frictionless as running a linter. The hard lesson behind Refactorika: an LLM is brilliant at deciding what to refactor and dangerous at doing it. So we split the job — and that split is the whole product. The LLM reasons about what and how. Deterministic refactoring tools do the actual transformation, reference-correctly. A verification gate proves nothing broke — or reverts it. What it is Refactorika is an agent harness delivered as an MCP server, riding on a deterministic, graph-driven refactoring engine. It plugs Claude directly into your codebase, gives it a reference-correct model of the whole program to reason over, and routes every change it proposes through real refactoring tools and a verification gate stack — so cleanups land proven safe or not at all. It gives every repo the four capabilities they desperately need: Organization — splits god-files into coherent modules, reorders and deduplicates imports (stdlib → third-party → local), extracts helpers from bloated call sites. Complexity reduction — breaks long functions into named units, flattens deep nesting with guard clauses, replaces repeated blocks with parameterized helpers. Duplicate & dead-code removal — finds structural clones via AST fingerprinting and semantic near-clones via vector embeddings, then finds functions nothing reaches via call-graph reachability. Every removal goes through verification before it lands. Living documentation — generates and self-updates .refactorika/context/<module>.md files that compound across sessions, so the why doesn't evaporate when people leave. Three ways to run it, all over one verified spine: the MCP server (drive it from Claude), the engine CLI (refactorika <dir>), and the agent campaign (--agents: audit → dependency-ordered plan → specialist agents). How it works — the pipeline The whole design is a hard line between AI judgment and deterministic execution. The LLM never edits a file; it emits a typed TransformSpec. Real tools execute it. Gates decide whether it lives. 1 · The graph — reference-correct understanding. We build a whole-program symbol graph with Jedi's real static name resolution. Nodes are functions/classes/methods; edges are true references resolved through imports, aliases, and scopes — not a regex name match. This is the make-or-break: it's why a rename updates every real reference and nothing that merely shares the name, and why dead-code analysis (reachability from entry points like public API, __all__, __main__, tests, and route/fixture decorators) is trustworthy. The graph also gives us leaf-to-root ordering (refactor on top of already-verified code) and impact analysis (the exact set a change can affect → we re-run only the impacted tests). 2 · The plan — where the LLM reasons. The planner finds real smells — god functions detected by a three-axis cohesion signal (cyclomatic complexity ≥ 6 or length ≥ 30 lines or nesting ≥ 4, not a naive line count), duplicates, dead code — and asks the model how to fix them. The model returns a TransformSpec (parameters), never a diff. Before deciding, it recalls the most semantically similar prior decision from memory and reuses the same helper names, so the 2nd, 5th, Nth similar function is refactored consistently. 3 · The engines — real refactoring tools do the work (deterministic). These are battle-tested engines, not LLM text edits — so a cross-file rename is provably complete in a way prompting never is. Each returns an EditMap ({path: contents}) and touches nothing on disk — the gate stack owns disk and git. 4 · The verification gate stack — determinism's teeth. Every edit passes a cheapest-first, short-circuiting pipeline. Tools are the arbiter; no LLM decides whether an edit is safe. parse (tree-sitter, before touching disk) → lint (ruff, rejects only new violations vs. a pre-edit baseline) → type (pyright, only new errors — touching a file with pre-existing noise won't spuriously fail) → behavior (pytest, scoped to the impacted tests; no test coverage is recorded as a skip, never a silent pass). All green → git commit (one atomic commit per verified edit). Any red or crash → byte-for-byte restore. The full suite runs once at baseline (the repo must start green) and once at the finale ("all N still pass") as the authoritative backstop. 5 · The agent harness — bounded, self-repairing autonomy. The agent campaign drives the whole loop as an explicit state machine: discover the target with bounded exploration, select a change, execute a multi-file patch, verify it, and on gate failure repair-and-retry — escalating to skipped-needs-human rather than ever force-committing. 6 · Memory — Redis Iris, decision memory not a cache. Every refactoring decision (the pattern it acted on → the transform → the names chosen) is stored, keyed by an embedding of the code, so the engine stays consistent across a whole repo. This is one of four Redis Iris subsystems (below). Kill Redis and everything degrades transparently to local JSON — the engine never depends on it. Tech stack Core engine & the program graph Python 3.11+ Jedi — real static name binding → the reference-correct symbol graph (replaced a regex call-graph that mislinked same-named symbols) tree-sitter + tree-sitter-python — AST parsing, the parse gate, structural fingerprints, nesting depth FastMCP — MCP server framework (12 tools, JSON in/out) Typer — the engine CLI shell Deterministic refactoring tools rope — reference-correct cross-file rename/move LibCST — lossless AST-node replacement (decomposition) + surgical dead-code removal ruff + autoflake — deterministic cleanup radon — complexity metrics + god-function detection Verification gates ruff — lint + format normalization (new violations only) pyright — type checking (new errors only, vs. pre-edit baseline) pytest — behavior gate, impact-scoped; exit 5 (no tests) recorded as a skip, never a silent pass git — atomic commit per verified edit; rollback via byte-for-byte snapshot restore Duplicate & dead-code detection tree-sitter AST fingerprinting — exact structural clones OpenAI text-embedding-3-small (+ sentence-transformers keyless fallback; provider-agnostic, also Ollama) — semantic near-clone detection Redis FT.HYBRID (BM25 + vector, RRF-fused) — hybrid search; strictly better than pure cosine on code Custom call-graph reachability — dead-symbol detection with confidence levels Memory — Redis Iris Redis 8+ (local Docker redis:8 / redis-stack for the Query Engine) — primary state backend RedisVL — vector index + hybrid search client Four subsystems: AST-keyed LangCache · Hybrid Search Index (FT.HYBRID, RRF) · Agent Memory (cross-session decisions + history) · Context Retriever (hybrid + tag filters) Graceful fallback to local .refactorika/ JSON + brute-force vectors when Redis is unavailable Provider-agnostic LLM Generation (Anthropic Claude | Ollama) and embeddings (sentence-transformers | Ollama | OpenAI) are separate providers — Anthropic has no embeddings API, so the embedding backend works regardless of the generation provider. A record/replay cache keyed by (provider, model, prompt) makes any run reproducible. Language support LanguageAdapter registry — per-language parse/lint/typecheck dispatch. Python: full gate stack. Any other language: gates skip (recorded as null), the test suite still runs. TypeScript/Go adapters drop in via optional deps, no core changes. Infrastructure Git — atomic commits + snapshot rollback · .env / .env.example — secrets, never committed Benchmarking — does the harness actually help? We measured it the only honest way: the same agent, with the harness OFF vs ON, graded by an independent oracle (the repo's own tests), not by the harness itself. Simple proposer: harness lifts success 71.1% → 86.7% (32/45 → 39/45) — and spends fewer tokens (37k → 25k) and less time (190s → 160s). Safety that's also cheaper. Full agentic loop: harness lifts 75.6% → 83.3% while cutting tokens 1.37M → 806k and time 1,655s → 1,208s — the verified spine keeps the agent from thrashing. We also run on RefactorBench (microsoft/RefactorBench — 100 real multi-file refactoring tasks across Django, FastAPI, Celery, Scrapy, Salt, Ansible, Requests, Flask, Tornado, each verified by its own AST tests). Refactorika has a fixed transform menu, so we decline out-of-scope tasks explicitly rather than hallucinate, and report three honest numbers — in-scope pass rate, in-scope subtask completion, and out-of-scope count — never a single inflated figure. (Baseline LM agents solve ~22% of RefactorBench; it's a credibility signal, not an ace-it target.)
Challenges we ran into
The verification paradox. A change that looks clean to pyright can still silently break behavior. Getting pytest to run scoped to the impacted tests (fast enough to feel interactive), making the type/lint gates baseline-aware (reject only new errors, so touching a file with pre-existing noise doesn't revert a good edit), and handling missing coverage honestly (record a skip, never a silent pass) took real iteration. skipped-needs-human was a deliberate line: never force-commit, never pretend a gate passed that didn't run. Reference-correctness on real repos. This is the make-or-break. A regex call-graph cheerfully renames a same-named-but-unrelated symbol; rope crashes on intentionally-broken fixtures (Django ships syntax-error test files); the dead-code locator initially only found def/class, missing renamed constants. Real codebases are far messier than toy examples — we moved to Jedi binding for the graph and hardened every tool against the mess. Refactoring should make code less, not more. Our first LLM pass naively decomposed every long function and added hundreds of lines. "Decompose" is a structural trade, not a reduction — so we rebuilt god-function detection around a three-axis cohesion signal and biased the planner toward reduction (dead code, dedup, cleanup) over restructuring. Duplicate detection at the right granularity. Structural fingerprinting catches exact clones; semantic embeddings catch near-clones. Tuning the threshold to surface actionable duplicates without drowning in false positives (getter/setter pairs should look similar) required calibrating against real messy repos. Redis Iris offline fallback. We wanted Redis Iris as the primary memory layer but needed the demo to run anywhere — including a laptop with no network. Building a fallback that's genuinely transparent (same interface, same behavior, just slower and non-persistent) without a maintenance split was harder than expected. Tree-sitter sees syntax, not semantics. Call-graph reachability works for direct calls but misses dynamic dispatch, decorators that register functions implicitly, and __all__ exports. We set explicit confidence levels and surface uncertainty rather than silently over-delete.
What we learned
The hardest part of a safety-first refactoring tool isn't the refactoring — it's the division of labor. The LLM is the right tool for judgment (what's worth changing, how to name the pieces) and the wrong tool for execution (it can't guarantee a rename is complete). Deterministic engines are the reverse. Put the model in charge of "what," rope/LibCST in charge of "how," and the test suite in charge of "is it still correct" — and you get something you can actually trust. We also had to define "safe" precisely enough to enforce mechanically: malformed output (parse), style drift (ruff), type regression (pyright), and behavior change (pytest) are four different failures that need four different responses. And we learned that visible checking is the product. An agent that silently refactors and hands you a diff to trust is just a faster way to introduce bugs. Rendering the gate log — especially the catch-and-rollback moment — is what turns "AI did something to my code" into "I watched it get checked."
What's next
Broader duplicate consolidation — the flow surfaces duplicates and proposes a merge today; we want to close the loop by auto-generating the unified implementation and running it through the full gate stack (rope already does reference-correct moves; we're wiring consolidate as a first-class transform). Richer dead-code analysis — handle dynamic dispatch, decorator-registered entry points, and __all__-exported symbols more precisely to push confidence levels up. Per-module context cards — generate_docs already emits .refactorika/context/ files; make them queryable via get_context_map so Claude can answer "why does this module look this way?" with grounded, session-persistent memory. More languages — the LanguageAdapter registry already abstracts parse/lint/typecheck; TypeScript and Go gates drop in as optional deps, no core changes. Built with python · jedi · rope · libcst · tree-sitter · ruff · autoflake · pyright · pytest · radon · redis · redisvl · fastmcp · anthropic · ollama · openai · sentence-transformers · typer · git
Refactorika
📚 Full documentation:
docs/. New here? Refactorika has two branches —working(the demo: MCP agent harness + four-arm benchmark) andmain(this branch: the v3 graph engine). Read docs/branches.md first.
A graph-driven, verified refactoring engine for Python. Point it at a repo; it builds a reference-correct model of the whole program, plans a safe dependency order, applies deterministic transforms, and proves nothing broke — committing each verified change and reverting anything that fails its tests.
The pitch: refactoring is a whole-program graph problem, not a per-file one. The LLM brings judgment, deterministic engines bring correctness at scale, the graph connects them, and the test suite proves behavior is preserved.
What makes it correct
- Real reference resolution, not regex. A symbol graph built from Jedi static analysis: a rename updates every true reference and nothing that merely shares the name; dead code is removed only when reachability proves it dead.
- Deterministic engines own the edits. rope (cross-file rename), LibCST (node replacement, dead-code removal), ruff + autoflake (cleanup). The LLM emits compact specs, never diffs.
- Verified, then committed. Every edit passes parse → ruff → pyright → pytest (tests
impact-scoped to what the change can affect) before
git commit; any failure reverts the files byte-for-byte. The full suite gates the run at baseline and finale. - Efficient by construction. Leaf-to-root ordering means each step builds on already-verified code; only impacted tests run per edit.
Quickstart
Full how-to (every flag, the MCP tools, the agent campaign, Redis, eval):
docs/usage.md.
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]" # add ".[semantic]" for embeddings/vector recall
docker compose up -d redis # optional: live Redis (redis-stack); else JSON fallback
# Dry-run on the bundled messy repo (no changes written): see the plan, the verified
# edits (dead code removed + cleanup), and the before/after metrics.
.venv/bin/refactorika demo_repo
# Inspect without running:
.venv/bin/refactorika demo_repo --show-graph # the symbol graph, entry points, dead code
.venv/bin/refactorika demo_repo --show-plan # the leaf-to-root worklist
# Apply in place (commits each verified edit to git):
.venv/bin/refactorika demo_repo --apply
# Reference-correct rename across the whole repo (the centerpiece) — deterministic:
.venv/bin/refactorika demo_repo --rename orders.compute_total=calculate_order_total
# Add LLM judgment: god-function decomposition with consistent naming via decision memory.
# The first run with ANTHROPIC_API_KEY records responses to .refactorika/llm_cache.json;
# subsequent runs replay that cache offline (no key needed).
.venv/bin/refactorika demo_repo --llm
# Run the agentic campaign (audit -> plan -> specialist agents) through the verified engine.
# Applies in place; complexity decomposition needs ANTHROPIC_API_KEY.
.venv/bin/refactorika demo_repo --agents
# Inspect decision memory / semantic neighbors:
.venv/bin/refactorika demo_repo --show-memory
.venv/bin/refactorika demo_repo --show-similar orders.compute_total
# Tests (offline — no Redis, no API key needed):
REFACTORIKA_OFFLINE=1 .venv/bin/python -m pytest -q
Run as an MCP server (use inside an agent)
.venv/bin/python -m refactorika.mcp_server # stdio MCP server
claude mcp add refactorika -- .venv/bin/python -m refactorika.mcp_server
Tools: build_graph, get_plan, run_pipeline, run_agents, analyze_file,
find_duplicates, find_dead_code, apply_and_verify(_multi), generate_docs,
get_context_map, get_log. Full reference in docs/usage.md.
Providers, memory, and evaluation
- Provider-agnostic LLM — generation via Claude or local Ollama, embeddings via local
MiniLM or Ollama (separate, since Anthropic has no embeddings API). Selected by env
(
REFACTORIKA_LLM_PROVIDER,REFACTORIKA_EMBED_PROVIDER); a record/replay cache makes any provider reproducible. See.env.example. - Redis as the shared brain — decisions are stored in Redis (
REDIS_URL, e.g. Redis Cloud) and recalled by semantic similarity so refactors stay consistent; local-JSON fallback for offline (REFACTORIKA_OFFLINE=1). Inspect withrefactorika <dir> --show-memory;docker compose up -d redisruns a local instance. - RefactorBench eval —
make fetch && make eval-inscoperuns the engine on real OSS refactoring tasks; results ineval/results/. Seedocs/11-benchmarks-and-eval.md.
How it works
CLI / MCP → orchestrator → graph (Jedi) → planner (+LLM judgment) → engines (rope/LibCST/ruff)
→ checker (gates + git)
Redis Iris = graph + decision memory + vectors (local-JSON fallback)
Layout
refactorika/graph/ reference-correct symbol graph + leaf-to-root order + impact
refactorika/transforms/ deterministic engines (rename, cleanup, dead_code, node_replace)
refactorika/pipeline/ orchestrator · planner · planner_llm · checker
refactorika/llm/ Anthropic client with record/replay cache + stub seam
refactorika/memory/ Redis Iris: agent/decision memory, vectors (JSON fallback)
refactorika/core/ schema · gates · storage
refactorika/cli.py standalone Typer CLI refactorika/mcp_server.py MCP server
demo_repo/ deliberately messy target + its tests
docs/v3_spec.md the source-of-truth spec (as built)
Python only; behavior-preserving structural refactors. See docs/v3_spec.md for the full spec
and CLAUDE.md for project memory.
Analysis
View
Metric
- 32
- 32
- 28
- 27
- 20
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- OpenAIIn code
- PythonIn code
- RedisIn code
3 of 3 appear in the indexed code.
AI coding agents
- Claude CodeConfig · Commits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.2 MB
Source files
182
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Tanush-A/Refactorika
195 files · 1.6 MB · @ 4f98944
Structure
Application logic
96 files · 49%Domain rules, services and shared utilities.
+10 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python69%
- Markdown30%
- Shell1%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
pyproject.toml
pypi · 19- anthropic[mcp]
- autoflake
- jedi
- libcst
- numpy
- radon
- redis
- rope
- sentry-sdk
- tree-sitter
- tree-sitter-python
- typer
- +7 more
eval/requirements.txt
pypi · 6- pyright
- pytest
- ruff
- sentry-sdk
- tree-sitter
- tree-sitter-python
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Agent campaign (--agents specialist dispatch)Verified
Agent campaign dispatches confirmed-plan tasks to specialist agents (import, dead-code, complexity, duplicate) through the verified engine, serialized writes, rebuild graph per task
Claimed on readmehigh confidencerefactorika/agents/orchestrator.py:25— _SPECIALISTS list of ImportAgent, DeadCodeAgent, ComplexityAgent, DuplicateAgent, dispatched via dispatch_plan through the shared Checker
Atomic commit / byte-for-byte revert per editVerified
All gates green triggers a git commit; any failure restores files byte-for-byte
Claimed on readmehigh confidencerefactorika/pipeline/checker.py:111— verify_apply calls self._commit on all-green and self._rollback (writes back original text) on any gate failurerefactorika/pipeline/checker.py:136— _commit runs git add + git commit per verified edit
Baseline and finale full-suite gateVerified
Full test suite runs once at baseline and once at finale as the authoritative backstop
Claimed on readmehigh confidencerefactorika/pipeline/checker.py:114— run_full_suite method runs test_gate over the whole repo, used for baseline/finale checks
CLI with inspect/apply/rename/agents flagsVerified
Typer CLI supporting --show-graph, --show-plan, --show-memory, --show-similar, --rename, --apply, --agents, --llm
Claimed on readmehigh confidencerefactorika/cli.py:39— typer.Option definitions for --apply, --show-graph, --show-plan, --show-memory, --show-similar, --llm, --agents, --rename
Deterministic transform engines (rope/LibCST/ruff)Verified
rope for cross-file rename, LibCST for node replacement/dead-code removal, ruff+autoflake cleanup, engines only return EditMap and never touch disk
Claimed on readmehigh confidencerefactorika/transforms/rename.py— rope-based rename enginerefactorika/transforms/node_replace.py— LibCST-based node replacementrefactorika/transforms/dead_code.py— LibCST-based dead-code removal engine
Duplicate detection (structural + semantic)Verified
Structural clones via AST fingerprinting and semantic near-clones via embeddings
Claimed on Devposthigh confidencerefactorika/analysis/duplicates.py:159— SHA1 structural fingerprint tier plus a semantic embedding tier using cosine similarity
God-function detection (3-axis)Verified
Detects god functions via cyclomatic complexity >=6 OR length >=30 OR nesting >=4
Claimed on Devposthigh confidencerefactorika/analysis/parser.py:100— max_nesting_depth function used alongside complexity/length metrics for god-function detection
Import reordering/deduplication (stdlib -> third-party -> local)Verified
Reorders and deduplicates imports in stdlib -> third-party -> local order
Claimed on Devposthigh confidencerefactorika/transforms/imports.py:1— docstring and bucket function implement stdlib/third-party/local import ordering and dedup
Jedi-based reference-correct symbol graphVerified
Whole-program symbol graph built with Jedi's real static name resolution, not regex
Claimed on readmehigh confidencerefactorika/graph/resolver.py:20— imports jedi and uses jedi.Project/jedi.Script to build the graph
Leaf-to-root ordering and impact analysisVerified
Tarjan SCC leaf-to-root topo order plus impact_of/reachable_from analysis
Claimed on readmehigh confidencerefactorika/graph/order.py:39— impact_of function computing reverse reachabilityrefactorika/graph/order.py:57— reachable_from function for dead-code detection
Living documentation (self-updating context files)Verified
generates and self-updates .refactorika/context/<module>.md files that compound across sessions
Claimed on Devposthigh confidencerefactorika/docs_gen.py:107— ctx_file path template .refactorika/context/{slug}.mdrefactorika/docs_gen.py:154— generate_docs comment describing run-1, run-2 compounding behavior
LLM decision memory with semantic recallVerified
Planner recalls the most semantically similar prior decision and reuses helper names for consistency
Claimed on readmehigh confidencerefactorika/pipeline/planner_llm.py:126— dm.recall(source, pattern) called before proposing a decomposition, then reused in the rationalerefactorika/memory/decision_memory.py:4— DecisionMemory indexed by embedding of the code it acted on
MCP server with tool suiteVerified
FastMCP-based MCP server exposing tools like build_graph, get_plan, run_pipeline, run_agents, etc.
Claimed on readmehigh confidencerefactorika/mcp_server.py:24— FastMCP("refactorika") instancerefactorika/mcp_server.py:107— build_graph, get_plan, run_pipeline, run_agents tools decorated with @mcp.tool()
Provider-agnostic LLM (generation + embeddings)Verified
Generation via Anthropic Claude or Ollama; embeddings via local MiniLM, Ollama, or OpenAI, selected via env vars
Claimed on readmehigh confidencerefactorika/llm/providers.py:88— AnthropicProvider and OllamaProvider generation classesrefactorika/llm/providers.py:166— LocalEmbeddingProvider, OllamaEmbeddingProvider, OpenAIEmbeddingProvider classes selected by REFACTORIKA_EMBED_PROVIDER
Redis Iris memory with JSON fallbackVerified
Redis-backed decision/agent memory and vector index, hybrid search (FT.HYBRID, BM25+vector RRF), graceful local-JSON fallback when Redis is unavailable
Claimed on Devposthigh confidencerefactorika/memory/vector_index.py:221— hybrid BM25 + vector RRF query via RedisVL HybridQuery, with vector-only fallback when Redis is not live
RefactorBench eval (100 OSS tasks, 3 honest numbers)Verified
Runs the engine on 100 real OSS tasks, reports in-scope pass rate 54.5% (6/11), 90.9% subtask completion, 89/100 declined
Claimed on readmehigh confidenceeval/results/base_all_memoff.json— totals.all_tasks=100, out_of_scope=89, in_scope_pass_rate=0.545, in_scope_subtask_completion=0.909, in_scope_passes=6 exactly matching the claimeval/refactorbench.py— the eval harness script that generates these results
Sentry integrationVerified
Uses Sentry (listed in Built With) for observability
Claimed on Devposthigh confidencerefactorika/observability.py:1— "Privacy-safe, fail-open Sentry integration" with sentry_sdk.init/capture_exception wired to SENTRY_DSN env var
Verification gate stack (parse -> ruff -> pyright -> pytest)Verified
Cheapest-first, short-circuiting gate stack: tree-sitter parse, ruff (new violations only), pyright (new errors only), pytest impact-scoped, exit 5 recorded as skip
Claimed on readmehigh confidencerefactorika/core/gates.py:49— parse_gate using tree-sitter to detect ERROR/MISSING nodesrefactorika/core/gates.py:69— lint_gate rejects only new ruff violations vs baselinerefactorika/core/gates.py:104— typecheck_gate rejects only new pyright errors vs baselinerefactorika/core/gates.py:116— test_gate runs pytest scoped to node_ids, exit code 5 treated as skip not silent pass
Skipped-needs-human escalation on repeated gate failureCode-supported
On gate failure the agent harness repairs and retries, escalating to 'skipped-needs-human' rather than force-committing
Claimed on Devpostmedium confidencerefactorika/agents/orchestrator.py:71— dispatch_plan tracks committed/rolled_back/skipped counts and routes unmatched tasks to skipped, but no explicit repair-and-retry loop or 'skipped-needs-human' label was found in this file
Devin usage in project buildBlocked
Devin listed as part of the tech/build stack
Claimed on Devpostlow confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.