Skip to content

Reconcile main with origin/main + MCP transport + CrewAI 1.10 fixes#9

Merged
atc964 merged 21 commits intomainfrom
fix/reconcile-main-with-origin-seller
Apr 26, 2026
Merged

Reconcile main with origin/main + MCP transport + CrewAI 1.10 fixes#9
atc964 merged 21 commits intomainfrom
fix/reconcile-main-with-origin-seller

Conversation

@atc964
Copy link
Copy Markdown
Collaborator

@atc964 atc964 commented Apr 26, 2026

Summary

  • Reconcile local main with origin/main — local was 7 commits behind (origin's MCP Streamable HTTP transport, litellm→CrewAI native provider migration, CrewAI 1.10 fixes, CI tweaks). Conflicts resolved in favor of origin's MCP transport while preserving local's ar-uwad /products static catalog.
  • 3 small follow-up fixes: re-restore Streamable HTTP after first merge dropped it, CrewAI 1.10 kickoff() awaitability across 6 endpoints, cross-repo test paths.

What's in

Bead Type Description
ar-z40x reconciliation Pulled in MCP Streamable HTTP, CrewAI 1.10 fixes, litellm→CrewAI migration, CI tweaks
ar-fvap bug fix Restore origin's Streamable HTTP transport in main.py (first reconciliation merge dropped it during conflict resolution)
ar-yet5 bug fix CrewAI 1.10 kickoff() returns None — 6 endpoints (/pricing, /proposals, /discovery, /packages/sync, from-template, curated) now use kickoff_async()
ar-e2rj test fix Cross-repo test paths now ancestry-based (replaced stale .worktrees/audience-extension/ refs)
ar-yptd docs Document canonical MCP URL paths /mcp/mcp (Streamable HTTP) and /mcp-sse/sse (legacy)

Test posture

  • Full suite: 768/768 passed (with PYTHONPATH=src from worktree)
  • Live cross-repo smoke test: all 6 fixed endpoints return 4xx/200 (zero TypeError: object NoneType in server log); MCP /mcp/mcp Streamable HTTP confirmed end-to-end (42 tools enumerated, full protocol negotiation, list_products returned 12-product catalog)
  • Quinn QA verifications saved to docs/reports/QUINN_VERIFICATION_ar-{yet5,fvap,e2rj}_2026-04-26.md

Test plan

  • Pull, run pytest tests/, expect 768/768 passed
  • Start seller server, hit each previously-broken endpoint with curl -X POST -d '{}' — expect non-500, zero TypeError NoneType in log
  • Verify MCP POST /mcp/mcp negotiates protocol successfully (Streamable HTTP)

🤖 Generated with Claude Code

atc964 and others added 21 commits April 25, 2026 15:29
bead: ar-q8ok

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per proposal §5.7. Adds AudienceCapabilities + AgenticCapabilities;
Public view exposes capabilities only, Authenticated view exposes
segment lists; legacy shim migrates list[str] inputs.

bead: ar-roi5

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per proposal §5.7 layer 1 + §6 row 9. Includes schema_version,
supports_* flags, max_refs_per_role, and taxonomy_lock_hashes
(loaded dynamically from data/taxonomies/taxonomies.lock.json
for cross-repo schema-drift backstop).

bead: ar-2sip

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per proposal §5.7 + §6 row 10. GET /packages now accepts
audience_type + audience_id query params; /media-kit/search
scoring corpus now includes audience_capabilities segment IDs
alongside keywords/tags.

bead: ar-2wxa

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

Per proposal §5.7 layers 2-3 + §5.1 Step 2 + §6 row 11.
- POST /agentic-audience/match (mock-quality match for DRAFT spec)
- audience_plan_unsupported structured error on DealBookingRequest
- validate_audience hard-rejects on standard/contextual mismatch
- honor_audience_plan_snapshot helper for capability change mid-campaign

bead: ar-sn8f

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates docs/guides/media-kit.md to reflect the typed audience_capabilities
shipped in proposal §8 (replacing the deprecated flat audience_segment_ids):

- Replaces audience_segment_ids row with the typed audience_capabilities
  block (standard / contextual / agentic sub-fields with versions)
- Adds positioning guidance per §5.7: standard direct response,
  content-adjacency contextual, agentic premium tier
- Adds new "Audience-Aware Discovery" section covering:
  * Capability advertisement on /.well-known/agent.json (§9)
  * Audience filter on GET /packages?audience_type=X&audience_id=Y (§10)
  * POST /agentic-audience/match endpoint (§11)
  * Structured rejection envelope audience_plan_unsupported (§11)
- Updates tier-gated visibility table to expose capability versions
  publicly (no segment lists) and segment lists at SEAT+ tier
- Updates authenticated package response example to show the typed
  audience_capabilities shape
- Adds dual-naming note ("Agentic Audiences (UCP)") for the wire content
  type per §5.6
- Cross-references the parent-repo capability-negotiation guide

bead: ar-nd3i

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per proposal §5.1 Step 2 + §5.6 + §6 row 14b. Seller accepts
both UCP and Agentic Audiences content-types; booking response
includes audience_plan_snapshot + audience_match_summary per
wire-format §6.5; logs audience_plan_id at INFO.

bead: ar-y6ki

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per proposal §5.1 Step 4 + §6 row 15. Parses standard segments
from user.data[], contextual from site.cat/cattax, agentic from
user.ext.iab_agentic_audiences.refs[].

bead: ar-8vzg

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the matching embedding_provenance field on the seller-side
ComplianceContext so the cross-repo wire round-trip (§16 test 4
schema-drift backstop) stays byte-equivalent after E2-2 added the
field on the buyer.

Per E2-7 Gap 6. Pre-emptively lands the seller-side mirror that E2-6
would otherwise own; minimum touch to keep the schema-drift backstop
green during E2-2.

bead: ar-0abx

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per E2-2's real embedding model. AgenticCapabilities.modern_default()
classmethod produces a "modern seller" capability shape that genuinely
supports agentic refs minted by the buyer's sentence-transformers
(384-dim, in [256, 1024]) on all three IAB Agentic Audiences signal
types. Global default Package.audience_capabilities.agentic_capabilities
remains None — sellers opt in by setting it explicitly.

bead: ar-wkzu

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Compares the seller's mirror models (AudienceRef, ComplianceContext)
to the canonical buyer-emitted snapshot. Field-shape match (properties
+ required + enums), not byte-equality, because the seller's
model_json_schema may have minor stylistic differences from the buyer's.

bead: ar-tuac

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per UAT 2026-04-25 flag — `GET /products` (and other endpoints that
instantiate seller flows) returned HTTP 500 because CrewAI's
`_create_initial_state()` constructs `StateWithId()` with no kwargs,
but `SellerFlowState` had four required fields (flow_id, flow_type,
seller_organization_id, seller_name) without defaults. Pydantic
ValidationError surfaced as 500.

Fix: give the four fields empty-string defaults. Each Flow's
`@start`-decorated step then overwrites them with real values via
`self.state.field = ...` (verified in ProductSetupFlow.initialize_setup
and parallel flows). Pure additive change — no test churn.

Note: a separate downstream issue (Flow.kickoff hanging on OpenDirect
connection in test mode) prevents `GET /products` from returning a
clean response; that requires endpoint-level refactor (read products
from a store rather than running a full flow per request) — filing
as a follow-up.

bead: ar-y7hn

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GET /products, GET /products/{id}, and GET /.well-known/agent.json
all called `await ProductSetupFlow().kickoff()` per request, which hangs
in OpenDirect MCP session.initialize() — UAT R2 surfaced this as a
500 on both endpoints. Replace with direct reads from the existing
products store; agent_card() reads seller identity from settings.

bead: ar-uwad

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Epic 1 (ar-hrwc): 24/24 beads — Standard + Contextual + Agentic audience
support across buyer + seller, with composable overlay model, capability
negotiation, structured rejection, snapshot honor, OpenRTB carrier mapping.

Epic 2 (ar-wi9x): 10/10 beads — sentence-transformers hybrid embedding
model, per-mode similarity thresholds, canonical JSON Schema drift
backstop, embedding_provenance metadata.

8 P3 follow-ups closed during the run.

Live UAT R3: byte-identical wire round-trip on real seller booking
(deal DEMO-78215162AD80, plan_id sha256:cc87ed44...199b292e).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Same root cause as ar-uwad: per-request `await ProductSetupFlow().kickoff()`
hangs in OpenDirect MCP session.initialize. Different invocation site
(quote-create endpoint vs the read endpoints ar-uwad fixed). Replace
with direct store/cache read. Extends ar-uwad's autouse fixture
guarantee that no read endpoint runs Flow.kickoff per request.

bead: ar-0vtg

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…erience cleanup

Epic ar-v5lt:
- ar-0vtg: POST /api/v1/quotes endpoint — was 500, now 200 in 16ms
- ar-le3: lazy Settings init via _LazySettings proxy
- ar-yt4: tool _natural_language_ registry dict + case-insensitive lookup
- ar-gsd: regression guard on _run/_arun return type annotations
- ar-w5g: channel crew DRY (4 factories → 1 builder + 4 specs; 12% line cut)
- ar-7p3: tests/README.md test-suite map
- ar-jzek: campaign demo --headless / --json mode

Buyer suite 3076/3077 passing (1 order-dep flake = ar-0isf, separate followup).
Seller suite 767/767.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…th-origin-seller

# Conflicts:
#	src/ad_seller/interfaces/api/main.py
#	src/ad_seller/models/flow_state.py
…fvap)

Previous reconciliation merge (ee54e01 in ar-z40x) took local entirely
on this file, dropping origin commit 7d822a5 ("feat: add MCP Streamable
HTTP transport (fix buyer agent 405)"). The two changes are orthogonal:

  - Origin's change: lifespan handler, Streamable HTTP mount at /mcp,
    legacy SSE fallback at /mcp-sse, session_manager.run keepalive
  - Local's ar-uwad change (d60878e): /products endpoints read from
    static catalog instead of kickoff_async

Both are now present.

bead: ar-fvap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The OpenRTB builder/parser round-trip test resolved the buyer src
path via parents[5] + a hardcoded `.worktrees/audience-extension/src/`
suffix, which only worked when a buyer worktree by that exact name
existed. Outside of that environment (i.e., on every developer
machine after the worktree was cleaned up), the path didn't exist
and the test failed with ModuleNotFoundError on `ad_buyer`.

Replace the hardcoded path with explicit ancestry search for
`ad_seller_system`, then look for a matching buyer worktree only
when the test is running inside a seller worktree, falling back
to `ad_buyer_system/src` otherwise. Adds an `AD_BUYER_SRC_PATH`
env var override mirroring the buyer-side `AD_SELLER_SRC_PATH`.

bead: ar-e2rj

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Origin's 3d8b69c fixed /products and /products/{id}; six other endpoints
still called `await flow.kickoff()` and crashed with
TypeError: object NoneType can't be used in 'await' expression.

Affected: /pricing, /proposals, /discovery, /packages/sync,
/api/v1/deals/from-template, /api/v1/deals/curated.

bead: ar-yet5

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Starlette sub-app routing causes \`/mcp\` to 307→404; the working URL
is \`/mcp/mcp\`. Update setup guides and reference docs to use the
canonical path so MCP clients (Claude Desktop, ChatGPT, etc.) work
out of the box.

Files updated:
- docs/api/mcp.md: endpoint table, Codex and Cursor config examples
- docs/guides/claude-desktop-setup.md: remote server URL
- docs/guides/chatgpt-setup.md: ChatGPT, Codex, Cursor, Windsurf configs
- docs/guides/developer-setup.md: claude_desktop_config.json example
- docs/guides/troubleshooting.md: connectivity verification command
- docs/index.md: access methods table
- docs/architecture/overview.md: Mermaid diagram node labels

bead: ar-yptd

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@atc964 atc964 merged commit 78ba3fb into main Apr 26, 2026
0 of 2 checks passed
@atc964 atc964 deleted the fix/reconcile-main-with-origin-seller branch April 26, 2026 21:58
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.

1 participant