Skip to content

Release: Phase 1.1 — Stabilize the MVP (0.1.1) - #919

Merged
tbolis-at-mulesoft merged 89 commits into
mainfrom
develop
Oct 2, 2026
Merged

tbolis-at-mulesoft merged 89 commits into
mainfrom
develop

Conversation

@tbolis-at-mulesoft

Copy link
Copy Markdown
Collaborator

Promotion of develop → main for 0.1.1 (milestone Phase 1.1 — Stabilize the MVP (0.1.1)). The version is already bumped to 0.1.1 on develop (#914; main is at 0.1.1.dev0).

Notes

Included (89 commits)

Features

Fixes

Docs

Chores/CI

Other

After merge

🤖 Generated with Claude Code

tbolis-at-mulesoft and others added 30 commits September 26, 2026 18:05
…delines (#660) (#667)

* docs(contributing): reconcile fork row-flip rule and add multi-PR sequencing (#660)

Refs #660

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(contributing): codify live-capture recording, attribution and byte-exact rules (#660)

Refs #660

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(contributing): add VERIFIED-flip sweep checklist and README-banner scope note (#660)

Refs #660

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(site): note maintainer re-capture step in the fork flow (#660)

Refs #660

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Plan for adding a PyPI-version badge and fixing the stale install
banner in the Donkey-Development-Kit/.github org profile README.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Add a live shields.io PyPI-version badge under the logo in both README.md
and python/README.md, and remove the hardcoded `v0.1.0` string from the
alpha-status blockquote so the badge becomes the single source of the
current version. Reuses the exact badge URL and link target already
shipped in the docs-site navbar (#666).

Closes #671

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…pture (#669) (#673)

* fix: replace empty injection-protection body with the live 79-byte capture (#669)

Row 3 of the eight documented rejection shapes carried an honest empty
placeholder because no Injection Protection proxy had been deployed to
capture against. `ddk-injection-protection` (native Gemini ingress,
instance 21200898, shared-omni-gateway) now exists and returned the real
rejection: HTTP 400, `x-injection-protection: blocked`, and a 79-byte
JSON body.

- Add `reject.injection-protection.body.json` with the captured bytes;
  delete the `.body.empty` placeholder.
- Edit `reject.injection-protection.headers.txt`: drop the now-false
  `content-length: 0`, add the `content-type` the JSON body requires
  (header breadth beyond this is #670's scope).
- Wire the body into `simulator.fixtures.SHAPES` and relock
  `fixtures.lock`.
- `classify()` is unchanged — injection is typed purely from the
  `x-injection-protection: blocked` header, independent of the body,
  which is still just carried on `err.response`.
- Flip the verification status for row 3 from UNVERIFIED to VERIFIED
  (LIVE) across `docs/verified-apis.md`, the fixtures README,
  `ARCHITECTURE.md`, `docs/unsupported-boundary.md`, and the matching
  website wording, leaving only the content-moderation fall-through
  (row 4) as the residual keeping #253 open.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: regenerate llms artifacts for the #669 wording update

npm run generate:llms was missed after editing errors.mdx and
reference/unsupported-boundary.mdx; the docs-llms-drift CI check
caught the stale mirrors in website/public/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…#681, #682, #683)

Demote the MS Agent Framework §8 row from a bare VERIFIED to the same
"UNVERIFIED (signature confirmed; pending maintainer --live + sign-off)"
tier as its seven peers, and align verify_frameworks.py's Result.verdict
and emit_verified_rows() so the harness prints that same vocabulary
instead of collapsing offline-only passes into VERIFIED / VERIFIED
(signature) (#681). Fix the stale §4 cross-reference for the live
LangGraph /responses data plane to §2, in both verified-apis.md and the
adapter's connection_kwargs() comment (#682). Deduplicate the CrewAI
return-class finding so §8.1 points at the §8 row as its single source
of truth instead of repeating the finding (#683).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
….BaseLLM (#640, #684)

crewai.LLM.__new__ is a documented factory that routes openai/-prefixed
models to crewai.llms.providers.openai.completion.OpenAICompletion, a
sibling BaseLLM subclass — not a class-rename incompatibility as PR #679
originally recorded. Retype CrewAIAdapter.llm()/llm() -> BaseLLM to match
what is actually returned, update verify_frameworks.py's expected class,
and record the corrected §8 evidence plus newly-captured offline §9/§10
CrewAI evidence (MCPServerAdapter.__init__, BaseTool.model_fields). Sync
the website docs (frameworks/crewai.mdx, frameworks/index.mdx,
feature-overview.mdx) that asserted the stale crewai.LLM return type.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
#640, #682, #684)

Follow-ups from the PR #686 review:

- Regenerate the website/public llms artifacts (llms.txt, llms-full.txt and
  the feature-overview / frameworks / frameworks/crewai pages) so the
  docs-llms-drift CI job passes.
- crewai.LLM routes an openai/ model with an explicit base_url to CrewAI's
  native OpenAI provider (OpenAICompletion), which does not go through
  LiteLLM and strips the openai/ prefix before the request. Replace the
  "LiteLLM-backed" / "LiteLLM owns the transport" wording in the CrewAI
  page, the frameworks index, the adapter module and the example, and make
  the page's manual-equivalent snippet pass base_url like the adapter does.
- Sync the remaining crewai.LLM return-type mentions (feature-overview card,
  examples/crewai, the adapter-ergonomics test name) to crewai.BaseLLM.
- Finish #682: the adapter-ergonomics test still cited §4 for /responses.
- docs/verified-apis.md §8: describe Check A as the isinstance check it is,
  record the CrewAI row's returned class (crewai.BaseLLM, concretely
  OpenAICompletion) and that extra_headers reaches the proxy through
  CrewAI's additional_params passthrough rather than a named parameter;
  fix the nested-backtick code span and the circular §8/§8.1 pointer.

Co-authored-by: Cursor <cursoragent@cursor.com>
…INSTALLED (#640, #681)

Follow-ups from the PR #686 review, fixed here instead of as new issues:

- verify_frameworks.py decided "installed" by catching ImportError from the
  adapter's factory, so a renamed class ("cannot import name ...") and any
  native-provider construction error (crewai.LLM re-raises those as
  ImportError) read as NOT INSTALLED and exited 0, nightly matrix included.
  "Installed" now means the framework's distribution is present (a new
  FRAMEWORKS column, pinned to the pyproject extras by a unit test); an
  ImportError from an installed framework is a SIGNATURE FAIL. A missing
  agent-framework no longer reads as installed-but-BLOCKED.
- Pin CrewAI's expected class to the concrete OpenAICompletion: every CrewAI
  provider is a crewai.BaseLLM, so the BaseLLM check passed on any routing
  change. The adapter's public annotation stays BaseLLM.
- Replace the remaining "LiteLLM owns the transport" rationale for CrewAI
  (README exemption table, conformance KNOWN_LIMITATIONS reasons,
  ARCHITECTURE.md, the telemetry / last-call / budget / gateway-identity
  pages, and docstrings in donkey.py, lastcall.py, cachecontrol.py and
  _base.py). CrewAI's native provider builds its own sync and async OpenAI
  clients from one set of client params, so the SDK's async httpx client
  still cannot be injected: the exemptions stand, only their cause changes.
- agent_framework.py still called its class path VERIFIED after b8619e0
  demoted the section 8 row (#681); say "confirmed offline" to match.
- Record the harness semantics and the OpenAICompletion pin in
  docs/verified-apis.md section 8; regenerate the website/public llms
  artifacts.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ublish; generalize the ladder to X.Y.Z (#687) (#690)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
#692) (#695)

Render the cookie-less beacon from the root layout only when the build
receives a well-formed 32-hex NEXT_PUBLIC_CF_WEB_ANALYTICS_TOKEN, supplied
by the Pages workflow from the CF_WEB_ANALYTICS_TOKEN repository variable.
Local and unconfigured builds ship no analytics. The gate is unit-tested
with node --test and runs in the docs CI job.

Refs Donkey-Development-Kit/donkey-development-kit-metrics#19

Co-authored-by: Cursor <cursoragent@cursor.com>
)

Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.9 to 5.0.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](juliangruber/brace-expansion@v5.0.9...v5.0.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… in output (#831)

Refs #727, #773, #781. See the PR description and MIGRATION.md for the behaviour changes.
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.15 to 3.4.16.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](cure53/DOMPurify@3.4.15...3.4.16)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.16
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
tbolis-at-mulesoft and others added 28 commits October 1, 2026 11:19
…tradictions (#892)

- Replace the copied _missing_env() in the seven connection_kwargs() examples
  with DonkeyConfig.from_env().validated(need="llm"), printing the SDK's
  ConfigError (so jwt mode reports the wallet client id and .donkey-kit.toml
  is honoured) and the curated ImportError instead of local install hints.
- Example docstrings/READMEs describe behaviour and cite docs/verified-apis.md
  §2/§8 instead of claiming "verified"; the Agent Framework example uses
  model=, not model_id.
- Drop the Strands lifecycle-hooks policy-termination claim (nothing in src
  uses them) from the adapter and its website page.
- Record the live /chat/completions captures in verified-apis.md §2 and which
  adapter uses which route; state the real reason LangGraph keeps /responses
  (the raw client's route and the only one the simulator serves).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(langgraph): report last_call after ChatOpenAI.ainvoke() (#850)

LangChain's BaseChatModel.agenerate sends the request from a task that
asyncio.gather spawns with a copy of the caller's context, so the
transport recorded donkey.last_call into that copy and the caller read
UNOBSERVED after ainvoke().

core/lastcall gains a LastCallBridge: opened in the caller's context, it
is inherited by the spawned task, which records through it. It closes
when the call ends, so tasks the caller spawns later never write back
(hazard #2, fan-out isolation). The LangGraph adapter attaches a
run_inline callback handler that opens the bridge in on_chat_model_start
(awaited in the caller's context, before the gather) and closes it on
on_llm_end / on_llm_error. Batches get no bridge, as their requests run
side by side.

BG §1.1 (last_call, #362).

Closes #850

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(langgraph): keep the last_call handler typecheckable and stubbable without langchain (#850)

CI jobs without the langgraph extra failed: mypy's disallow_subclassing_any
rejected the BaseCallbackHandler subclass (Any when langchain_core is absent),
and the factory-drift tests stubbed ChatOpenAI but not BaseCallbackHandler.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(site): regenerate llms artifacts for the last_call bridge pages (#850)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The custom domain was enabled in Settings → Pages before #909 reached
main, so the deploy still built with DOCS_BASE_PATH=/donkey-development-kit
and every _next/ and /img/ asset 404'd on the root-served domain. Drop
the sub-path from the Pages build and add public/CNAME. Hunks are taken
verbatim from #909's branch so it rebases cleanly.

Closes #910


(cherry picked from commit df2da5a)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…912)

Build the Pages export for the domain root (drop DOCS_BASE_PATH from the
workflow), add public/CNAME, point generate-llms.mjs's SITE at the custom
domain so llms.txt sits at a real domain root, and replace the old
github.io URL in pyproject, the READMEs, the example READMEs and
use-with-your-agent.mdx. preview-pages.mjs now honours DOCS_BASE_PATH
(root by default) instead of hard-coding the old sub-path.

Refs #909

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
)

Name the hostname the Web Analytics site is registered for
(docs.donkey-kit.dev), where the site token comes from, and that the beacon
only goes live once the beacon code has reached main, the sole published
branch. Add the devtools check that closes #692's last acceptance criterion.

Refs #916

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@tbolis-at-mulesoft
tbolis-at-mulesoft merged commit e3e5a54 into main Oct 2, 2026
24 checks passed

This branch had an error being deployed

1 failed and 1 active deployments
github-pages — 3f066b7f Deployed Oct 2, 2026 by amirkhan-ak-sf via deploy #61
testpypi — 3f066b7f Deployed Oct 2, 2026 by tbolis-at-mulesoft via Publish to TestPyPI (dev dry-run) #5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants