chore: promote staging to staging-promote/e65ba2e4-24575255629 (2026-04-17 17:16 UTC)#2588
Merged
henrypark133 merged 3 commits intomainfrom Apr 18, 2026
Merged
Conversation
* fix(safety): add inbound secret scanning to engine v2 path (#2491) The v2 engine path (`handle_with_engine_inner` in `bridge/router.rs`) forwarded user messages directly to the conversation manager without any safety checks. This allowed secrets (API keys, Slack tokens, AWS credentials, etc.) pasted in chat to reach the LLM and be permanently stored in conversation history. Add the same three safety checks that the v1 path (`thread_ops.rs`) already enforces: `validate_input`, `check_policy`, and `scan_inbound_for_secrets`. Messages containing detected secrets are now rejected with a user-facing warning before reaching the engine. Includes a regression test exercising Slack bot tokens and OpenAI keys through the v2 code path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style(safety): fix rustfmt formatting in secret scan test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(safety): fix OpenAI key test — payload too short for regex (#2494) The mock OpenAI key `sk-abc123def456ghi789` had only 19 chars after the prefix, but the leak detector regex requires 20+. Extended the key and added a specific assertion matching the Slack token check. Addresses gemini-code-assist review feedback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore(deps): ignore RUSTSEC-2026-0099 webpki advisory Wildcard name constraint bypass in rustls-webpki 0.102.8, pinned by the libsql transitive dependency chain. Same root cause as the already-ignored RUSTSEC-2026-0049. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: minor comment tweak to retrigger CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(ci): resolve clippy and fmt errors Remove useless .into_iter() in catalog.rs and fix rustfmt style in e2e_attachments.rs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(bridge): use BridgeOutcome instead of Option<String> in safety checks The inbound safety scanning code was written against the old Option<String> return type, but handle_with_engine_inner now returns BridgeOutcome. Replace Ok(Some(...)) with Ok(BridgeOutcome::Respond(...)) and update tests to match on the enum variants. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Illia Polosukhin <ilblackdragon@gmail.com>
… (#2498) * fix(web): prevent user messages from vanishing during safety-pipeline window (#2409) When loadHistory() re-renders the chat (thread switch, SSE reconnect, page reload), user messages that haven't been persisted yet disappear because the agent loop persists them after safety checks (100ms-1s delay). This fix tracks pending messages client-side and re-injects them into the DOM when loadHistory() doesn't find them in the DB yet. - Add _pendingUserMessages Map with 60s TTL - Record pending messages in sendMessage() before the fetch call - Clear pending entries when SSE events confirm agent processing - Re-inject non-persisted pending messages in loadHistory() fresh path - Suppress welcome card when pending messages exist Purely frontend fix — no backend changes, no safety pipeline bypass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(e2e): add Playwright tests for pending message persistence (#2409) Six scenarios covering the frontend fix for disappearing user messages: - User message visible immediately after send (optimistic display) - Pending message survives SSE reconnect (re-injected by loadHistory) - Pending messages cleared after agent response (no stale entries) - No duplicates when DB already has the message - Welcome card suppressed when pending messages exist - Full round-trip message survives page reload (DB persistence) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(e2e): use domcontentloaded for reload test — SSE blocks networkidle Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(web): address review — remove SSE early-clear race, use frequency map for pending dedup (#2498) Remove _pendingUserMessages.delete() from response/tool_started/stream_chunk SSE handlers to prevent race condition when user sends multiple messages in quick succession. Replace Set-based dedup in loadHistory with a frequency map so duplicate-content messages ("ok", "ok") are tracked correctly. Simplify welcome-card guard using hoisted freshPending. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(web): clear pending entry on turn completion — address henrypark133 review (#2498) * fix(web): address review — remove pending on send fail, Map for dedup, improve reconnect test (#2498) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove unused imports in pending message test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: retrigger checks against updated staging base * fix(web): preserve images in pending messages, harden tests (#2498) Address remaining review feedback: - Capture attached image data URLs in optimistic display and in the _pendingUserMessages entry so a thread switch / SSE reconnect re-injects thumbnails alongside the text instead of just an "(images attached)" placeholder. - Rewrite the SSE-reconnect test to drive the real production path: stub apiFetch so /api/chat/send hangs, send via the real UI, force a reconnect, and assert the message survives — instead of manually pre-populating the pending map. - Add coverage for the .catch() cleanup branch in sendMessage so a rejected /api/chat/send leaves _pendingUserMessages clean. - Add a FIFO-assumption comment on the response-handler shift() and drop the leading underscore on the function-local `pending` (the underscore convention in this file is for module-level state). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Illia Polosukhin <ilblackdragon@gmail.com>
… calls (#2353) * feat(gateway): project metrics dashboard, mission scheduling UI, and new-project skill Adds project metrics types, mission cadence scheduling via gateway, and a /new-project skill for creating autonomous projects with goals, metrics, and missions. Includes gateway frontend enhancements for project views with metrics and goal tracking. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(engine): resolve template refs in parallel tool calls and rewrite new-project skill Two fixes from trace analysis (trace_20260411T133641.json): 1. Skill rewrite: new-project skill now instructs the model to use memory_write + mission_create directly instead of referencing nonexistent project_create/project_update tools. Includes goals and metrics when appropriate. Instructs sequential execution. 2. Template ref resolution: some OpenAI-format models (e.g. Qwen) emit {{call_id.field}} references in parallel tool call arguments. Added resolution pass in LlmBridgeAdapter that scans ActionCall parameters for these patterns and resolves them from prior tool results in the conversation history. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(e2e): add project detail page screenshot test Playwright test that seeds mock project data via page.route() API interception, navigates to the Projects tab, drills into a project, and captures a screenshot showing goals, missions, and activity. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add project detail screenshot for PR Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address PR review — remove project tools, fix IDOR, scope widgets, add tests - Remove project_create/project_update/project_list tools and capability registration (skill uses memory_write + mission_create only) - Add ownership check on mission_create project_id override to prevent IDOR - Reject non-UUID project_id values explicitly instead of silent fallback - Add goals field to ProjectOverviewEntry so frontend drill-in renders them - Propagate store errors in overview instead of unwrap_or_default masking failures - Scope project widget CSS server-side via scope_css (prevents style leakage) - Fix template ref doc comment to match partial resolution semantics - Fix E2E mock widget response shape (bare array, not wrapped object) - Call crBackToOverview() on tab switch to tear down project widgets - Add caller-level test for template ref resolution through LlmBridgeAdapter - Clean up stale cargo-deny advisory ignores, add RUSTSEC-2026-0097 (rand) - Run cargo fmt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: resolve project slugs in mission_create, fix widget CSS comments - mission_create now accepts project name/slug (not just UUID) by matching against the user's projects — fixes the skill's slug-based project_id - Fix misleading CSS comment in app.js (CSS is scoped server-side) - Fix style variable hoisting issue in widget mounting - Log workspace.list() errors instead of silently swallowing them Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address PR review round 3 — slug matching, template injection, N+1 queries - Remove over-broad `starts_with` slug prefix matching in mission_create project_id resolution — require exact name/slug match only (serrrfirat) - Fix slug generation inconsistency: frontend.rs now uses is_ascii_alphanumeric() matching effect_adapter.rs (serrrfirat) - Prevent second-order template injection: resolve_template_refs now advances past resolved content instead of re-scanning from position 0, and skips unresolvable refs instead of breaking (serrrfirat) - Parallelize N+1 overview queries: per-project thread/mission fetches now use tokio::try_join! + futures::try_join_all (serrrfirat, Copilot) - Add two new security tests for template ref resolution Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <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.
Auto-promotion from staging CI
Batch range:
a53eac5c2dec6b6cd5c08189086093fde64aa9cb..ab8d64cbfc9414f289614a73070ace8d279b5623Promotion branch:
staging-promote/ab8d64cb-24577612819Base:
staging-promote/e65ba2e4-24575255629Triggered by: Staging CI batch at 2026-04-17 17:16 UTC
Commits in this batch (75):
ironclaw profile listsubcommand (feat(cli): addironclaw profile listsubcommand #2288)reasoning_contentfields in chat completions response (fix: duplicatereasoning_contentfields in chat completions response #2493)Current commits in this promotion (3)
Current base:
staging-promote/e65ba2e4-24575255629Current head:
staging-promote/ab8d64cb-24577612819Current range:
origin/staging-promote/e65ba2e4-24575255629..origin/staging-promote/ab8d64cb-24577612819Auto-updated by staging promotion metadata workflow
Waiting for gates:
Auto-created by staging-ci workflow