Agent catalog

Four agents. One codebase problem at a time.

Each Pylon agent targets one class of codebase problem. Migrate handles language version upgrades. Patch resolves CVEs at the dependency level. Refactor eliminates dead code using cross-module call graph analysis. Test fills coverage gaps via AST branch traversal. Each reads only the subgraph it needs and opens a PR your team can review and merge.

Abstract four-quadrant visualization representing Codepylon four agent types on dark background
Legacy modernization

Pylon-Migrate

Takes a module still written in Python 2, Rails 4, or jQuery 2 and submits a PR to bring it current. Before touching a single line, it reads the module, its full import chain, existing test coverage, and every caller in the codebase. One module, done correctly. Not done and broken.

Reads import chains to understand module boundaries
Updates existing tests to match new API signatures
Writes a PR description explaining every syntax change
Scoped to one module: does not drift into adjacent code
analytics/pipeline.py +42 -38
@@ -12,8 +12,8 @@ class DataPipeline: - def process(self, data): - items = data.items() - print "Processing %d items" % len(items) - return {k: v for k,v in items if v != None} + def process(self, data: dict) -> dict: + items = data.items() + print(f"Processing {len(items)} items") + return {k: v for k, v in items if v is not None} @@ -28,5 +28,5 @@ - raise ValueError, "Invalid input" + raise ValueError("Invalid input")
CVE remediation

Pylon-Patch

Parses your dependency tree, identifies the vulnerable package, selects the minimal version bump that resolves the CVE, updates any tests broken by the version change, and opens the PR with the advisory link and CVSS score in the description. Triggered via webhook from Dependabot, Snyk, or pip-audit, or dispatched manually.

Parses npm audit, pip-audit, Dependabot, and Snyk output
Selects the minimal version bump that resolves the CVE
Runs your test suite and fixes failures caused by the update
PR description links to the CVE advisory with CVSS score
package.json CVE-2025-4891
@@ -18,4 +18,4 @@ dependencies - "lodash": "^4.17.19", + "lodash": "^4.17.21", @@ -2,3 +2,3 @@ package-lock.json - "resolved": ".../lodash-4.17.19.tgz", - "integrity": "sha512-...(old)", + "resolved": ".../lodash-4.17.21.tgz", + "integrity": "sha512-...(new)",
Dead code elimination

Pylon-Refactor

Analyzes the full cross-module call graph to find functions with zero callers, variables assigned but never consumed, and duplicate logic across services. Before any deletion, it checks for dynamic dispatch via reflection, decorator-based routing, and config-driven invocation. If the analysis is ambiguous, the function is left in place and flagged in the PR description.

Cross-module call graph analysis, not just static search
Detects reflection-based calls before marking code dead
Consolidates duplicate logic into shared utilities
PR review section explains each removal with call-graph evidence
utils/formatters.py -84 lines
@@ -45,12 +45,0 @@ # dead: 0 callers found -def legacy_format_date(d, fmt=None): - """Deprecated: use format_date() instead.""" - if fmt is None: - fmt = "%Y-%m-%d" - return d.strftime(fmt) @@ -72,8 +60,0 @@ # duplicate of core/dates.py:145 -def _parse_timestamp(s): - return datetime.fromisoformat(s) +# consolidated in core/dates.py
Coverage gap fill

Pylon-Test

Maps your existing test suite against the AST branch structure of each module to find uncovered paths. Writes tests for those paths in your framework (pytest, Jest, RSpec) and mutation-verifies each one: the test must fail when the code it covers is intentionally broken. Placeholder stubs and happy-path-only tests are not accepted.

Coverage gap analysis via AST branch traversal
Generates tests in your existing framework (pytest, Jest, RSpec)
Mutation-checks each test: verifies it fails when code is broken
Reports which paths remain untested and why
tests/test_pipeline.py +67% coverage
@@ -0,0 +1,18 @@ # new: edge case tests +def test_process_empty_dict(): + p = DataPipeline() + assert p.process({}) == {} +def test_process_filters_none_values(): + p = DataPipeline() + result = p.process({"a": 1, "b": None, "c": 3}) + assert result == {"a": 1, "c": 3} +def test_process_raises_on_invalid(): + with pytest.raises(ValueError): + DataPipeline().process(None)

Pick an agent. Assign a job today.

Connect your repository and run the first agent job in minutes. Start with Pylon-Test if you want a zero-risk first PR: it only adds tests, it does not touch production logic.