Files
ironclaw/Cargo.toml
jinxin ea111c67b9 fix(ci): stabilize main branch coverage checks (#7995)
* fix(ci): stabilize main branch coverage checks

* fix(ci): complete main CI stabilization

* fix(notifications): backfill terminal approval cleanup

* test(ci): harden hooks parity timeout contract

* test(composition): cover approval backfill replay wiring

* test(ci): keep timeout decoys lint clean

* test(ci): address final review feedback

* ci: restore main-only workflow triggers

* fix(security): update Wasmtime to 47.0.4
2026-08-31 12:21:42 +00:00

610 lines
28 KiB
TOML

[workspace]
members = [".", "crates/contracts/ironclaw_common", "crates/substrates/ironclaw_observability", "crates/contracts/ironclaw_host_api", "crates/product/ironclaw_host_ingress", "crates/substrates/ironclaw_libsql_runtime", "crates/substrates/ironclaw_filesystem", "crates/domains/ironclaw_attachments", "crates/domains/ironclaw_extractors", "crates/substrates/ironclaw_documents", "crates/domains/ironclaw_memory", "crates/extensions/packages/memory-native", "crates/extensions/packages/mem0", "crates/events/ironclaw_event_log", "crates/events/ironclaw_event_projections", "crates/events/ironclaw_event_streams", "crates/events/ironclaw_event_store", "crates/extensions/ironclaw_extension_registry", "crates/extensions/ironclaw_extension_host", "crates/extensions/ironclaw_extension_manager", "crates/kernel/ironclaw_processes", "crates/lanes/ironclaw_sandbox", "crates/lanes/ironclaw_mcp", "crates/lanes/ironclaw_wasm", "crates/lanes/ironclaw_wasm_limiter", "crates/kernel/ironclaw_capabilities", "crates/substrates/ironclaw_secrets", "crates/substrates/ironclaw_network", "crates/kernel/ironclaw_host_runtime", "crates/kernel/ironclaw_runtime_policy", "crates/kernel/ironclaw_authorization", "crates/kernel/ironclaw_approvals", "crates/kernel/ironclaw_resources", "crates/domains/ironclaw_auth", "crates/kernel/ironclaw_trust", "crates/kernel/ironclaw_turns", "crates/contracts/ironclaw_loop_contracts", "crates/contracts/ironclaw_extension_contracts", "crates/contracts/ironclaw_product_contracts", "crates/loop/ironclaw_agent_loop", "crates/domains/ironclaw_threads", "crates/contracts/ironclaw_prompt_envelope", "crates/loop/ironclaw_hooks", "crates/loop/ironclaw_loop_host", "crates/loop/ironclaw_turn_runner", "crates/app/ironclaw_config", "crates/product/ironclaw_operator", "crates/app/ironclaw_composition", "crates/domains/ironclaw_identity", "crates/extensions/ironclaw_extension_support", "crates/app/ironclaw_cli", "crates/domains/ironclaw_trace_commons", "crates/product/ironclaw_webui", "crates/product/ironclaw_openai_compat", "crates/domains/ironclaw_conversations", "crates/product/ironclaw_assistant", "crates/extensions/packages/telegram", "crates/extensions/packages/slack", "crates/extensions/packages/web-app", "crates/domains/ironclaw_notifications", "crates/domains/ironclaw_outbound", "crates/domains/ironclaw_triggers", "crates/domains/ironclaw_web_app", "crates/app/ironclaw_architecture_tests", "crates/substrates/ironclaw_safety", "crates/domains/ironclaw_skills", "crates/domains/ironclaw_llm", "tools/ironclaw_stress"]
default-members = ["crates/app/ironclaw_cli"]
exclude = [
# Standalone helper binary, `[workspace]`-rooted and never built here (it
# needs libclang + a C toolchain). Its §5 home is `tools/`, beside the
# stress harness — WS7 relocated it out of `crates/`, which after the
# family moves holds exactly the ten family directories (PROPOSAL §5,
# §12.13 D-O).
"tools/ironclaw_silk_decoder",
# The root `fuzz/` package was deleted in WS8: it declared
# `[dependencies.ironclaw] path = ".."` and fuzzed `ironclaw::safety` /
# `ironclaw::tools`, but the root package has had no lib target since the
# v1 monolith was removed, so it could not resolve. `ironclaw_safety/fuzz`
# is a separate, live fuzz package and stays.
"crates/substrates/ironclaw_safety/fuzz",
]
[workspace.package]
rust-version = "1.96"
[workspace.dependencies]
# WASM sandbox for untrusted tool execution.
# Floor 47.0.4: minimum current major patch containing the fixes for the
# Wasmtime advisories RUSTSEC-2026-0149, RUSTSEC-2026-0188,
# RUSTSEC-2026-0222, RUSTSEC-2026-0223, and RUSTSEC-2026-0269.
wasmtime = { version = "47.0.4", features = ["component-model"] }
# Only the WASI p2 host API is linked (`p2::add_to_linker_sync`). Keeping
# defaults off avoids compiling unused p0/p1 WITX proc macros under remote CI
# sccache workers, where registry sidecar WITX files are not present.
wasmtime-wasi = { version = "47.0.4", default-features = false, features = ["p2"] }
# Maintainability guardrails against dead/speculative public API
# (the "Theme 1" anti-pattern from the maintainability audit: accessors,
# `_dyn` variants, and getters with zero callers that needlessly expand the
# stable surface). These are `warn`, not `deny`, and are *opted into*
# per-crate via `[lints] workspace = true` so they do not flood the build
# with pre-existing noise across the whole workspace. Currently scoped to the
# hook/reborn crates.
#
# - `unreachable_pub`: flags `pub` items that are not reachable outside their
# crate — the classic "this should be `pub(crate)`" smell.
# - `dead_code`: warn on never-used items (this is the rustc default, declared
# here so it survives any future `#![allow(dead_code)]` creep at the crate root).
[workspace.lints.rust]
unreachable_pub = "warn"
dead_code = "warn"
# A `Result`/`#[must_use]` value that is silently discarded is a swallowed
# error. `unused_must_use` is warn-by-default; deny it so a dropped `Result`
# fails the build instead of hiding a failure. Verified zero current fires
# across the workspace, so this only guards against *future* silent drops.
#
# Companion clippy lints that catch the other swallow idioms are deferred to
# follow-up PRs because they need a real cleanup first (measured on this tree):
# * `clippy::let_underscore_must_use` — 67 sites (`let _ = <must_use>`), a mix
# of safe discards and genuine swallows (e.g. an ignored async delete).
# * `clippy::map_err_ignore` — ~861 sites; a blanket deny is wrong here since
# `.claude/rules/error-handling.md` permits `map_err` to a *specific* typed
# error and only forbids cause-dropping ones. Needs a scoped sweep.
unused_must_use = "deny"
[package]
# Tier B (see docs/internal/plans/2026-07-02-reborn-internal-module-refactor.md §8):
# the v1 legacy monolith (`src/`, package `ironclaw_legacy`, binary
# `ironclaw-legacy`) has been deleted. This package now exists solely to host
# the Reborn integration test suite (`tests/integration/*`, the `reborn_*`
# `[[test]]` targets below, and their shared `[dev-dependencies]`) — it has no
# library or binary target of its own.
name = "ironclaw_integration_tests"
publish = false
version = "0.1.0"
edition = "2024"
rust-version.workspace = true
license = "MIT OR Apache-2.0"
homepage = "https://github.com/nearai/ironclaw"
repository = "https://github.com/nearai/ironclaw"
[package.metadata.ironclaw]
layer = "app"
[package.metadata.dist]
dist = false
[dev-dependencies]
# Common utility crates the Reborn integration tests (`tests/integration/*`,
# `tests/reborn_*.rs`) reference directly — previously satisfied via the now-
# deleted v1 `[dependencies]` block, since regular deps were visible to test
# binaries too.
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
async-trait = "0.1"
thiserror = "2"
chrono = { version = "0.4", features = ["serde"] }
uuid = { version = "1", features = ["v4", "v5", "serde"] }
secrecy = { version = "0.10", features = ["serde"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
axum = { version = "0.8", features = ["ws"] }
tower = { version = "0.5", features = ["util"] }
reqwest = { version = "0.12", default-features = false, features = ["json", "multipart", "rustls-tls-native-roots", "stream"] }
base64 = "0.22"
rust_decimal = { version = "1", features = ["serde", "serde-with-str"] }
regex = "1"
sha2 = "0.11"
hex = "0.4"
url = "2"
toml = "1.1"
zip = { version = "8", default-features = false, features = ["deflate"] }
libsql = { version = "0.9", default-features = false, features = ["core", "replication", "remote", "tls"] }
# `test-support` exposes the witness-gated protocol-auth test seam and the
# messaging conformance helpers used by the integration fixtures. Declared
# explicitly because cfg(test) and sibling feature unification do not
# propagate reliably into an integration-test dependency graph.
ironclaw_host_api = { path = "crates/contracts/ironclaw_host_api", version = "0.1.0", features = ["test-support"] }
ironclaw_memory = { path = "crates/domains/ironclaw_memory", version = "0.1.0" }
# The production-backend memory integration scenario binds the native provider
# over the same libSQL composite used by memory tool dispatch.
ironclaw_memory_native = { path = "crates/extensions/packages/memory-native", version = "0.1.0" }
ironclaw_host_ingress = { path = "crates/product/ironclaw_host_ingress", version = "0.1.0" }
ironclaw_runtime_policy = { path = "crates/kernel/ironclaw_runtime_policy", version = "0.1.0" }
ironclaw_common = { path = "crates/contracts/ironclaw_common" }
ironclaw_safety = { path = "crates/substrates/ironclaw_safety" }
ironclaw_sandbox = { path = "crates/lanes/ironclaw_sandbox" }
ironclaw_trace_commons = { path = "crates/domains/ironclaw_trace_commons", version = "0.1.0" }
# The Reborn integration harness provisions Postgres testcontainers in every
# feature lane (StorageMode::Postgres skips at runtime when unavailable), so
# the pool deps are unconditional dev-dependencies (the `postgres` feature is
# a marker with no dependency gating).
deadpool-postgres = "0.14"
tokio-postgres = { version = "0.7", features = ["with-uuid-1", "with-chrono-0_4", "with-serde_json-1"] }
# The generic-extension ingress/delivery integration suites verify webhook
# HMAC recipes and collect axum response bodies.
hmac = "0.13"
http-body-util = "0.1"
tokio-test = "0.4"
tracing-test = "0.2"
testcontainers-modules = { version = "0.12", features = ["postgres"] }
pretty_assertions = "1"
tempfile = "3"
insta = { version = "1.46.3", features = ["yaml"] }
# Pull the LLM crate's `testing` feature in only for tests so `StubLlm` and
# fault-injection helpers don't ship in release binaries.
ironclaw_llm = { path = "crates/domains/ironclaw_llm", version = "0.1.0", features = ["test-support"] }
ironclaw_agent_loop = { path = "crates/loop/ironclaw_agent_loop", version = "0.1.0", features = ["test-support"] }
ironclaw_approvals = { path = "crates/kernel/ironclaw_approvals", version = "0.1.0", features = ["test-support"] }
# Pull the auth crate's `test-support` feature in only for tests so the
# `test_support::conformance` OAuth-flow suite (used by the
# `reborn_integration_oauth_connect` test) doesn't ship in release binaries.
ironclaw_auth = { path = "crates/domains/ironclaw_auth", version = "0.1.0", features = ["test-support"] }
# C-ATTACH: `InboundAttachment` for `submit_turn_with_image_attachment`.
ironclaw_attachments = { path = "crates/domains/ironclaw_attachments", version = "0.1.0" }
# `test-support` enables the in-memory-backed capability-lease store constructor
# for the integration-test harness (cfg(test) does not propagate into deps).
ironclaw_authorization = { path = "crates/kernel/ironclaw_authorization", version = "0.1.0", features = ["test-support"] }
# Integration harness builds a fresh in-memory `ReplayPayloadStore`
# fallback for harnesses without shared approval parts (§5.3 Stage 2a-i).
ironclaw_capabilities = { path = "crates/kernel/ironclaw_capabilities", version = "0.1.0" }
ironclaw_extension_registry = { path = "crates/extensions/ironclaw_extension_registry", version = "0.1.0" }
# Extension-runtime P2: the invented-vendor fixture factory the integration
# harness registers (`NativeExtensionFactory`), plus scripted channel fakes.
ironclaw_extension_host = { path = "crates/extensions/ironclaw_extension_host", version = "0.1.0", features = ["test-support"] }
# WS2.4: the lifecycle service bundle the hosted-MCP registration integration
# test drives moved to the manager with the product face it builds.
ironclaw_extension_manager = { path = "crates/extensions/ironclaw_extension_manager", version = "0.1.0", features = ["test-support"] }
ironclaw_filesystem = { path = "crates/substrates/ironclaw_filesystem", version = "0.1.0" }
ironclaw_notifications = { path = "crates/domains/ironclaw_notifications", version = "0.1.0" }
ironclaw_mcp = { path = "crates/lanes/ironclaw_mcp", version = "0.1.0" }
ironclaw_extension_support = { path = "crates/extensions/ironclaw_extension_support", version = "0.1.0" }
# W6-COLD-SPOTS: `CommunicationPreferenceRecord`/`CommunicationPreferenceKey`
# for the outbound-store-durability reopen test.
ironclaw_outbound = { path = "crates/domains/ironclaw_outbound", version = "0.1.0", features = ["test-support"] }
# Recording hook doubles + `HookDispatcherBuilderFactory` builders for the
# C-HOOKS / E-HOOK-INFRA int-tier coverage (tests/integration/support/hooks.rs).
ironclaw_hooks = { path = "crates/loop/ironclaw_hooks", version = "0.1.0" }
ironclaw_host_runtime = { path = "crates/kernel/ironclaw_host_runtime", version = "0.1.0" }
ironclaw_network = { path = "crates/substrates/ironclaw_network", version = "0.1.0" }
ironclaw_processes = { path = "crates/kernel/ironclaw_processes", version = "0.1.0", features = ["test-support"] }
ironclaw_resources = { path = "crates/kernel/ironclaw_resources", version = "0.1.0", features = ["test-support"] }
ironclaw_secrets = { path = "crates/substrates/ironclaw_secrets", version = "0.1.0" }
ironclaw_assistant = { path = "crates/product/ironclaw_assistant", version = "0.1.0", features = ["test-support"] }
ironclaw_turn_runner = { path = "crates/loop/ironclaw_turn_runner", version = "0.1.0", features = ["test-support"] }
# `ironclaw_webui` + `ironclaw_identity` sit on the int-tier coverage
# lane (identity_resolution_smoke / webui_v2_router_smoke); they compile into
# every int-tier build, behaviorally inert for suites that never call them.
# W5-SLACK-PAIR: the Slack host surface grows the lcov denominator by ~42k
# lines of slack_*.rs modules (previously invisible, not 0%) and unlocks
# composing them in int-tier tests. All 17 of those modules are recompiled
# into every int-tier test binary — a real, one-time build-time cost for the
# lane, behaviorally inert for suites that never reference Slack types.
ironclaw_composition = { path = "crates/app/ironclaw_composition", version = "0.1.0", features = ["test-support"] }
ironclaw_loop_host = { path = "crates/loop/ironclaw_loop_host", features = ["test-support"] }
# Direct dev-dep: composition deliberately does NOT re-export the bare
# `webui_v2_router`/`WebUiV2State` (facade-only rule), and the router smoke
# drives the bare router, not the `webui_v2_app` wrapper. The v2 route surface
# merged into `ironclaw_webui` (as its public `webui_v2` module).
ironclaw_webui = { path = "crates/product/ironclaw_webui", version = "0.1.0" }
# Direct dev-dep for the same reason as ironclaw_webui above: composition's
# facade-only rule means it re-exports no SLACK_V2_ADAPTER_ID/SLACK_USER_ACTOR_KIND-style
# constants; Slack pairing/actor-resolution int-tier tests need them directly.
ironclaw_slack_extension = { path = "crates/extensions/packages/slack", version = "0.1.0" }
ironclaw_telegram_extension = { path = "crates/extensions/packages/telegram", version = "0.1.0" }
ironclaw_web_app = { path = "crates/domains/ironclaw_web_app", version = "0.1.0" }
ironclaw_web_app_extension = { path = "crates/extensions/packages/web-app", version = "0.1.0" }
ironclaw_config = { path = "crates/app/ironclaw_config", version = "0.1.0" }
ironclaw_openai_compat = { path = "crates/product/ironclaw_openai_compat", version = "0.1.0"}
ironclaw_threads = { path = "crates/domains/ironclaw_threads", version = "0.1.0" }
# `test-support` unlocks the shared in-memory process-journal-backed turn
# runtime used by integration tests. cfg(test) does not propagate from an
# integration-test binary into its deps, so the feature is explicit here.
ironclaw_loop_contracts = { path = "crates/contracts/ironclaw_loop_contracts", version = "0.1.0" }
ironclaw_extension_contracts = { path = "crates/contracts/ironclaw_extension_contracts", version = "0.1.0" }
ironclaw_product_contracts = { path = "crates/contracts/ironclaw_product_contracts", version = "0.1.0" }
ironclaw_turns = { path = "crates/kernel/ironclaw_turns", version = "0.1.0", features = ["test-support"] }
# `InMemoryDurableEventLog` for the W5-WEBUI-API-1 SSE scenario's test-local
# `ProjectionStream` wiring (`build_webui_event_stream_for_test`).
ironclaw_event_log = { path = "crates/events/ironclaw_event_log", version = "0.1.0" }
# Production RootFilesystem-backed durable event store used by the canonical
# DB-write measurement target.
ironclaw_event_store = { path = "crates/events/ironclaw_event_store", version = "0.1.0" }
# Binary Reborn E2E recovery scenarios replay the milestone-backed durable log
# through the production event projection service.
ironclaw_event_projections = { path = "crates/events/ironclaw_event_projections", version = "0.1.0" }
# `test-support` unlocks `TrustedTriggerSubmitRequest::new_for_test` (E-TRIGGERED-SUBMIT
# harness seam) — cfg(test) does not propagate from an integration-test binary into its deps.
ironclaw_triggers = { path = "crates/domains/ironclaw_triggers", version = "0.1.0", features = ["test-support"] }
# Trigger-conversation binding/session services for the E-TRIGGERED-SUBMIT harness seam —
# mirrors the conversation-services type production's own local-dev build wires for the
# trusted-trigger submit path (ironclaw_composition::runtime.rs).
ironclaw_conversations = { path = "crates/domains/ironclaw_conversations", version = "0.1.0" }
ironclaw_trust = { path = "crates/kernel/ironclaw_trust", version = "0.1.0" }
ironclaw_wasm = { path = "crates/lanes/ironclaw_wasm", version = "0.1.0" }
# Reusable before/after database probe used by dedicated measured workloads.
ironclaw_stress = { path = "tools/ironclaw_stress", version = "0.1.0" }
# `ironclaw_outbound/test-support` provides the in-memory-backed
# `OutboundStateStore` the triggered-delivery outcome-seam int-tier
# proof injects (asserting a real `TriggeredRunDeliveryDriver`'s recorded
# outcome via the same public store trait the composition factory accepts).
# Named `#[case]` parametrization for the storage-backend matrix tests (slice 3).
rstest = "0.23"
[features]
# Opt-in feature for especially heavy integration-test targets that run in a
# dedicated CI job instead of the default Rust test matrix.
integration = []
[[test]]
name = "reborn_group_approvals"
path = "tests/integration/group_approvals/main.rs"
[[test]]
name = "reborn_group_memory"
path = "tests/integration/group_memory/main.rs"
[[test]]
name = "reborn_group_extensions"
path = "tests/integration/group_extensions/main.rs"
[[test]]
name = "reborn_group_device_link"
path = "tests/integration/group_device_link/main.rs"
[[test]]
name = "reborn_group_triggers"
path = "tests/integration/group_triggers/main.rs"
[[test]]
name = "reborn_group_multiuser"
path = "tests/integration/group_multiuser/main.rs"
[[test]]
name = "reborn_group_skills"
path = "tests/integration/group_skills/main.rs"
[[test]]
name = "reborn_generated_gate_sequences"
path = "tests/integration/generated_gate_sequences.rs"
[[test]]
name = "reborn_generated_restart_sequences"
path = "tests/integration/generated_restart_sequences.rs"
[[test]]
name = "reborn_group_journeys"
path = "tests/integration/group_journeys/main.rs"
[[test]]
name = "reborn_integration_oauth_refresh"
path = "tests/integration/auth/oauth_refresh.rs"
[[test]]
name = "reborn_integration_attach"
path = "tests/integration/attach.rs"
[[test]]
name = "reborn_integration_document_edit"
path = "tests/integration/document_edit.rs"
[[test]]
name = "reborn_integration_notification_inbox_user_isolation"
path = "tests/integration/notification_inbox_user_isolation.rs"
[[test]]
name = "reborn_integration_sandbox_shell_turn"
path = "tests/integration/reborn_sandbox_shell_turn.rs"
[[test]]
name = "reborn_integration_suggestions"
path = "tests/integration/suggestions.rs"
[[test]]
name = "reborn_integration_subagent_await_edge"
path = "tests/integration/subagent_await_edge.rs"
[[test]]
name = "reborn_integration_unbound_turns"
path = "tests/integration/unbound_turns.rs"
[[test]]
name = "reborn_integration_auth_failure"
path = "tests/integration/auth/auth_failure.rs"
[[test]]
name = "reborn_integration_auth_gate"
path = "tests/integration/auth/auth_gate.rs"
[[test]]
name = "reborn_integration_backend_matrix"
path = "tests/integration/backend_matrix.rs"
[[test]]
name = "reborn_integration_budget"
path = "tests/integration/budget.rs"
[[test]]
name = "reborn_integration_cancel"
path = "tests/integration/cancel.rs"
[[test]]
name = "reborn_integration_steering"
path = "tests/integration/steering.rs"
[[test]]
name = "reborn_integration_model_recovery"
path = "tests/integration/model_recovery.rs"
[[test]]
name = "reborn_integration_terminal_warning"
path = "tests/integration/terminal_warning.rs"
[[test]]
name = "reborn_integration_channel_connection_projection"
path = "tests/integration/channel_connection_projection.rs"
[[test]]
name = "reborn_integration_comm_context"
path = "tests/integration/comm_context.rs"
[[test]]
name = "reborn_integration_prompt_prefix_stability"
path = "tests/integration/prompt_prefix_stability.rs"
[[test]]
name = "reborn_integration_durable"
path = "tests/integration/durable.rs"
[[test]]
name = "reborn_integration_delivery_user_journeys"
path = "tests/integration/delivery_user_journeys.rs"
[[test]]
name = "reborn_integration_extension_runtime"
path = "tests/integration/extension_runtime.rs"
[[test]]
name = "reborn_integration_extension_ingress"
path = "tests/integration/extension_ingress.rs"
[[test]]
name = "reborn_integration_extension_delivery"
path = "tests/integration/extension_delivery.rs"
[[test]]
name = "reborn_integration_extension_visibility"
path = "tests/integration/extension_visibility.rs"
[[test]]
name = "reborn_integration_extension_user_lifecycle_isolation"
path = "tests/integration/extension_user_lifecycle_isolation.rs"
[[test]]
name = "reborn_integration_golden_payload"
path = "tests/integration/golden_payload.rs"
[[test]]
name = "reborn_integration_greeting"
path = "tests/integration/greeting.rs"
[[test]]
name = "reborn_integration_hooks"
path = "tests/integration/hooks.rs"
[[test]]
name = "reborn_integration_http_matcher"
path = "tests/integration/http_matcher.rs"
[[test]]
name = "reborn_integration_idempotent_replay"
path = "tests/integration/idempotent_replay.rs"
[[test]]
name = "reborn_integration_identity_resolution_smoke"
path = "tests/integration/identity_resolution_smoke.rs"
[[test]]
name = "reborn_integration_lease_wedge"
path = "tests/integration/lease_wedge.rs"
[[test]]
name = "reborn_integration_mcp"
path = "tests/integration/mcp.rs"
[[test]]
name = "reborn_integration_hosted_mcp_registration"
path = "tests/integration/hosted_mcp_registration.rs"
[[test]]
name = "reborn_integration_oauth_connect"
path = "tests/integration/auth/oauth_connect.rs"
[[test]]
name = "reborn_integration_oauth_popup_journeys"
path = "tests/integration/auth/oauth_popup_journeys.rs"
[[test]]
name = "reborn_integration_outbound_store_durability"
path = "tests/integration/outbound_store_durability.rs"
[[test]]
name = "reborn_integration_outbound_target"
path = "tests/integration/outbound_target.rs"
[[test]]
name = "reborn_integration_process_port"
path = "tests/integration/process_port.rs"
[[test]]
name = "reborn_integration_profile"
path = "tests/integration/profile.rs"
[[test]]
name = "reborn_integration_project_create"
path = "tests/integration/project_create.rs"
[[test]]
name = "reborn_integration_real_egress_pipeline"
path = "tests/integration/real_egress_pipeline.rs"
[[test]]
name = "reborn_integration_reopen_resume_through_gate"
path = "tests/integration/auth/reopen_resume_through_gate.rs"
[[test]]
name = "reborn_integration_safety"
path = "tests/integration/safety.rs"
[[test]]
name = "reborn_integration_secret_injection"
path = "tests/integration/secret_injection.rs"
[[test]]
name = "reborn_integration_secrets"
path = "tests/integration/secrets.rs"
[[test]]
name = "reborn_integration_skill_activate"
path = "tests/integration/skill_activate.rs"
[[test]]
name = "reborn_integration_surface_disclosure"
path = "tests/integration/surface_disclosure.rs"
[[test]]
name = "reborn_integration_tool_call"
path = "tests/integration/tool_call.rs"
[[test]]
name = "reborn_integration_tool_disclosure"
path = "tests/integration/tool_disclosure.rs"
[[test]]
name = "reborn_integration_trace_capture"
path = "tests/integration/trace_capture.rs"
[[test]]
name = "reborn_integration_tracecap"
path = "tests/integration/tracecap.rs"
[[test]]
name = "reborn_integration_triggered_submit"
path = "tests/integration/triggered_submit.rs"
[[test]]
name = "reborn_integration_web_access"
path = "tests/integration/web_access.rs"
[[test]]
name = "reborn_integration_webui_v2_product_api"
path = "tests/integration/webui_v2_product_api.rs"
[[test]]
name = "reborn_integration_webui_v2_router_smoke"
path = "tests/integration/webui_v2_router_smoke.rs"
[[test]]
name = "reborn_integration_wiring_parity"
path = "tests/integration/wiring_parity.rs"
[[test]]
name = "reborn_integration_run_artifact_timings"
path = "tests/integration/run_artifact_timings.rs"
[[test]]
name = "reborn_integration_db_write_canonical"
path = "tests/integration/db_write_canonical.rs"
# Debug-info policy for dev and test (test inherits dev, so this one line
# governs `cargo test` binaries and their dependencies too). CI has built
# every heavy lane with CARGO_PROFILE_DEV_DEBUG=0/CARGO_PROFILE_TEST_DEBUG=0
# for a long time; codifying it here makes local builds reproduce CI and lets
# the per-workflow env copies be deleted as no-ops. Assert/panic messages
# keep their file:line via panic::Location at any debug level; debug=0 only
# drops mid-frame file:line from RUST_BACKTRACE output. Measured 2026-08-21
# on ironclaw_common tests (rustc 1.98.0): debug=0 175 MiB / line-tables-only
# 257 MiB (+47%) / full 272 MiB — the smaller artifacts win on 2-core CI
# runners and the 10 GB cache budget. Debugging locally with variable
# inspection? Override per-run: `CARGO_PROFILE_DEV_DEBUG=2 cargo <cmd>`.
[profile.dev]
debug = 0
[profile.release]
# Already cargo's built-in default (debug info is off by default in
# release); made explicit because ironclaw-stress.yml restated it three
# times as CARGO_PROFILE_RELEASE_DEBUG=0 workflow/job env — this line makes
# those deletable no-ops too (Task 9).
debug = 0
strip = true # Remove debug symbols from release binaries
# The profile that 'cargo dist' will build with
[profile.dist]
inherits = "release"
lto = "thin"
# Config for 'dist'
[workspace.metadata.dist]
# The preferred dist version to use in CI (Cargo.toml SemVer syntax)
cargo-dist-version = "0.31.0"
# cargo-dist 0.31 grants `contents: write` to every generated job. Keep the
# checked-in CI customized so only the host job can publish a GitHub Release.
allow-dirty = ["ci"]
# Release only the canonical Reborn CLI.
packages = ["ironclaw"]
# CI backends to support
ci = "github"
# Match the canonical `ironclaw-v*` release tags.
tag-namespace = "ironclaw"
# Install build-only prerequisites before cargo-dist compiles each target.
github-build-setup = "../dist-build-setup.yml"
# The installers to generate for each app
installers = ["shell", "powershell", "msi"]
# Publish jobs to run in CI
publish-jobs = []
# Target platforms to build apps for (Rust target-triple syntax)
targets = [
"aarch64-apple-darwin",
"aarch64-unknown-linux-gnu",
"aarch64-unknown-linux-musl",
"x86_64-apple-darwin",
"x86_64-unknown-linux-gnu",
"x86_64-unknown-linux-musl",
"x86_64-pc-windows-msvc",
]
# The archive format to use for windows builds (defaults .zip)
windows-archive = ".tar.gz"
# The archive format to use for non-windows builds (defaults .tar.xz)
unix-archive = ".tar.gz"
# Which actions to run on pull requests
pr-run-mode = "skip"
# Path that installers should place binaries in
install-path = "CARGO_HOME"
# Whether to install an updater program
install-updater = true
# Cache intermediate build artifacts to speed up the release pipelines
cache-builds = true
[workspace.metadata.dist.github-custom-runners]
aarch64-unknown-linux-gnu = "ubuntu-24.04-arm"
aarch64-unknown-linux-musl = "ubuntu-24.04-arm"
x86_64-unknown-linux-gnu = "ubuntu-22.04"
x86_64-unknown-linux-musl = "ubuntu-22.04"
x86_64-pc-windows-msvc = "windows-2022"
x86_64-apple-darwin = "macos-15-intel"
aarch64-apple-darwin = "macos-14"
[workspace.metadata.dist.github-action-commits]
"actions/checkout" = "df4cb1c069e1874edd31b4311f1884172cec0e10"
"actions/download-artifact" = "37930b1c2abaa49bbe596cd826c3c89aef350131"
"actions/upload-artifact" = "b7c566a772e6b6bfb58ed0dc250532a479d7789f"
"swatinem/rust-cache" = "e18b497796c12c097a38f9edb9d0641fb99eee32"