feat: storyboard UX, inline agent connect, OAuth auth#1998
feat: storyboard UX, inline agent connect, OAuth auth#1998
Conversation
Short-circuit comply() when product discovery fails — skip dependent tracks instead of repeating the same error across 10+ scenarios. Saves significant time for agents with broken product schemas. Add inline agent connection form to dashboard — replaces the chat bounce for saving auth tokens and platform type. New PUT /registry/agents/:url/connect endpoint handles token storage directly. Filter storyboard picker by agent capabilities — groups into Recommended and Other based on the agent's compliance tracks. Signal storyboards show for signal agents, creative for creative agents, etc. Add creative_generative.yaml storyboard — covers the brief-driven generation flow (OpenAds, generative DSPs) with 5 phases: format discovery, generate from brief, refine, multi-format, production build. Fix resolveOwnerAuth() to fall back to OAuth tokens when no static bearer token exists, with 5-minute expiration buffer. Auto-scroll storyboard results into view after rendering. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add max-length validation (4096) on auth_token input - Validate auth_type against allowed values instead of silent fallback - Validate platform_type is a string before set membership check - Combine ownership verification and org lookup into single query - Log warning when OAuth token has no expiration recorded - Preserve agentTracks context through storyboard back button navigation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bokelley
left a comment
There was a problem hiding this comment.
Nice work — the two-phase comply() short-circuit is a good optimization, and the inline agent connect + storyboard picker are solid UX improvements.
Merge order with #1985: We're merging #1985 first (storyboard coverage + comply() migration). The main conflict will be in comply() in compliance-testing.ts. Here's how they compose:
#1985 adds a priority chain at the top of comply():
storyboards > scenarios > tracks > default
When storyboards or scenarios are provided, they bypass track-based selection entirely. Your two-phase logic applies to the track-based path (the else branch — when no storyboards or explicit scenarios are given).
When you rebase after #1985 merges, the reconciliation is:
- Keep the priority chain from #1985 (storyboards → scenarios → tracks)
- Apply your two-phase logic inside the track-based branch
- The
scenarioListvariable from #1985 feeds into your phase 1/phase 2 split
The storyboard path doesn't need two-phase execution because storyboards already select only relevant scenarios — if a storyboard doesn't reference full_sales_flow, products aren't tested.
Other notes:
creative_generative.yamlfills the gap we noticed — the category existed in schema.yaml but had no storyboard- #1985 adds
creative_generativeto the schema.yaml category enum already, so that should merge cleanly - The
SCENARIO_REQUIREMENTSimport you add is already available in #1985's version of the file
Summary
Alignment with #1985
These changes are compatible with #1985 (storyboard coverage and comply() scenario filtering). The overlap is in
compliance-testing.ts— #1985 addsextractScenariosFromStoryboard()and scenario filtering in the run endpoint, while this PR adds two-phase comply() execution. They compose cleanly: filtered scenarios still flow through the two-phase comply(). Merge order doesn't matter; the second to merge will need a small conflict resolution incompliance-testing.ts.Changes
comply() short-circuit (
compliance-testing.ts)Inline agent connect (
registry-api.ts+dashboard-agents.html)PUT /registry/agents/:encodedUrl/connect— saves auth token + platform typeStoryboard picker filtering (
dashboard-agents.html)Generative creative storyboard (
creative_generative.yaml)OAuth in resolveOwnerAuth() (
compliance-db.ts)Test plan
🤖 Generated with Claude Code