Skip to content

chore: promote staging to staging-promote/e65ba2e4-24575255629 (2026-04-17 17:16 UTC)#2588

Merged
henrypark133 merged 3 commits intomainfrom
staging-promote/ab8d64cb-24577612819
Apr 18, 2026
Merged

chore: promote staging to staging-promote/e65ba2e4-24575255629 (2026-04-17 17:16 UTC)#2588
henrypark133 merged 3 commits intomainfrom
staging-promote/ab8d64cb-24577612819

Conversation

@ironclaw-ci
Copy link
Copy Markdown
Contributor

@ironclaw-ci ironclaw-ci bot commented Apr 17, 2026

Auto-promotion from staging CI

Batch range: a53eac5c2dec6b6cd5c08189086093fde64aa9cb..ab8d64cbfc9414f289614a73070ace8d279b5623
Promotion branch: staging-promote/ab8d64cb-24577612819
Base: staging-promote/e65ba2e4-24575255629
Triggered by: Staging CI batch at 2026-04-17 17:16 UTC

Commits in this batch (75):

Current commits in this promotion (3)

Current base: staging-promote/e65ba2e4-24575255629
Current head: staging-promote/ab8d64cb-24577612819
Current range: origin/staging-promote/e65ba2e4-24575255629..origin/staging-promote/ab8d64cb-24577612819

Auto-updated by staging promotion metadata workflow

Waiting for gates:

  • Tests: pending
  • E2E: pending
  • Claude Code review: pending (will post comments on this PR)

Auto-created by staging-ci workflow

serrrfirat and others added 3 commits April 18, 2026 01:25
* 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>
@github-actions github-actions bot added scope: channel/web Web gateway channel scope: docs Documentation size: XL 500+ changed lines risk: medium Business logic, config, or moderate-risk modules contributor: core 20+ merged PRs labels Apr 17, 2026
Base automatically changed from staging-promote/e65ba2e4-24575255629 to main April 18, 2026 01:00
@henrypark133 henrypark133 merged commit ab8d64c into main Apr 18, 2026
105 of 152 checks passed
@henrypark133 henrypark133 deleted the staging-promote/ab8d64cb-24577612819 branch April 18, 2026 01:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor: core 20+ merged PRs risk: medium Business logic, config, or moderate-risk modules scope: channel/web Web gateway channel scope: docs Documentation size: XL 500+ changed lines staging-promotion

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants