fix: Simplify propose_content tool and add allocation perspective#799
Merged
Conversation
Adds Brian O'Kelley's article as a link-type perspective with the quote "OpenRTB is a protocol for day trading; AdCP is a protocol for investing" from Benjamin Masse. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Slack sends interactive component payloads (button clicks, modal
submissions) as URL-encoded form data (payload={json}), not raw JSON.
The /events endpoint was only parsing JSON, causing "Unexpected token 'p'"
errors when interactive payloads arrived.
Now checks if body starts with "payload=" and decodes it appropriately.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, when tools returned error strings (like "Failed to create content: ...") or threw exceptions, these weren't logged. Now we log: - ERROR level: when tools throw exceptions - WARN level: when tools return error-like results This will help debug issues like the content submission failure. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The tool schema had a confusing nested 'collection' object with type: 'personal' | 'committee'. This was misleading because: 1. There's no "personal" collection - migration 153 moved all personal content to the 'editorial' working group 2. All content goes to a working group - the only question is which one 3. The 'personal' option was just syntactic sugar for 'editorial' Changes: - Replace nested collection object with simple committee_slug parameter - Default to 'editorial' (site-wide Perspectives section) if not specified - Maintain backward compatibility with legacy collection format - Add validation for legacy format to prevent silent wrong-collection errors - Update description to accurately describe the content system The content system: - 'editorial' committee = site-wide Perspectives section (accepts public submissions) - Other committees = working groups, councils, chapters (may require membership) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
bokelley
added a commit
that referenced
this pull request
Jan 20, 2026
* feat: Add 'Agentic Advertising is for Allocation' perspective
Adds Brian O'Kelley's article as a link-type perspective with the
quote "OpenRTB is a protocol for day trading; AdCP is a protocol for
investing" from Benjamin Masse.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Handle URL-encoded interactive payloads in Addie /events endpoint
Slack sends interactive component payloads (button clicks, modal
submissions) as URL-encoded form data (payload={json}), not raw JSON.
The /events endpoint was only parsing JSON, causing "Unexpected token 'p'"
errors when interactive payloads arrived.
Now checks if body starts with "payload=" and decodes it appropriately.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add logging for Addie tool errors
Previously, when tools returned error strings (like "Failed to create
content: ...") or threw exceptions, these weren't logged. Now we log:
- ERROR level: when tools throw exceptions
- WARN level: when tools return error-like results
This will help debug issues like the content submission failure.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Simplify propose_content tool schema
The tool schema had a confusing nested 'collection' object with type:
'personal' | 'committee'. This was misleading because:
1. There's no "personal" collection - migration 153 moved all personal
content to the 'editorial' working group
2. All content goes to a working group - the only question is which one
3. The 'personal' option was just syntactic sugar for 'editorial'
Changes:
- Replace nested collection object with simple committee_slug parameter
- Default to 'editorial' (site-wide Perspectives section) if not specified
- Maintain backward compatibility with legacy collection format
- Add validation for legacy format to prevent silent wrong-collection errors
- Update description to accurately describe the content system
The content system:
- 'editorial' committee = site-wide Perspectives section (accepts public submissions)
- Other committees = working groups, councils, chapters (may require membership)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
propose_contenttool schema by removing confusing "personal" vs "committee" distinctionKey Changes
propose_content Tool Simplification
The tool schema previously had a confusing nested
collectionobject:{ "collection": { "type": "personal" | "committee", "committee_slug": "..." } }This was misleading because:
editorialworking groupcommittee_slug: 'editorial'New schema:
{ "committee_slug": "editorial" // defaults to editorial (Perspectives) if omitted }The handler maintains backward compatibility with the legacy format and validates that
committee_slugis provided when usingcollection.type='committee'.Other Fixes
payload=...format for interactive componentsTest plan
🤖 Generated with Claude Code