Skip to content

chore: promote staging to staging-promote/bfca5e93-24761127746 (2026-04-22 08:09 UTC) - #2839

Merged
henrypark133 merged 4 commits into
mainfrom
staging-promote/65380170-24767546819
Apr 29, 2026
Merged

henrypark133 merged 4 commits into
mainfrom
staging-promote/65380170-24767546819

Conversation

@ironclaw-ci

@ironclaw-ci ironclaw-ci Bot commented Apr 22, 2026 •

Copy link
Copy Markdown
Contributor

Auto-promotion from staging CI

Batch range: 7fb41555a9e55677d1aaea29ca567a5b369c2b05..653801700eb0e52393f8ae36455815fc0ad613c3
Promotion branch: staging-promote/65380170-24767546819
Base: staging-promote/bfca5e93-24761127746
Triggered by: Staging CI batch at 2026-04-22 08:09 UTC

Commits in this batch (74):

Current commits in this promotion (4)

Current base: staging-promote/bfca5e93-24761127746
Current head: staging-promote/65380170-24767546819
Current range: origin/staging-promote/bfca5e93-24761127746..origin/staging-promote/65380170-24767546819

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

nickpismenkov and others added 4 commits April 22, 2026 00:32
Previously the hourly staggered schedule (five crons at :00/:15/:30/
:45/:50) kicked off a separate workflow run per cron, which produced
24 runs/day per lane group, four red dots per day when something
flaked, and four separate notifications.

Collapse to a single cron `0 2 * * *`. Every job's `if:` guard now
matches that one slot, so all lanes run as parallel jobs inside a
single workflow run:

  - One run/day, one red dot on failure, one notification.
  - All per-lane statuses visible inside the run; per-job results
    still independent (one failing lane doesn't cancel siblings).
  - If we want to temporarily dial up frequency for a specific lane
    again, we add another cron here and update that lane's `if:`
    guard to match.

02:00 UTC chosen as a low-traffic window globally.
* feat(bridge): project 3 dropped engine events to AppEvents

Closes the first 3 of ~9 coverage gaps in `thread_event_to_app_events`
(#2654) — the UI state convergence work tracked under #2792 (Phase 1).

Bridges:
- `EventKind::StepFailed` → `AppEvent::Error` (LLM / step failures were
  silently dropped; "Processing..." stuck with no explanation)
- `EventKind::ChildCompleted` → new `AppEvent::ChildThreadCompleted`
  (symmetric to existing `ChildThreadSpawned`; tree views couldn't mark
  child branches finished)
- `EventKind::CodeExecutionFailed` → new `AppEvent::CodeExecutionFailed`
  (CodeAct / Monty runtime failures never surfaced to the UI)

Scope kept deliberately narrow: the 3 variants with no duplicate-emit
risk. `ApprovalRequested` / `ApprovalReceived` are deferred to the PR
that adds the `projection-exempt` lint (Phase 1 PR 2), where the
existing direct emits from the gate manager can be audited in the
same change.

Regression tests mirror the existing
`thread_event_to_app_events_preserves_call_id_for_action_events`
pattern — one per new arm, asserting field mapping and `thread_id`
propagation.

Refs: #2792, #2654

* refactor(bridge): type CodeExecutionFailed.category as enum

Addresses a types.md regression in the previous commit. `category` was
stringified on the wire via the engine's `Display` impl, which violates
the "Fixed small sets → enum" rule and risks silent drift if the engine
enum adds a variant.

- Define `CodeExecutionFailureCategory` in `ironclaw_common::event` as a
  parallel Copy enum with matching `#[serde(rename_all = "snake_case")]`
  — same wire format, compile-time variant safety.
- Bridge the engine enum via an exhaustive match in
  `code_execution_category_to_wire`. Exhaustiveness is the point:
  adding a variant to the engine enum is now a compile error here,
  forcing the wire mirror to be kept in lockstep.
- Re-export `CodeExecutionFailureCategory` from the crate root and
  update the bridge test to assert against the typed variant rather
  than a string literal.

The `ironclaw_engine::CodeExecutionFailure` can't be imported directly
into `ironclaw_common` (dependency direction), so the parallel enum is
the cleanest option without a bigger crate restructure.

Refs: #2792
Now the guard will be take and cusom, So we should not skip
msg_tx clone.
feat: add fork_repo action to GitHub WASM tool

Adds fork_repo action with full input validation, optional organization/name/default_branch_only params. CI failures are pre-existing (RUSTSEC-2026-0098 in rustls-webpki transitive dep, unrelated to this PR).
@github-actions github-actions Bot added scope: ci CI/CD workflows scope: docs Documentation size: L 200-499 changed lines risk: medium Business logic, config, or moderate-risk modules contributor: core 20+ merged PRs labels Apr 22, 2026
@claude

claude Bot commented Apr 22, 2026

Copy link
Copy Markdown

Code review

Found 1 issue:

  1. [MEDIUM:75] Semantic mismatch in input validation for fork_repo JSON body fields

https://github.com/anthropics/ironclaw/blob/65380170eb0e52393f8ae36455815fc0ad613c3/tools-src/github/src/lib.rs#L965-L971

The fork_repo() function validates organization and name fields with validate_path_segment(), which rejects characters unsafe for URL path encoding. However, these fields are destined for the JSON request body (lines 981-985), not the URL path. The path only encodes owner and repo (line 979). While the validation accidentally works because serde_json::json!() properly escapes all JSON strings, validating JSON body fields with a URL-path validator is semantically incorrect and may silently reject valid values. JSON body validation should be based on JSON requirements, not URL encoding rules.

Recommendation: Either (a) use a dedicated JSON field validator, or (b) document why URL-path validation is intentionally applied to body fields.


All other checks passed:

  • Event bridging to AppEvents properly implements wire-stable enum pattern with exhaustive matching
  • New tests follow caller-level testing pattern, exercising StepFailed, ChildCompleted, and CodeExecutionFailed events
  • REPL single-message mode fix correctly stores msg_tx clone for /quit injection and regression test validates the complete flow
  • GitHub fork_repo implementation properly handles optional parameters
  • CI workflow consolidation is a straightforward administrative change with no functional risks

Base automatically changed from staging-promote/bfca5e93-24761127746 to main April 29, 2026 04:09
@henrypark133
henrypark133 merged commit 6538017 into main Apr 29, 2026
92 of 123 checks passed
@henrypark133
henrypark133 deleted the staging-promote/65380170-24767546819 branch April 29, 2026 04:09

This branch had an error being deployed

1 failed and 5 inactive deployments
Ironclaw-QA / production — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
ironclaw-nearai / production — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
venice-ironclaw / production — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
cosmose-ironclaw / production — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
humble-cat / staging-cameron — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
Near Foundation Ironclaw / production — 65380170 Deployed Apr 22, 2026 by railway-app[bot]
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: ci CI/CD workflows scope: docs Documentation size: L 200-499 changed lines staging-promotion

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants