Skip to main content
Changelog

What shipped.

One entry per release, hand-written and reviewed. Read from marketing/changelog/*.md at build time. Current through v0.3.0.

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

  • v0.3.02026-07-26d25ca04Hand-written

    Anti-slop grounding + `devrel next` ranked action queue

    Phase B of the roadmap: close the loop from analysis to next steps, and make "grounded in the repo" a checkable stage instead of a promise.

    **`devrel next`** is a ranked "do this next" queue. It takes the pain themes Iris synthesizes from community and social signal and orders them into the top actions worth taking, scored by reach, intent, and effort. `--top` controls how many surface, `--since` sets the signal window (7d/30d/90d), and `--draft` runs each top action straight through Kai's editorial pipeline so the queue produces artifacts, not just a list.

    **The grounding stage** is a new step in the editorial pipeline. Turn it on with `devrel content audit <file> --ground` (or `--grounding` in the pipeline) and every factual claim in a draft has to resolve to a repository fact or a knowledge-base source; `--cut-unsourced` removes the ones that can't. It's backed by new GitHub repo-facts helpers that fetch structured facts about the repo for claims to check against.

    **The provenance trail** records the evidence chain behind grounded claims and renders it as a PR-style summary, so a reviewer can see which source backs which sentence before anything ships.

    Also in this release: `ruff` is pinned to `>=0.15,<0.16` so lint and format checks are reproducible across local and CI. Published to PyPI as `devrel-origin` 0.3.0.

    1 PR included
    • PR #11

    Drafted by human. Reviewed by Daria. Merged at Jul 26, 2026, 04:45 PM UTC.

  • v0.2.162026-05-140a66b97Hand-written

    doctor video-extra install hint bracket escape

    A one-line fix caught by fresh-install validation. `devrel doctor` prints an install hint when the video extra is missing, but Rich interpreted the `[video]` in `pip install 'devrel-origin[video]'` as a style tag and stripped it, so users saw `pip install 'devrel-origin'` — the wrong command.

    The brackets are now escaped (`'devrel-origin\[video]'`) so the literal text reaches the terminal. Small bug, real papercut: the hint exists precisely for people who don't already know the extra's name, and it was handing them a command that wouldn't install the thing they needed.

    1 PR included
    • PR #9

    Drafted by human. Reviewed by Daria. Merged at May 14, 2026, 06:40 PM UTC.

  • v0.2.152026-05-14b1b4e28Hand-written

    PostHog pipeline hardening + loud editorial abort

    Every PostHog-backed Argus run was failing silently. `PostHogCollector.collect()` called `PostHogClient.fetch_events_by_url`, but that method didn't exist on the client. v0.2.15 adds it: an HogQL helper that returns page-view and unique-visitor counts grouped by URL, with positional-or-dict row normalization so the shape of the response doesn't matter.

    The release also cleans up the analysis-to-content boundary. The editorial pipeline now **aborts loudly on a second persona failure** instead of shipping content with `flagged=True` — Kai already treats that abort as a quality-gate block, so the user-facing effect is "content blocked" rather than "weak content shipped." Kai's task builder stops demanding GitHub-issue and source-code claims when Sage and Dex returned no evidence, which was the root cause of invented issue numbers and file paths. Argus's list-coercion normalizes `evidence`, `source_ids`, and `trend_signals` when the model returns a string, so the Markdown renderer stops iterating character-by-character.

    Supporting work: a schema v6 `social_mentions` table for Echo/Argus, `devrel doctor` checks for the video toolchain (`ffmpeg`, Playwright) with the exact install command in the warning, `last_ok` health flags on all four Argus collectors, and per-agent `started_at`/`completed_at` timings in the run report. 1039 tests passing.

    2 PRs included
    • PR #6
    • PR #7

    Drafted by human. Reviewed by Daria. Merged at May 14, 2026, 09:10 AM UTC.

  • v0.2.142026-05-139844c8eHand-written

    Rename devrel-swarm → devrel-origin (CLI binary stays `devrel`)

    The project shipped to PyPI under a new name. `devrel-swarm` became **`devrel-origin`**, the package users install with `pipx install devrel-origin`. The CLI binary is unchanged: every command is still `devrel <verb>`, so muscle memory and existing `.devrel/` projects carry over untouched.

    This is a breaking rename at the distribution layer, not the interface layer. The old `devrel-swarm` package name stops receiving updates; the `src/devrel_origin/` import path replaces `src/devrel_swarm/`. `importlib.metadata` resolves the version from `devrel-origin` first, falling back to the legacy `devrel-swarm` name so an in-place upgrade still reports a version instead of crashing.

    Nothing about the agent roster, the pipelines, or the config format changed here. If you had `devrel-swarm` installed, `pipx uninstall devrel-swarm && pipx install devrel-origin` moves you over cleanly.

    1 PR included
    • PR #5

    Drafted by human. Reviewed by Daria. Merged at May 13, 2026, 03:20 PM UTC.

  • 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.