Skip to main content
Changelog

What shipped.

Auto-generated by Origin from this repo's PRs. Read from marketing/changelog/*.md at build time. Updated on every release.

Source: pypi.org/project/devrel-origin · main

  • v0.2.132026-05-139c7a032Hand-written

    Wizard UX fixes from real user testing + audit hygiene

    Real-user testing on v0.2.12 surfaced three onboarding bugs and one release-blocker. v0.2.13 fixes all four plus the recommendations from a full pre-rename audit.

    The wizard's first-draft step was crashing with `ANTHROPIC_API_KEY is required` even when `OPENROUTER_API_KEY` was configured. v0.2.12 shipped the wizard before PR #3's `_build_llm_client(paths)` signature change, so the wizard's call to `_build_llm_client()` (no args) hit the Anthropic-only legacy code path. v0.2.13 ships the fix to PyPI.

    `devrel init` was asking for `github-repo` even when run inside a git working copy. Now auto-detects from `git remote get-url origin`, parses `https://github.com/...` and `git@github.com:...` URLs, and offers the result as a prompt default.

    Vi as the default editor for the voice-edit step was a known onboarding killer. New `_pick_editor()` helper: `$VISUAL` → `$EDITOR` → first installed of `{nano, micro, code}` → vi as POSIX last resort. The wizard names the chosen editor in the prompt so users aren't surprised.

    The content-type prompt accepted typos: a real user typed `bblog_post` in testing and it silently became the content type. Now a numbered picker (`1) tutorial 2) blog_post 3) landing_page 4) cold_email 5) battle_card`) that accepts both numbers and exact names; rejects typos and reprompts.

    Security: `urllib3>=2.7.0` pinned in core deps to mitigate CVE-2026-44431 and CVE-2026-44432 (transitively pulled via httpx and PyGithub at the vulnerable v2.6.x range). Internal: `pyproject.toml` description updated (13 → 15 agents, BYO Anthropic or OpenRouter key); `CLAUDE.md` agent count and CLI verb count refreshed; 10 new tests in `tests/cli/test_init_command.py`. Suite at 1018 passed; ruff and format clean.

    1 PR included
    • PR #3

    Drafted by human. Reviewed by Daria. Merged at May 13, 2026, 10:45 AM UTC.

  • v0.2.122026-05-113e1a929Hand-written

    Onboarding overhaul (interactive init wizard)

    `devrel init` is now an interactive wizard that walks you from a fresh shell to your first content draft in one session: scaffold `.devrel/`, configure an LLM key (provider picker, key entry, one-token validation, auto-skipped if a key is already in `.devrel/.env`), run a health check inline, open `voice.md` in `$EDITOR` for voice samples, then prompt for topic and content type and generate the first draft via Kai. Persists `<slug>.md` and `<slug>-trace.json` to deliverables.

    New flags to opt out of pieces of the chain: `--skip-chain` (scaffold only, matches pre-0.2.12 behavior), `--skip-draft` (chain through health check and voice edit but stop before the LLM call), `--non-interactive` (implies `--skip-chain`, CI shape unchanged). `devrel auth` success message now ends with explicit "Next steps" pointing at `devrel doctor` and `devrel content draft "..."` so users know what to run next.

    README quick start now leads with `devrel init` as a one-command onboarding entry point. The old `init → auth → doctor → draft` sequence is documented under "skip flags for non-default flows." Suite at 997 passed; ruff and format clean.

    Drafted by human. Reviewed by Daria. Merged at May 11, 2026, 05:16 PM UTC.

  • v0.2.112026-05-116105539Hand-written

    Fix OpenRouter 400 on default model ids

    `devrel run` and `devrel auth` no longer 400 on OpenRouter. The hardcoded default model ids in `core/llm_backends.py` used Anthropic's dated suffix (`anthropic/claude-sonnet-4-5-20250929`), which OpenRouter rejects with 400 Bad Request. OpenRouter uses dot notation without a date suffix; bumped the three `OPENROUTER_ALIASES` to the real ids: `sonnet` → `anthropic/claude-sonnet-4.5`, `haiku` → `anthropic/claude-haiku-4.5`, `opus` → `anthropic/claude-opus-4`.

    Native Anthropic backend ids are unchanged: the dated form is what Anthropic's API expects. The `LLMBackend.resolve_alias` docstring and the OpenRouter section comment now spell out the dot-notation rule with the 400-Bad-Request symptom called out, so the next reader doesn't re-introduce the bug.

    Drafted by human. Reviewed by Daria. Merged at May 11, 2026, 04:52 PM UTC.

  • v0.2.102026-05-11b0d3830Hand-written

    Output grounding

    Two changes that close grounding gaps surfaced during PostHog dogfooding: content paths now refuse to silently produce ungrounded output, and the CLI verb that pitches the editorial pipeline now actually uses the KB.

    Kai evidence gates: `Kai.execute` refuses to generate when no KB, official-docs, or repository evidence is available, returning `status="insufficient_evidence"` with an `evidence_gaps` list instead of silently producing ungrounded content. Task-shape gating: prompts that ask for "pain points" or "GitHub issues" or "file paths" require the matching upstream signal or short-circuit.

    `devrel content draft` now routes through Kai (was: a generic "writer producing a first draft" system prompt). Kai's path searches `.devrel/kb`, fetches official docs via SearchTools when configured, runs the editorial pipeline via `generate_with_pipeline`, and validates code blocks. The trace JSON carries `grounding_sources`, `pain_points_addressed`, `real_issues_referenced`, `revision`, and `code_validation`. Exits nonzero on `insufficient_evidence` or `blocked_by_quality_gate`.

    Atlas now builds a compact evidence pack (top Dex modules, Sage issues, Iris pain points) and threads it into Kai's stage-3 task. Forbidden-claims list bans inventing SDK methods, endpoints, install commands, file paths, benchmarks, or issue numbers. Weekly deliverables are persisted to `.devrel/deliverables/<week>/<slug>.md` plus a trace JSON.

    Code validator gained `bash`, `sh`, `zsh`, `yaml`, `yml` coverage with a `rm -rf /` guard. Suite at 992 passed; ruff and format clean.

    2 PRs included
    • PR #1
    • PR #2

    Drafted by human. Reviewed by Daria. Merged at May 11, 2026, 10:33 AM UTC.

  • v0.2.92026-05-08ddef091Hand-written

    BYO-key onboarding polish

    Reduces the friction between `pipx install devrel-swarm` and a working `devrel run`. None of the policy-disallowed Claude-Code-session-auth paths (see Anthropic's Agent SDK terms); the goal is just to make BYO-key as short a setup as possible.

    `devrel auth`: interactive verb that picks Anthropic or OpenRouter, takes the key, validates it with a one-token ping, and writes `.devrel/.env` with `chmod 600` (via `dotenv.set_key`, so other entries are preserved). Flags: `--provider {anthropic,openrouter}`, `--key VALUE`, `--rotate`, `--no-validate`, `--non-interactive`. Output masks the key as `<first4>...<last4>`. Registered between `init` and `doctor` so the discoverability order is `init → auth → doctor → run`.

    Auto-load `.devrel/.env`: every CLI verb that builds Atlas now calls `python-dotenv` on `.devrel/.env` (preferred) and project-root `.env` (fallback) before reading env vars, so users no longer need to `export` anything in their shell. `override=False`: shell-exported keys still win for one-shot debugging.

    Missing-key error message points at the fix. Instead of `"ANTHROPIC_API_KEY is required..."`, the exit prints a 4-line block with `devrel auth`, the manual env-var alternative, and the OpenRouter free-credits link.

    `devrel init` success message is now a numbered list with `devrel auth` as step 1, then voice/style/slop edits, then `devrel doctor`. `devrel doctor` failure details name the fix verb: `state_db` missing → "run `devrel init`"; schema mismatch → "run `devrel migrate`"; `llm_api_key` missing → "run `devrel auth`".

    Suite at 984 passed; ruff + format clean.

    1 PR included
    • PR #9

    Drafted by human. Reviewed by Daria. Merged at May 8, 2026, 11:55 PM UTC.

  • v0.2.82026-05-08abc8e21Hand-written

    OpenRouter + remaining backlog

    Bundles the OpenRouter multi-provider backend with the rest of the v0.2.7 follow-on backlog. The LLM API is back-compat additive: existing `LLMClient(api_key=...)` callers keep using Anthropic with no changes; new deployments can opt into OpenRouter with one env var or one toml line.

    OpenRouter multi-provider backend. New `core/llm_backends.py` with an `LLMBackend` abstraction and two implementations (`AnthropicBackend`, `OpenRouterBackend`). `OpenRouterBackend` posts to OpenRouter's OpenAI-compatible `/chat/completions` over the existing httpx core dep, so no new SDK dependencies. Switch backends via `[llm].provider = "openrouter"` in `.devrel/config.toml` plus `OPENROUTER_API_KEY` env, or auto-detect: if `OPENROUTER_API_KEY` is set and `ANTHROPIC_API_KEY` is not, the CLI picks OpenRouter.

    Per-agent model overrides via `[llm].agent_models` toml map, e.g. `{ argus = "openai/gpt-4o-mini", kai = "anthropic/claude-opus-4-0-20250514" }`. Resolution priority: budget downgrade > explicit `model=` arg > per-agent override > instance default.

    `devrel docs build` auto-persists Dex outputs to disk: writes `dex-architecture.md`, `dex-api-reference.md`, `dex-summary.md`, and `dex-modules.json` to `.devrel/deliverables/` on success.

    Cost model handles OpenRouter-style ids. Budget downgrade uses the backend's `cheap_model` instead of hardcoding Haiku. `devrel doctor` LLM key check is now one-of: either `ANTHROPIC_API_KEY` or `OPENROUTER_API_KEY` satisfies the check.

    Slop blocklist Haiku hallucinations fixed: `_verify_lint_hits` now filters phrases that don't actually appear in the draft.

    Suite at 951 passed; ruff + format clean.

    1 PR included
    • PR #8

    Drafted by human. Reviewed by Daria. Merged at May 8, 2026, 10:30 PM UTC.

  • v0.2.72026-05-08feb5cabHand-written

    Dogfood follow-on fixes

    Closes the gap surfaced by a 2026-05-08 user run on PyPI 0.2.6 against a PostHog-scale repo. Anyone on `0.2.6` running `devrel run`, `--health`, `--agent`, or any verb that builds Atlas hit one or more of these.

    `cli/_common.build_atlas_or_exit` only passed 4 of Atlas's 9 init args. `archive_dir` defaulted to a relative `context_archive` instead of `paths.context_dir`. `config` was never bridged from `.devrel/config.toml`, so the shipped `[orchestration].agent_timeouts` knob was effectively dead on the `devrel` CLI path. `github_tools` / `search_tools` / `instantly_client` / `apollo_client` were always `None`, forcing every tool-using specialist (Sage / Echo / Rex / Vox / Pax / Mox) into its degraded no-tool branch even when the corresponding API key was set.

    `core/llm._emit_cost` lost cost rows under outer cancellation. `asyncio.CancelledError` is `BaseException` in Python 3.8+, so the existing `except Exception` didn't catch it. Outer Atlas timeouts firing between an Anthropic response returning and the SQLite cost write left the cost invisible to `devrel cost`. Fixed with `asyncio.shield` around the sink.

    `core/cyra._persist` never wrote `cro_funnel_metrics`, and would FK-violate on `report_id=0`. Both fixed.

    Editorial-agent timeouts (Kai / Mox / Pax) bumped 600s → 1800s. PostHog-scale `devrel run` hit Kai timeout at 900s after the 0.2.6 default of 600s.

    New verb: `devrel migrate` — idempotent CLI verb that upgrades `.devrel/state.db` to the current `SCHEMA_VERSION`.

    Suite at 919 passed / 21 xfailed; ruff + format clean.

    1 PR included
    • PR #7

    Drafted by human. Reviewed by Daria. Merged at May 8, 2026, 07:10 PM UTC.

  • v0.2.62026-05-088a4c1d9Hand-written

    Wave 4 timeout polish

    Two production issues surfaced in 2026-05-08 dogfood runs against a real Anthropic key. Anyone running editorial-pipeline agents (Kai, Mox, Pax) on `0.2.5` likely saw both: every full-pipeline invocation wall-clocked out at 5 minutes, and Atlas re-spent the same expensive tokens on each retry.

    Per-agent execution timeouts: `Atlas.AGENT_TIMEOUT` (300s) is now a global default. `Atlas.DEFAULT_AGENT_TIMEOUTS` overrides it to 600s for Kai, Mox, and Pax. The 8-stage editorial pipeline (draft, developmental, line, copy, anti-slop, persona, readability, final) routinely exceeds 300s with revision loops. Override per-agent via the new `[orchestration].agent_timeouts` map in `config.toml`.

    Atlas no longer retries on `TimeoutError`. Every retry restarted the agent from scratch, re-spending ~$0.30+ in editorial-pipeline tokens with no chance of a different outcome. With `MAX_RETRIES = 2`, a single timeout burned 3 attempts (~$0.90+) and 15+ minutes of wall time before surfacing the failure. Now a `TimeoutError` returns immediately. Network and transient errors continue to retry as before.

    Suite at 886 passed / 21 xfailed; ruff + format clean.

    1 PR included
    • PR #6

    Drafted by human. Reviewed by Daria. Merged at May 8, 2026, 03:45 PM UTC.

  • v0.2.52026-05-08025db52Hand-written

    Dogfood production fixes

    Four production-path bugs surfaced during a dogfood session running the weekly pipeline against a real cloned repo with a fresh Anthropic key. Every agent CLI verb that goes through `build_atlas_or_exit`, plus the entire content-quality pipeline, was broken on `0.2.4` and is now fixed.

    `cli/_common.build_atlas_or_exit` was constructing `Atlas(llm_client=llm, project_paths=paths)`, but `Atlas.__init__` requires `api_client: PostHogClient` and `knowledge_base_path: Path` as positional args. Now imports `PostHogClient`, constructs it from optional `POSTHOG_API_KEY` / `POSTHOG_PROJECT_ID` env vars, and passes `paths.kb_dir` as the KB path.

    `cli/_common.render_result` accessed `result.result` on a `DelegationResult`, but the dataclass field is `output`. Same typo in both the JSON and human-readable branches.

    `cli/content.draft` and the entire editorial pipeline (`quality/__init__`, `quality/persona`, `quality/slop`) had a tuple-unpack bug — `draft, _ = await client.generate(...)` — but `LLMClient.generate` returns plain `str`. The test suite was a closed loop: 22+ test mock sites returned `(str, None)` tuples to match the buggy unpacks, so tests passed forever without exercising real `LLMClient.generate`. Caught only via real-key invocation. Fix touched 9 files.

    Suite at 882 passed / 21 xfailed; ruff + format clean.

    1 PR included
    • PR #5

    Drafted by human. Reviewed by Daria. Merged at May 8, 2026, 11:30 AM UTC.

// DOGFOOD_LIVE
The first three entries are hand-written (Daria reviewed each before merge). Entry 4 onward gets drafted by scripts/generate-changelog.ts from PRs since the last release tag, opened as a marketing PR, reviewed in GitHub, then merged. Same workflow Origin runs for any other devtool product.