Agent orchestration for developers
Coordinate AI agents without surrendering control.
Mythal brings AI coding agents into one supervised workflow. Route a task through implementation and independent review, inspect the inputs and code changes, and decide what gets integrated into your repository.
In development · macOS app and CLI · Demos by request
my-project · retry-policy · ~/worktrees/my-project/0042-retry-policy
Integrated into main
Worktree and branch cleaned up
- Request
- ~/code/my-project/specs/0042-retry-policy.md
- Worktree
- ~/worktrees/my-project/0042-retry-policy
branch retry-policy - Progress
- 3 of 4 steps · 11m 02s total
- Changes
- 3 commits · 4 files
1.6M in (92% cached) · 39.8k out · $4.61
History
- 9:29 PM
- 9:29 PM
- 9:29 PM
- 9:38 PM
- 9:39 PM
- 9:40 PM
- Status
- Completed · 41s
- Role
- product-owner → openai
- Model
- gpt-5.6 (agents.openai.model)
- Attempts
- 1
- Adapter
- openai
- Usage
- 38.2k in · 4.1k out · $0.19
- Artifacts
- 01-product-brief.md · 01-product-brief.json · snapshots/01-openai-brief-attempt-01.json
Add retry policy to the job scheduler
Jobs that fail due to transient errors (timeouts, 5xx from upstream) should be retried a bounded number of times with backoff. Permanent errors should not be retried. Record every attempt.
- specs/0042-retry-policy.mdSelected by the operator when the run startedwork item
- repository summaryRead-only listing of src/scheduler and docs/repository
- AGENTS.mdProject instructions read from the repositoryinstructions
Product brief: Add retry policy to the job scheduler
Give the scheduler a bounded, configurable retry policy so transient job failures recover without operator intervention, while permanent failures surface immediately.
Problem
Failed jobs are dropped after a single attempt. Operators re-run them by hand, and transient network errors look identical to real bugs in the run history.
Acceptance criteria (hard)
AC-1: A job that fails with a retryable error is re-queued with exponential backoff up to max_attempts.
AC-2: Each attempt is recorded with its error and delay; the final state distinguishes exhausted from succeeded.
AC-3: Non-retryable errors fail immediately with no backoff.
- 9:29:10engine
- 9:29:11openai
- 9:29:48openai
- 9:29:49engine
- 9:29:49engine
- 9:29:51engine
Nothing recorded for this step.
- Status
- Completed · 9m 12s
- Role
- builder → claude
- Model
- fable (agents.claude.model)
- Attempts
- 1
- Adapter
- claude
- Usage
- 1.6M in (92% cached) · 39.8k out · $4.61 · subscription
- Artifacts
- 02-claude-handoff.md · repository/after-claude-status.txt · repository/after-claude.diff · snapshots/02-claude-build-attempt-01.json
Implement the product brief in the worktree
Work only inside ~/worktrees/my-project/0042-retry-policy on branch retry-policy. Satisfy AC-1 through AC-3. Commit in coherent units. Do not modify unrelated files. Write a handoff summarizing what changed and how it was verified.
- specs/0042-retry-policy.mdSelected by the operator when the run startedwork item
- 01-product-brief.mdProduct brief · openai-product-owner · attempt 1prior step artifact
- ~/worktrees/my-project/0042-retry-policyIsolated worktree · branch retry-policy @ a91f0c3repository
- AGENTS.mdProject instructions read from the repositoryinstructions
Implementation summary
Added RetryPolicy with exponential backoff and a max_attempts bound. JobRunner now classifies errors as retryable or permanent and records each attempt on the job record.
Verification
All 214 tests pass, including 11 new tests covering backoff timing, attempt recording, and permanent-error short-circuit. No new compiler warnings.
Commits
7c1e2af feat(scheduler): add bounded retry policy · 3b90d1e test(scheduler): cover retry backoff · 5fa77c2 docs: describe retry policy
- 9:30:02engine
- 9:30:41claude
- 9:30:41claude
- 9:31:09claude
- 9:31:22claude
- 9:31:22claude
- 9:31:23claude
- 9:34:08claude
- 9:36:22claude
- 9:36:22claude
- 9:37:52claude
- 9:38:41claude
- 9:38:41claude
- 9:38:42engine
- 7c1e2afattempt 1
- 3b90d1eattempt 1
- 5fa77c2attempt 1
- modifiedsrc/scheduler/job_runner.py
- addedsrc/scheduler/retry_policy.py
- addedtests/test_retry_policy.py
- modifieddocs/scheduler.md
- Status
- Completed · 1m 08s
- Role
- reviewer → codex
- Model
- gpt-5.5
- Attempts
- 1
- Adapter
- codex
- Usage
- 212k in · 6.4k out · $0.71
- Artifacts
- 03-codex-review.md · snapshots/03-codex-review-attempt-01.json
Review the change against the product brief
Verify each acceptance criterion against the committed range a91f0c3 → 7c1e2af. Run the test suite. Record a verdict of approved or changes-requested with observations. Do not modify the code.
- 01-product-brief.mdProduct brief · openai-product-owner · attempt 1prior step artifact
- 02-claude-handoff.mdImplementation · claude · attempt 1prior step artifact
- repository/after-claude.diffCommitted range a91f0c3 → 7c1e2af · 27 KBchange snapshot
- ~/worktrees/my-project/0042-retry-policyIsolated worktree · read-only for this rolerepository
Verdict: approved
AC-1 pass: retryable errors re-queue with exponential backoff bounded by max_attempts (retry_policy.py:41).
AC-2 pass: each attempt records error and delay; JobRecord.state distinguishes exhausted from succeeded.
AC-3 pass: PermanentError short-circuits with no backoff (job_runner.py:88).
Observation (non-blocking)
Backoff jitter is deterministic in tests via a seeded RNG but the seed is a module constant; consider injecting it. No change required for acceptance.
- 9:38:50engine
- 9:38:55codex
- 9:38:55codex
- 9:39:05codex
- 9:39:05codex
- 9:39:14codex
- 9:39:41codex
- 9:39:57codex
- 9:39:57codex
- 9:39:58codex
- 9:39:59engine
- 7c1e2afattempt 1
- 3b90d1eattempt 1
- 5fa77c2attempt 1
- modifiedsrc/scheduler/job_runner.py
- addedsrc/scheduler/retry_policy.py
- addedtests/test_retry_policy.py
- modifieddocs/scheduler.md
- Reason
- Skipped — the operator integrated the worktree directly; no squash commit was requested.
- Status
- Skipped
- Role
- commit-message → openai
- Model
- gpt-5.6
- Attempts
- 0
- Adapter
- openai
- Usage
- —
- Artifacts
- —
This step was skipped. Nothing was recorded.
This step was skipped. Nothing was recorded.
This step was skipped. Nothing was recorded.
This step was skipped. Nothing was recorded.
This step was skipped. Nothing was recorded.
A recreation of the Mythal desktop app showing one run, the ordered steps it is made of — product brief, implementation, and review — and the details recorded for the selected step: its overview, input, context, output, logs, and code changes.
From request to reviewed code.
Each step has a defined role and recorded output. Use different agents or models where they are useful.
- 01
Request
Choose a Markdown work item and start the run.
- 02
Product brief
Capture requirements, non-goals, and acceptance criteria.
- 03
Implementation
An agent writes code in an isolated Git worktree.
- 04
Review
A separate agent checks the change and records a verdict.
- 05
Human decision
Inspect the result and decide whether to integrate it.
Human oversight isn't a fallback.
Coordinate the work.
Assign the product brief, implementation, and review to the agents and models suited to each step. Keep handoffs attached to the run.
Inspect what happened.
See the input, selected context, output, logs, and code changes for each step.
Decide what happens next.
Inspect the worktree before integrating it. When a run fails, review its recorded state and choose whether to resume.
See Mythal in action.
Mythal is in development. Get in touch for a demo of the macOS app and CLI workflow.
Thank you for your interest in Mythal. I’ll get back to you as soon as possible.