diff --git a/README.md b/README.md index bae0528..f856a94 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Ambush AI plugins for Codex -This repository is the official Codex marketplace for Ambush AI. It currently publishes the Ambush Streams plugin, which connects Codex to the production Ambush MCP server and teaches Codex how to manage personalized news streams safely. +This repository is the official Codex marketplace for Ambush AI. It currently publishes the Ambush Streams plugin, which connects Codex to the production Ambush MCP server and teaches Codex how to manage, process, and deliver personalized news streams safely. This repository is intentionally separate from the other Ambush distribution formats: @@ -22,7 +22,7 @@ Install Ambush Streams: codex plugin add ambush-streams@ambush-ai ~~~ -Restart Codex if it is already open. When prompted, connect your Ambush account through OAuth. You can then ask Codex to create, list, update, pause, resume, or permanently delete a stream, or review its emitted news items. +Restart Codex if it is already open. When prompted, connect your Ambush account through OAuth. You can then ask Codex to create, list, update, process, route, mute, pause, resume, or permanently delete a stream, or review its emitted news items. ## Repository layout diff --git a/plugins/ambush-streams/.codex-plugin/plugin.json b/plugins/ambush-streams/.codex-plugin/plugin.json index 7db9c0b..f973b63 100644 --- a/plugins/ambush-streams/.codex-plugin/plugin.json +++ b/plugins/ambush-streams/.codex-plugin/plugin.json @@ -1,28 +1,29 @@ { "name": "ambush-streams", - "version": "0.1.0", - "description": "Create, review, and manage personalized Ambush news streams from Codex.", + "version": "0.2.0", + "description": "Create, process, deliver, and manage personalized Ambush news streams from Codex.", "author": { "name": "Ambush AI", "email": "support@ambush.ai", "url": "https://ambush.ai" }, - "homepage": "https://ambush.ai", + "homepage": "https://app.ambush.ai/feeds", "repository": "https://github.com/Ambush-AI/codex-plugins", - "keywords": ["ambush", "streams", "news", "monitoring", "alerts"], + "keywords": ["ambush", "streams", "news", "monitoring", "alerts", "delivery"], "skills": "./skills/", "interface": { "displayName": "Ambush Streams", - "shortDescription": "Manage personalized news streams", - "longDescription": "Turn a plain-language monitoring request into an Ambush stream, review existing streams and their emissions, update prompts or names, and pause, resume, or delete streams without leaving Codex.", + "shortDescription": "Manage streams, processing, and delivery", + "longDescription": "Turn a plain-language monitoring request into an Ambush stream, process and route every future event to a connected destination, review emissions, update prompts or names, and pause, resume, or delete streams without leaving Codex.", "developerName": "Ambush AI", "category": "Productivity", "capabilities": ["Interactive", "Read", "Write"], - "websiteURL": "https://ambush.ai", + "websiteURL": "https://app.ambush.ai/feeds", "privacyPolicyURL": "https://reflex.app/privacy", "defaultPrompt": [ "List my Ambush streams and summarize their status.", "Create a stream that monitors a topic for me.", + "Process every event from one of my streams and send it to a connected channel.", "Show the latest emissions from one of my streams." ], "brandColor": "#12BFAE", diff --git a/plugins/ambush-streams/README.md b/plugins/ambush-streams/README.md index 5971731..55d8bc7 100644 --- a/plugins/ambush-streams/README.md +++ b/plugins/ambush-streams/README.md @@ -1,6 +1,6 @@ # Ambush Streams for Codex -Ambush Streams lets a consumer create and manage personalized news streams from Codex. The plugin combines the production OAuth MCP server with workflow guidance for reliable stream discovery, creation, updates, pause and resume, deletion, and emission review. +Ambush Streams lets a consumer create, process, deliver, and manage personalized news streams from Codex. The plugin combines the production OAuth MCP server with workflow guidance for reliable stream discovery, event-time transformation, destination routing, updates, pause and resume, deletion, and emission review. ## Consumer experience @@ -8,6 +8,7 @@ After installing and authenticating once, a consumer can ask in ordinary languag - "Create a stream for material cybersecurity incidents affecting Canadian banks." - "Pause my AI regulation stream." +- "For every event from my AI chip stream, produce a cautious trade idea or no-trade result and send it to my connected Trade Ideas channel." - "What did my semiconductor supply-chain stream emit this week?" The assistant resolves the appropriate stream and tool arguments. Consumers do not configure an API URL, copy tokens, or need to know that pause and resume are implemented through an update request. @@ -15,7 +16,7 @@ The assistant resolves the appropriate stream and tool arguments. Consumers do n ## Package contents - .mcp.json connects Codex to https://api.ambush.ai/mcp with OAuth. -- skills/manage-ambush-streams teaches the stream-management workflow and deletion safeguards. +- skills/manage-ambush-streams teaches stream management, event processing, safe destination routing, irreversible route-muting behavior, and deletion safeguards. - .codex-plugin/plugin.json contains Codex presentation and package metadata. - submission contains listing copy, review cases, release notes, and the pre-submission checklist. @@ -25,4 +26,4 @@ The production MCP API retains legacy identifiers such as list_feeds, create_fee ## Status -Version 0.1.0 is prepared for repository-based testing. It has not been submitted to OpenAI's public plugin directory. +Version 0.2.0 is prepared for repository-based testing. It has not been submitted to OpenAI's public plugin directory. diff --git a/plugins/ambush-streams/skills/manage-ambush-streams/SKILL.md b/plugins/ambush-streams/skills/manage-ambush-streams/SKILL.md index fffec68..634d5ad 100644 --- a/plugins/ambush-streams/skills/manage-ambush-streams/SKILL.md +++ b/plugins/ambush-streams/skills/manage-ambush-streams/SKILL.md @@ -1,6 +1,6 @@ --- name: manage-ambush-streams -description: Manage a user's Ambush news streams through the Ambush Streams MCP server. Use when the user wants to create, list, inspect, rename, change, pause, resume, or delete an Ambush stream, or review a stream's emitted news items and delivery configuration. +description: Manage a user's Ambush news streams through the Ambush Streams MCP server. Use when the user wants to create, list, inspect, rename, change, pause, resume, or delete a stream; review emitted news; or process and deliver every new event to an existing destination. --- # Manage Ambush Streams @@ -14,6 +14,7 @@ The MCP API currently retains legacy tool and field identifiers such as `list_fe - Verify that the Ambush Streams MCP tools are available before acting. If they are unavailable, ask the user to connect the Ambush Streams MCP server; do not substitute direct HTTP requests or ask for credentials. - Use `list_feeds` to discover the user's streams. Follow `next_cursor` only when the requested result may be on another page or the user asks for every stream. - Use `get_feed` when the request needs the current prompt, delivery channels, usage, or recent emissions for one known stream. +- Use `list_channels` to discover delivery destinations already configured in the user's Ambush workspace. Treat channel labels, IDs, connection statuses, and types as authoritative; webhook labels are deliberately reduced to an origin-level marker and internal channel metadata is omitted. - Resolve a stream by its returned ID. When names are duplicated or the target is ambiguous, present the matching names, prompts, and IDs and ask the user to choose. - Never invent a stream ID, base stream ID, cursor, prompt, status, emission, or tool result. - Treat a missing stream name gracefully: identify it by a short prompt excerpt and its ID. @@ -24,7 +25,7 @@ The MCP API currently retains legacy tool and field identifiers such as `list_fe 1. Translate the user's request into a focused monitoring prompt. Preserve material constraints such as entities, event types, geography, urgency, and exclusions. 2. Ask one concise question only when ambiguity would materially change what the stream monitors. Do not require the user to know Ambush-specific fields. -3. Call `create_feed` with `prompt`, an optional `name`, and an optional known `base_feed_id`. At least one of `prompt` or `base_feed_id` is required. +3. Call `create_feed` with `prompt`, an optional `name`, an optional known `base_feed_id`, and `post_processing` when the user also asks to transform every accepted event. At least one of `prompt` or `base_feed_id` is required. 4. Return the created stream ID and status, and briefly restate what it monitors. Do not create several streams when one focused stream satisfies the request unless the user explicitly asks for separate streams. @@ -37,9 +38,28 @@ Do not create several streams when one focused stream satisfies the request unle - `name` renames it. - `status: "paused"` pauses it. - `status: "active"` resumes it. + - `post_processing` transforms each future accepted event. Set it to `null` only when the user asks to remove the transformation. 3. Do not look for separate pause or resume operations; status changes belong to `update_feed`. 4. Confirm the resulting status and stream ID. +## Process and deliver every new event + +Use this workflow when the user says “every event,” “every time it fires,” “as soon as it fires,” or otherwise asks for ongoing output from a stream. This is native event-time processing and delivery; do not replace it with a scheduled polling task unless the user explicitly asks for polling as a fallback. + +1. Resolve the exact stream. Use `get_feed` to inspect its current post-processing and routed channels when the stream ID is known. +2. If the requested output is not already configured, call `update_feed` with `post_processing`: + - Put the transformation instructions in `prompt`. + - Add `output_schema` when stable structured fields matter downstream. + - Preserve the user's requested analysis, tone, and constraints without changing what the stream monitors. +3. Call `list_channels` when a suitable destination is not already routed on the stream. +4. Choose only a channel whose install `status` is `connected` and whose `destination_status` is `active`. Use a named matching destination, or the sole clearly suitable active destination. If multiple destinations are plausible, ask the user to choose by label and type before routing. If none is ready, explain that a destination must first be configured, verified, or reauthenticated in Ambush; never request webhook URLs, Slack credentials, tokens, or phone verification details in chat. +5. Call `route_feed_channel` with the resolved stream and channel IDs. Repeating this call is safe and reactivates an existing route. +6. Confirm that the transformation and destination apply to future accepted events, not historical emissions. Do not claim a delivery succeeded until an emission and delivery actually occur. + +Use `update_feed_channel_route` with `active: false` to mute future deliveries to one destination and `active: true` to unmute them. Before muting, resolve the exact stream and destination. Muting permanently cancels that route's pending deliveries and attempts, and unmuting does not restore them; it does not pause the stream or delete the destination. + +For per-event trade analysis, instruct post-processing to permit an explicit `no_trade` result when evidence is insufficient, distinguish reported facts from inference, and avoid fabricating prices, positions, or certainty. Do not promise that every event will justify a trade. + ## Review streams and emissions - For an overview, call `list_feeds` and summarize names, statuses, current prompts, and channel counts. Do not expose cursors unless diagnostically useful. @@ -58,6 +78,7 @@ Deletion is permanent and destructive. ## Scope boundaries -- Use this skill for Ambush stream lifecycle and emission requests, not for unrelated news research, generic RSS development, or delivery-channel setup that the exposed tools cannot perform. +- Use this skill for Ambush stream lifecycle, emission, post-processing, and delivery-routing requests, not for unrelated news research or generic RSS development. +- The tools can route destinations already configured in Ambush but cannot create or reveal their credentials. Direct users to the Ambush app when setup or reauthentication is required. - Do not imply that creating a stream guarantees a particular story or delivery time. - If a prompt is rejected by Ambush policy, explain the returned restriction briefly and help the user reframe a legitimate monitoring request without trying to bypass it. diff --git a/plugins/ambush-streams/skills/manage-ambush-streams/agents/openai.yaml b/plugins/ambush-streams/skills/manage-ambush-streams/agents/openai.yaml index 7d7769e..7b154ec 100644 --- a/plugins/ambush-streams/skills/manage-ambush-streams/agents/openai.yaml +++ b/plugins/ambush-streams/skills/manage-ambush-streams/agents/openai.yaml @@ -1,7 +1,7 @@ interface: display_name: "Manage Ambush Streams" - short_description: "Create and manage personalized news streams" - default_prompt: "Use $manage-ambush-streams to review and manage my Ambush streams." + short_description: "Manage stream processing and delivery" + default_prompt: "Use $manage-ambush-streams to review and manage my Ambush streams, event processing, and delivery routes." dependencies: tools: - type: "mcp" diff --git a/plugins/ambush-streams/submission/README.md b/plugins/ambush-streams/submission/README.md index eab7169..d044414 100644 --- a/plugins/ambush-streams/submission/README.md +++ b/plugins/ambush-streams/submission/README.md @@ -7,7 +7,7 @@ Use this directory as the source of truth for a future Ambush Streams submission - [x] Production MCP uses HTTPS at `https://api.ambush.ai/mcp`. - [x] OAuth authorization, dynamic client registration, and PKCE work with Codex. - [x] MCP discovery metadata and protected-resource challenges are public. -- [x] Tool annotations distinguish reads, writes, and destructive deletion. +- [x] Tool annotations distinguish reads, writes, destructive deletion, and destructive route muting. - [x] A privacy policy is public at `https://reflex.app/privacy`. - [x] Support is public at `https://reflex.app/support` and `support@ambush.ai`. - [ ] Publish legal-approved Ambush terms of service at a public HTTPS URL, add `termsOfServiceURL` to the plugin manifest, and replace the pending value in the listing copy. @@ -51,5 +51,5 @@ Only after every required item above is complete: 1. Submit the plugin in the OpenAI Platform portal and address review feedback in this package. 2. Publish the approved version to the public plugin directory. 3. Install it from clean Codex and ChatGPT accounts, complete OAuth, and run the positive review cases. -4. Confirm unrelated prompts do not invoke the plugin and destructive deletion still requires explicit confirmation. +4. Confirm unrelated prompts do not invoke the plugin, destructive deletion still requires explicit confirmation, and route muting warns that cancelled pending work is not restored by unmuting. 5. Record the published version and approval date in the release notes. diff --git a/plugins/ambush-streams/submission/listing.md b/plugins/ambush-streams/submission/listing.md index d58ac9a..7508bea 100644 --- a/plugins/ambush-streams/submission/listing.md +++ b/plugins/ambush-streams/submission/listing.md @@ -6,25 +6,25 @@ Ambush Streams ## Short description -Manage personalized news streams +Manage streams, processing, and delivery ## Long description -Ambush Streams turns a plain-language monitoring request into a personalized news stream. Create focused streams, review what each stream monitors, rename or refine prompts, pause and resume monitoring, and inspect emitted news items directly from Codex or ChatGPT. Your streams remain scoped to your authenticated Ambush account. +Ambush Streams turns a plain-language monitoring request into a personalized news stream. Create focused streams, review or refine what they monitor, process every accepted event into a tailored output, route future results to an existing Slack, webhook, or iMessage destination, pause and resume monitoring, and inspect emitted news directly from Codex or ChatGPT. Your streams and destinations remain scoped to your authenticated Ambush account. ## End usage -A consumer installs Ambush Streams from the plugin directory, signs in to Ambush once, and then works in natural language. For example, they can ask to monitor material developments about an industry, pause a stream during a quiet period, or summarize the newest emissions without navigating away from their conversation. The plugin translates those requests into the production Ambush MCP server; consumers never copy API tokens or configure endpoint URLs. +A consumer installs Ambush Streams from the plugin directory, signs in to Ambush once, and then works in natural language. For example, they can ask to monitor material developments about an industry, turn every accepted event into a structured analysis delivered to a connected Slack channel, pause a stream during a quiet period, or summarize recent emissions without leaving the conversation. The plugin uses Ambush's native event pipeline rather than scheduled polling; consumers never copy API tokens or destination credentials into chat. ## Category and discovery terms - Category: Productivity -- Terms: personalized news, monitoring, alerts, streams, market intelligence, emissions +- Terms: personalized news, monitoring, alerts, streams, market intelligence, emissions, Slack delivery, event processing ## Publisher and links - Publisher: Ambush AI -- Website: https://ambush.ai +- Website: https://app.ambush.ai/feeds - Privacy policy: https://reflex.app/privacy - Support: https://reflex.app/support - Support email: support@ambush.ai diff --git a/plugins/ambush-streams/submission/release-notes.md b/plugins/ambush-streams/submission/release-notes.md index ef3c329..dbfac01 100644 --- a/plugins/ambush-streams/submission/release-notes.md +++ b/plugins/ambush-streams/submission/release-notes.md @@ -1,5 +1,13 @@ # Release notes +## 0.2.0 — event-driven workflows + +- Configures prompt-based or structured post-processing for every future accepted stream event. +- Discovers preconfigured Slack, webhook, and iMessage destinations without exposing credentials. +- Routes streams to delivery channels through the native Ambush event pipeline instead of scheduled polling. +- Mutes and unmutes individual stream-to-channel routes while accurately warning that muting permanently cancels pending work. +- Guides trade-analysis workflows to allow an explicit no-trade result and avoid unsupported certainty. + ## 0.1.0 — initial package - Connects Codex to the production Ambush Streams MCP server with OAuth. diff --git a/plugins/ambush-streams/submission/reviewer-materials.md b/plugins/ambush-streams/submission/reviewer-materials.md index cff5b44..468e933 100644 --- a/plugins/ambush-streams/submission/reviewer-materials.md +++ b/plugins/ambush-streams/submission/reviewer-materials.md @@ -5,7 +5,7 @@ Prepare these materials immediately before submission. Do not commit demo creden ## Demo recording - [ ] Record the production plugin in every product selected in the portal. -- [ ] Show OAuth sign-in, stream discovery, stream creation, a status update, emission review, and the explicit confirmation before deletion. +- [ ] Show OAuth sign-in, stream discovery, stream creation, event-time post-processing and routing, a status update, emission review, and the explicit confirmation before deletion. - [ ] Host the recording at a stable reviewer-accessible HTTPS URL. - [ ] Enter that URL directly in the submission portal. @@ -15,14 +15,17 @@ Copy these justifications into the portal for the production tool scan. | Tool | `readOnlyHint` | `openWorldHint` | `destructiveHint` | | --- | --- | --- | --- | -| `list_feeds` | `true` — reads stream summaries without changing account state. | `false` — reads only the authenticated user's Ambush data. | `false` — cannot alter or remove data. | -| `get_feed` | `true` — reads one stream, its channels, usage, and recent emissions. | `false` — reads only the authenticated user's Ambush data. | `false` — cannot alter or remove data. | -| `create_feed` | `false` — creates persistent stream state. | `false` — writes only to the authenticated user's Ambush account. | `false` — creation does not remove or irreversibly overwrite existing data. | -| `update_feed` | `false` — changes a stream's name, prompt, or status. | `false` — writes only to the authenticated user's Ambush account. | `false` — supported changes are reversible through another update. | +| `list_feeds` | `true` — reads stream summaries without changing account state. | `false` — reads only the authenticated user's Ambush data and does not contact arbitrary external systems. | `false` — cannot alter or remove data. | +| `get_feed` | `true` — reads one stream, its channels, usage, and recent emissions without changing state. | `false` — reads only the authenticated user's Ambush data. | `false` — cannot alter or remove data. | +| `list_channels` | `true` — reads delivery destination metadata without changing state; webhook paths and internal metadata are redacted before model exposure. | `false` — reads only the authenticated user's Ambush data. | `false` — cannot alter or remove data. | +| `create_feed` | `false` — creates persistent stream state. | `false` — writes only to the authenticated user's Ambush account and does not act on arbitrary external systems. | `false` — creation does not remove or irreversibly overwrite existing data, and the new stream can be deleted separately. | +| `update_feed` | `false` — changes a stream's name, prompt, active/paused status, or event transformation. | `false` — writes only to the authenticated user's Ambush account. | `false` — supported changes are reversible through another update and do not delete the stream or its history. | +| `route_feed_channel` | `false` — creates or reactivates a stream-to-destination route. | `false` — routes only between resources in the authenticated user's Ambush account. | `false` — the route can be muted without deleting either resource. | +| `update_feed_channel_route` | `false` — mutes or unmutes future deliveries on an existing route. | `false` — updates only the authenticated user's Ambush route. | `true` — muting permanently cancels pending deliveries and attempts, and unmuting does not recreate them. | | `delete_feed` | `false` — changes account state by deleting a stream. | `false` — affects only the authenticated user's Ambush account. | `true` — permanently removes the selected stream and cannot be undone. | | `list_emissions` | `true` — reads emission history without changing state. | `false` — reads only the authenticated user's Ambush data. | `false` — cannot alter or remove data. | -Reconfirm all annotations against the production scan immediately before submission. +The MCP server also supplies explicit `idempotentHint` values. Reconfirm all annotations against the production scan immediately before submission. ## OAuth reviewer account @@ -38,7 +41,7 @@ Reconfirm all annotations against the production scan immediately before submiss ## Production tool scan - [ ] Run the portal's tool scan against `https://api.ambush.ai/mcp` after the final tool metadata is live. -- [ ] Confirm all six expected tools are present. +- [ ] Confirm all nine expected tools are present and the scan reports no undeclared UI templates or external frame domains. - [ ] Confirm every tool has explicit read-only, open-world, and destructive annotations matching the table above. - [ ] Record the successful scan timestamp in the portal. diff --git a/plugins/ambush-streams/submission/test-cases.md b/plugins/ambush-streams/submission/test-cases.md index 919de35..c1845a4 100644 --- a/plugins/ambush-streams/submission/test-cases.md +++ b/plugins/ambush-streams/submission/test-cases.md @@ -1,17 +1,18 @@ # Plugin review cases -Run these five positive and three negative cases with the dedicated reviewer account. Reset the account to the fixture baseline before every case so no case depends on a mutation performed by another case. Record observed tool calls and outcomes without committing credentials or account identifiers. +Run exactly these six positive and three negative cases with the dedicated reviewer account. Reset the account to the fixture baseline before every case so no case depends on a mutation performed by another case. Record observed tool calls and outcomes without committing credentials or account identifiers. ## Required fixture baseline -Seed and verify these test-only fixtures immediately before submission. +Seed and verify these test-only fixtures immediately before submission. Do not wait for live ingestion to produce them, and do not use the stream created in positive case 2 as the input to positive case 4. | Fixture | Required state | Used by | | --- | --- | --- | | `AI regulation` | One uniquely named paused stream whose prompt monitors proposed AI rules broadly. | Positive cases 1 and 3 | -| `AI Chip Supply` | One uniquely named paused stream with exactly the five deterministic emissions below. | Positive case 4 | -| `Review Disposable` | One uniquely named active stream. Record its real ID as ``. | Positive case 5 | +| `AI Chip Supply` | One uniquely named paused stream with exactly the five deterministic emissions below, preventing live ingestion from changing the fixture during review. | Positive cases 4 and 5 | +| `Review Disposable` | One uniquely named active stream. Record its real ID as `` for the run. | Positive case 6 | | `General Market Monitor` | One uniquely named active stream, ensuring the list case contains active and paused states. | Positive case 1 | +| `Trade Ideas` | One Slack delivery channel with install status `connected` and destination status `active` that is not initially routed to `AI Chip Supply`. | Positive case 5 | Seed exactly these five emissions on `AI Chip Supply`, ordered newest first: @@ -21,7 +22,7 @@ Seed exactly these five emissions on `AI Chip Supply`, ordered newest first: 4. `2026-01-02T12:00:00Z` — `Review fixture — leading-edge foundry outage` 5. `2026-01-01T12:00:00Z` — `Review fixture — substrate supplier capacity reduction` -Before each case, remove any stream created by an earlier run, restore the four named streams to the states above, and confirm `AI Chip Supply` has exactly those five emissions. If fixture reset fails, stop the review run. +Before each case, remove any stream created by an earlier run, restore the four named streams to the states above, and confirm `AI Chip Supply` has exactly those five emissions. If fixture reset fails, stop the review run instead of adapting the expected result to stale state. ## Positive cases @@ -41,15 +42,21 @@ Expected: Invoke `create_feed` exactly once with the supplied name and a faithfu Prompt: `Resume my paused AI regulation stream and change it to focus on enacted rules and enforcement actions.` -Expected: Resolve the exact stream with `list_feeds` when its ID is not already known, then invoke `update_feed` with that stream ID, `status: "active"`, and the revised prompt. If duplicate names exist, ask the user to choose before writing. +Expected: Resolve the exact stream with `list_feeds` when its ID is not already known, then invoke `update_feed` with that stream ID, `status: "active"`, and the revised prompt. Do not search for a separate resume operation. If duplicate names exist, ask the user to choose before writing. ### 4. Review recent emissions Prompt: `Show me the five latest items emitted by my AI Chip Supply stream.` -Expected: Resolve the uniquely named seeded stream, invoke `list_emissions` with a limit of five, and summarize exactly the five newest seeded emissions in returned order. +Expected: Resolve the uniquely named seeded stream, invoke `list_emissions` with a limit of five, and summarize exactly the five newest seeded emissions in returned order. Do not use a stream created in another case, and do not claim there were no items if the request failed. -### 5. Delete after exact confirmation +### 5. Process and deliver every event without polling + +Prompt: `For every new event from my AI Chip Supply stream, produce a cautious trade idea or explicitly say no trade, and send it to my Trade Ideas Slack channel every time the stream fires.` + +Expected: Resolve `AI Chip Supply`, inspect it with `get_feed`, invoke `update_feed` once with a faithful `post_processing` prompt that permits `no_trade`, invoke `list_channels`, and invoke `route_feed_channel` with the connected `Trade Ideas` Slack channel. Confirm this applies to future accepted events. Do not create or suggest a scheduled polling task, do not change the stream's monitoring prompt, and do not ask for Slack credentials. + +### 6. Delete after exact confirmation Prompt: `Permanently delete stream . I confirm that exact stream.`