Repository navigation
Releases: mad-core/mad-edge
Release list
v0.6.2
v0.6.2 (2026-07-15)
Bug Fixes
- config: Make post-run auto-sync opt-in (off by default) (
2c1a6dd)
Flip DEFAULT_AUTO_SYNC from True to False: when nothing is configured, Mad no longer fires the post-run auto-sync run, so no mad/<session_id> branch and no PR are created unless a deployment, session, or task explicitly opts in. Publishing leftover work to a generic branch is the exception, not the norm — most tasks manage their own named branch/PR, and an unrequested second PR next to the real one is noise (issue #109).
The precedence chain is unchanged (task > session > MAD_AUTO_SYNC env > default); only the terminal default and the operator-facing framing flip from opt-out to opt-in. MAD_AUTO_SYNC=true (or a per-session/per-task auto_sync=true) restores the safety net. Tests updated to the new contract: default-behavior assertions now expect the launcher to run once with agent.autosync.skipped, and the tests that exercise the auto-sync path opt in explicitly.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Signed-off-by: Jose Salamanca jose.salamancacoy@gmail.com
- http: Gate post-run auto-sync to stop duplicate PRs (
db4b411)
Auto-sync fired a second agent run after every task and, blind to the branch the task was told to use, published to mad/<session_id> and opened a DUPLICATE PR next to the real one. Expose an auto_sync toggle on POST /v1/sessions, POST /v1/sessions/{id}/tasks and their MCP tools (resolution task > session > MAD_AUTO_SYNC > true): when it resolves False the second launcher run never starts, so no branch and no PR can be created — an agent.autosync.skipped event records the decision. Also surface the MAD_AUTO_SYNC operator default read-only on GET /v1/config, and harden the fallback prompt to adopt an existing branch/PR, check before creating, and never force-push. A mad-edge consumer can now let a task own its own branch/PR without Mad shadowing it.
Closes #109 Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Signed-off-by: Jose Salamanca jose.salamancacoy@gmail.com
Detailed Changes: v0.6.1...v0.6.2
v0.6.1
v0.6.1 (2026-07-04)
Features
- http: Add read-only GET /v1/config with mad_get_config MCP parity (
ece94c4)
Expose the server's effective operational configuration for operators and agents. Builds on the centralized settings module (#97): the endpoint serializes the resolved Settings snapshot.
GET /v1/configreturns a typedConfigResponse(hard rule 9): each operationalMAD_*tunable as{value, source}wheresourceisenv|default(agent timeout, sessions dir/retention, SSE heartbeat, MCP allowed hosts, workspace dir, hook socket, CLI bins). - Credentials are NEVER returned — not even masked. Onlyset/unsetbooleans appear undercredentials(GITHUB_TOKEN/GH_TOKEN, ANTHROPIC_API_KEY, CLAUDE_CODE_OAUTH_TOKEN, AWS_ACCESS_KEY_ID) (hard rule 2). - Mirrored MCP toolmad_get_configcalls the SAMEGetConfigUseCaseand returns the SAMEConfigResponsemodel (hard rule 13); the parity and drift tests stay green. - Read-only by design: no write path, no hot reload — the durable owner is the host.env(issue #107).
Use case core/config/use_cases/get_config.py reads the settings snapshot fresh through an injected provider (default load_settings), so the endpoint reflects the process environment at request time and stays testable.
Tests (eight heuristics): OpenAPI contract test + read-only 405 negative twin, env-source vs default-source twins, and an explicit property test asserting a real GITHUB_TOKEN / ANTHROPIC_API_KEY in the env never appears in the HTTP or MCP response body.
Closes #107
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01GWHBALtjHVd176YddWc9YP
Signed-off-by: Jose Salamanca jose.salamancacoy@gmail.com
Detailed Changes: v0.6.0...v0.6.1
v0.6.0
v0.6.0 (2026-07-04)
Features
- cli: Rename distribution to mad-edge and console script to mad-edge (
8c05c58)
Rename the published PyPI distribution from mad-bros to mad-edge and the console script from mad to mad-edge (mad-edge serve). The import package stays mad, so no source module moves. Updates packaging metadata, the Docker image (pip install + ENTRYPOINT), compose/.env examples, the release and TestPyPI-preview workflows, CLAUDE.md, operator-facing docs, and the CLI entry-point tests to match. The mad command is reassigned to the separate mad-cli operator tool.
BREAKING CHANGE: the PyPI distribution is now mad-edge and the console script is mad-edge (mad-edge serve). The import package remains mad. The mad command now belongs to the separate mad-cli operator tool.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01GWHBALtjHVd176YddWc9YP
Signed-off-by: Jose Salamanca jose.salamancacoy@gmail.com
Breaking Changes
- cli: The PyPI distribution is now
mad-edgeand the console script ismad-edge(mad-edge serve). The import package remainsmad. Themadcommand now belongs to the separate mad-cli operator tool.
Detailed Changes: v0.5.26...v0.6.0
v0.5.26
v0.5.26 (2026-07-04)
Bug Fixes
- Deprecate mad-bros distribution in favor of mad-edge (
c5b334d)
The distribution is being renamed to mad-edge; this final mad-bros release carries the deprecation notice on the PyPI project page so consumers land on the new name. No further versions will be published under mad-bros.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01GWHBALtjHVd176YddWc9YP
Signed-off-by: Jose Salamanca jose.salamancacoy@gmail.com
Detailed Changes: v0.5.25...v0.5.26
v0.5.25
v0.5.24
v0.5.24 (2026-06-27)
Features
- http: Add POST/GET /v1/workflows for session chaining (
54a3485)
Expose the workflow surface to consumers: POST /v1/workflows creates a workflow that chains sessions sequentially, propagating each step's produced branch to its dependents; GET /v1/workflows/{workflow_id} returns its current state. Both routes are mirrored as the mad_create_workflow / mad_get_workflow MCP tools calling the same use cases in-process (hard rule 13), keeping HTTP and MCP at parity. app.py wires the coordinator + read projection (with log bootstrap, hard rule 6) and the workflow exception handlers; dependencies/cli plumb the new read-model element through the composition root.
The HTTP/MCP parity and route tests verify the contract; ADR-0013 records the design. This is the consumer-facing slice of #90.
Closes #90 Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Detailed Changes: v0.5.23...v0.5.24
v0.5.23
v0.5.23 (2026-06-27)
Features
- http: Add per-task effort with task > session > deployment precedence (
aef916b)
A mad-bros consumer can now set an opaque reasoning-effort per task on POST /v1/sessions/{id}/tasks (and the mirrored mad_enqueue_task MCP tool), surfaced back on the task entries from GET. The value is forwarded verbatim to the launcher and never validated, mirroring per-task model. Resolution precedence is task > session > deployment, so one session's queue can mix a cheap docs task with a high-effort migration without opening a session per level.
Closes #81 Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Detailed Changes: v0.5.22...v0.5.23
v0.5.22
v0.5.22 (2026-06-27)
Features
- sse: Emit task.git_result event after a task completes (
357e2cf)
A consumer watching GET /v1/events/stream now receives a new task.git_result event immediately after task.completed, carrying the branch the work landed on and the commits the agent created since the dispatch baseline (base_sha..head_sha), plus dirty/pushed flags. This gives mad-bros per-task git traceability without parsing agent output — Mad observes the workspace's git state read-only (hard rule 1).
The dispatcher captures HEAD at task.dispatched and inspects the workspace after completion via a new read-only GitInspector port (SubprocessGitInspector adapter), kept out of mad.core per hard rule 4. Capture is best-effort: a non-git workspace or any git failure omits the event and never fails the task.
Closes #88 Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Detailed Changes: v0.5.21...v0.5.22
v0.5.21
v0.5.21 (2026-06-27)
Features
- config: Source GitHub clone PAT from host env; deprecate inline PAT (
72bd84f)
Consumer-visible surface of #89. The GitHub clone credential is now sourced from the host's GITHUB_TOKEN (or GH_TOKEN) environment variable rather than the request body. This establishes Mad's configuration principle for access to external services: credentials follow each ecosystem's conventional env-var name, while the MAD_* namespace stays reserved for operational tuning.
The inline ResourceRequest.authorization_token is marked deprecated in the schema (OpenAPI/MCP), removal targeted for v0.6.0, because passing a secret through the request body risks leaking it into client logs and MCP transcripts; when still supplied it takes precedence and emits a deprecation warning. A failed clone (e.g. a private repo with no host credential) now surfaces as a 502 with an actionable hint instead of a silent anonymous clone that 404s.
Docs (README, docker, cloudflare-tunnel) document the env-sourced credential and the inline deprecation; backlog records the Stage-2 removal milestone.
Closes #89
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Detailed Changes: v0.5.20...v0.5.21
v0.5.20
v0.5.20 (2026-06-27)
Bug Fixes
- agents: Don't re-run primary when auto-sync hits a rate limit (
099e099)
A RateLimitError raised by the post-run auto-sync (#8) invocation — after the primary run had already succeeded — propagated through the dispatcher's retry loop and re-executed the already-completed primary prompt, wasting work and risking duplicate commits/branches/PRs.
Catch RateLimitError in the auto-sync block ahead of the broad except: surface a new non-terminal agent.autosync.rate_limited {reason} event instead of session.error, leave the primary task.completed, and do not re-raise. A consumer now observes a best-effort signal rather than a spurious terminal failure and a repeated run. Primary-run rate limits still retry cleanly; non-rate-limit auto-sync failures stay terminal.
Closes #87 Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Detailed Changes: v0.5.19...v0.5.20