Skip to content

feat(inspector): add bounded tool execution details - #7279

Merged
think-in-universe merged 60 commits into
mainfrom
issue-7225-bounded-tool-details
Aug 8, 2026
Merged

think-in-universe merged 60 commits into
mainfrom
issue-7225-bounded-tool-details

Conversation

@italic-jinxin

Copy link
Copy Markdown
Contributor

Summary

  • Adds operator-only tool execution details with exact tenant, user, thread, run, and invocation scoping.
  • Captures safe tool arguments and results using stable invocation IDs, including concurrent invocations of the same capability.
  • Sanitizes and secret-scans diagnostic content before retention, with a hard 50 KiB result limit and explicit original-size/truncation metadata.
  • Keeps verbose arguments and results out of the normal activity stream; full content is available only through the dedicated detail lookup.
  • Adds loading, unavailable, failed, and truncated frontend states plus backend, frontend, and browser coverage.

Linked Issue

Closes #7225

Depends on #7224

Part of #7218

Validation

  • cargo fmt --all -- --check
  • Relevant clippy checks pass with warnings denied
  • Product contract and assistant Inspector tests pass
  • WebUI Inspector route contracts pass
  • Frontend typecheck and Inspector tests pass
  • Browser E2E verifies real tool execution and the 50 KiB bound
  • Full review completed and findings fixed

Test Strategy

User behavior:

  • Operators can inspect sanitized tool arguments and results without exposing them through the normal live activity stream.
  • Oversized output is visibly marked as truncated and cannot exceed the retained byte limit.
  • Concurrent same-name tool calls remain independently addressable.

Risk areas:

  • Browser
  • Side effect
  • Security or permissions
  • Cross-component behavior

Tests added or updated:

  • Unit or contract: serialization bounds, original-size validation, redaction, stable IDs, and scoped lookup.
  • Reborn integration: capability execution is captured after durable result persistence.
  • Recorded fixture: Not applicable; provider request behavior is unchanged.
  • Browser E2E: real tool invocation, details rendering, and 50 KiB truncation.
  • Backend or runtime: lifecycle capture and bounded pending-input retention.
  • Live canary: Not applicable; no external provider behavior changed.

What the tests prove:

  • Arguments and results never ride the normal diagnostic update stream.
  • Retained results cannot under-report their source length or exceed 50 KiB.
  • Tool details remain isolated by authenticated scope and exact invocation ID.
  • Diagnostic capture failure cannot change tool execution success or failure.

Security Impact

Limited but security-sensitive. Tool arguments and results are sanitized and secret-scanned before bounded process-local retention. Detailed content requires operator access and an exact authenticated scope.

Database Impact

None. Tool diagnostics remain bounded and process-local.

Blast Radius

Limited to capability diagnostic capture, the Inspector store, operator-only WebUI routes, and Inspector presentation.

Rollback Plan

Revert this PR to remove verbose tool details while retaining the activity timeline and existing prompt/statistics views.

Review Follow-Through

Risk level: Medium. Review should focus on redaction boundaries, source-size validation, exact invocation scoping, and ensuring capture remains best-effort.


Review track: C

@italic-jinxin italic-jinxin added size: XL 500+ changed lines risk: medium Business logic, config, or moderate-risk modules contributor: core 20+ merged PRs labels Aug 6, 2026
@railway-app

railway-app Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the ironclaw-pr-7279 environment in ironclaw-ci-preview

Service Status Web Updated (UTC)
ironclaw ✅ Success (View Logs) Web Aug 8, 2026 at 5:33 am

@coderabbitai

coderabbitai Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 02e4c488-8f55-434c-982d-9c9729c74ddf

📥 Commits

Reviewing files that changed from the base of the PR and between dd2b711 and e7a1105.

📒 Files selected for processing (2)
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added detailed tool activity inspection in the WebUI, including inputs, outputs, status, failures, duration, and truncation metadata.
    • Added lazy loading, cancellation, and retry support when viewing expanded tool details.
    • Added bounded diagnostic capture with sensitive-data redaction and UTF-8-safe truncation.
  • Bug Fixes
    • Improved correlation and handling of tool failures and incomplete results.
  • Tests
    • Expanded coverage for tool diagnostics, redaction, truncation, and inspector interactions.

Walkthrough

The PR adds bounded, redacted tool diagnostics across runtime capability execution, Inspector storage, and the WebUI. Tool lifecycle events are correlated by identifiers, persisted in diagnostic storage, fetched through a scoped API, and displayed on demand.

Changes

Tool diagnostic inspection

Layer / File(s) Summary
Diagnostic contracts and buffered emission
crates/contracts/..., crates/loop/ironclaw_loop_host/...
Defines bounded tool-result metadata, buffered lifecycle events, failure categories, redacted debug output, and UTF-8-safe capture.
Correlated Inspector storage
crates/product/ironclaw_assistant/src/inspector_store.rs
Stores pending inputs, correlates starts and results, applies sanitization and bounds, and records tool activity.
Runtime capability wiring and validation
crates/app/ironclaw_composition/src/runtime/...
Creates and passes the diagnostic sink through capability wiring. Staged capability I/O records tool inputs, starts, results, and failures. Tests cover bounded captures and updated constructors.
Lazy tool detail inspection
crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/..., tests/e2e/...
Adds scoped tool-detail fetching, expandable Activity entries, frontend coverage, and Playwright validation.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested reviewers: think-in-universe

Sequence Diagram(s)

sequenceDiagram
  participant ToolExecution
  participant DiagnosticEmitter
  participant InspectorStore
  participant InspectorAPI
  participant InspectorPanel
  ToolExecution->>DiagnosticEmitter: record input, start, and result
  DiagnosticEmitter->>InspectorStore: forward bounded diagnostic events
  InspectorStore->>InspectorAPI: expose scoped tool details
  InspectorPanel->>InspectorAPI: fetch details on expansion
  InspectorAPI-->>InspectorPanel: return bounded tool metadata
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the implementation and validation, but it omits the required Change Type and Reborn Trust-Boundary Checklist sections. Add the Change Type section and complete the Reborn Trust-Boundary Checklist for this security-sensitive Track C change.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title uses Conventional Commits style and accurately describes the bounded tool execution details added to the Inspector.
Linked Issues check ✅ Passed The changes implement bounded, sanitized, scoped tool details, dedicated lookup, UI states, and the testing coverage required by issue [#7225].
Out of Scope Changes check ✅ Passed The code, tests, documentation, and production wiring changes support the linked issue objectives without unrelated scope.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 7, 2026 14:39 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 7, 2026 15:09 Destroyed
…to issue-7225-bounded-tool-details

# Conflicts:
#	crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
#	crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 7, 2026 15:13 Destroyed
@italic-jinxin
italic-jinxin changed the base branch from issue-7224-activity-timeline to main August 7, 2026 15:43
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 8, 2026 04:35 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 8, 2026 04:45 Destroyed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/app/ironclaw_composition/src/runtime/capability_host.rs`:
- Around line 926-933: Add the trait-required record_running_invocation method
to the UnavailableCapabilityIo implementation, matching the signature used by
LoopCapabilityResultWriter and leaving it as a no-op. Preserve the existing
write_capability_result behavior and update only this production implementation
to satisfy the expanded trait surface.

In `@crates/product/ironclaw_assistant/src/inspector_store.rs`:
- Around line 1348-1367: Propagate the tool start timestamp from
HostManagedToolStartedDiagnosticCapture through PendingToolInput and the Started
record, then update the terminal ToolExecutionDiagnostic construction to compute
duration_ms from that timestamp and the current completion time. Ensure
DiagnosticUpdateKind::ToolExecutionUpdated receives the calculated duration for
completed tool executions instead of None.
- Around line 930-942: Update record_prompt and record_model_call to obtain
their DiagnosticScope exclusively through diagnostic_scope_for_context instead
of duplicating actor/explicit-owner derivation. At each call site, preserve the
existing per-sink debug messages by checking the returned Option before
recording; leave diagnostic_scope_for_context as the single source of tenant,
user, thread, and run identity.

In
`@crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx`:
- Around line 200-244: Update the Inspector tool-detail assertions to verify
sanitized tool arguments are rendered: in
crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
lines 200-244, assert that arguments.content '{"path":"safe.txt"}' appears in
detail.textContent, or remove the mock field if arguments are intentionally
omitted; in tests/e2e/scenarios/test_reborn_webui_v2_tool_gates.py lines
322-373, add a detail assertion for the echoed tool arguments alongside the
existing capability, status, and truncation checks.

In
`@crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx`:
- Around line 346-360: Remove the duplicate ToolDetailText interface and reuse
the existing BoundedDiagnosticText type for all corresponding fields in
ToolDetail and ToolDetailBlock, preserving the current wire shape and behavior.
- Around line 375-389: Replace the fetch logic in load with a React.useEffect
keyed by open, threadId, runId, and activityId so it creates an AbortController,
aborts it during cleanup, and ignores aborted requests. Reset unavailable when
opening and allow each reopen to retry regardless of its prior value; update the
button handler to use toggle as proposed, while preserving the existing loading,
tool, and unavailable state updates for active requests.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4aad9239-b2d3-4327-9718-d29275cbc645

📥 Commits

Reviewing files that changed from the base of the PR and between cae1a04 and 753358c.

📒 Files selected for processing (13)
  • crates/app/ironclaw_composition/src/runtime.rs
  • crates/app/ironclaw_composition/src/runtime/capability_host.rs
  • crates/app/ironclaw_composition/src/runtime/capability_host/tests.rs
  • crates/app/ironclaw_composition/src/runtime/capability_host/tests/tests/display_preview.rs
  • crates/contracts/ironclaw_product_contracts/src/inspector.rs
  • crates/loop/ironclaw_loop_host/src/lib.rs
  • crates/loop/ironclaw_loop_host/src/tool_diagnostics.rs
  • crates/product/ironclaw_assistant/src/inspector_store.rs
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-api.ts
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx
  • tests/CLAUDE.md
  • tests/e2e/scenarios/test_reborn_webui_v2_tool_gates.py

Comment thread crates/app/ironclaw_composition/src/runtime/capability_host.rs
Comment thread crates/product/ironclaw_assistant/src/inspector_store.rs
Comment thread crates/product/ironclaw_assistant/src/inspector_store.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx`:
- Around line 395-399: Validate and decode the unknown result from
fetchInspectorTool before updating state in the request callback. Replace the
broad response cast around setTool with the existing ToolDetail
validation/decoding mechanism, and treat malformed payloads as unavailable or
failed detail data so Inspector rendering never receives an object missing
required fields such as capability_name.content.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 92f7971f-350a-46e5-acb8-c63ce8c6fa75

📥 Commits

Reviewing files that changed from the base of the PR and between 753358c and 8dea39a.

📒 Files selected for processing (2)
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 8, 2026 05:19 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-7279 August 8, 2026 05:25 Destroyed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx (1)

390-399: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Response is still cast without validation.

(response as { tool?: ToolDetail | null })?.tool accepts any object shape. A malformed successful response reaches tool.capability_name.content at Line 424 with no guard. Since InspectorErrorBoundary wraps the whole panel (Line 793), this crash disables the entire Inspector, not just one row.

Decode the response into ToolDetail before setTool, and treat an invalid payload as unavailable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx`
around lines 390 - 399, Validate and decode the successful response in the
inspector request’s .then handler before calling setTool, rather than using the
unchecked response cast. Ensure malformed payloads are treated as unavailable by
setting the tool state to null and setUnavailable(true), while preserving the
existing controller and abort checks and valid ToolDetail behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/loop/ironclaw_loop_host/src/tool_diagnostics.rs`:
- Around line 41-69: Update record_started_at and take_duration_ms_at to log
poisoned mutex errors with tracing::debug!, including the lock error and clear
timing-diagnostics context, before returning. Replace the silent let-else and
.ok()? handling while preserving their existing fallback behavior and duration
calculation.

---

Duplicate comments:
In
`@crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx`:
- Around line 390-399: Validate and decode the successful response in the
inspector request’s .then handler before calling setTool, rather than using the
unchecked response cast. Ensure malformed payloads are treated as unavailable by
setting the tool state to null and setUnavailable(true), while preserving the
existing controller and abort checks and valid ToolDetail behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4bb73d15-f1cf-4228-9bb1-8404680d8a1f

📥 Commits

Reviewing files that changed from the base of the PR and between 8dea39a and dd2b711.

📒 Files selected for processing (8)
  • crates/app/ironclaw_composition/src/runtime/capability_host/tests.rs
  • crates/app/ironclaw_composition/src/runtime/production.rs
  • crates/loop/ironclaw_loop_host/src/lib.rs
  • crates/loop/ironclaw_loop_host/src/tool_diagnostics.rs
  • crates/product/ironclaw_assistant/src/inspector_store.rs
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.test.tsx
  • crates/product/ironclaw_webui/frontend/src/pages/chat/inspector/inspector-panel.tsx
  • tests/e2e/scenarios/test_reborn_webui_v2_tool_gates.py

Comment thread crates/loop/ironclaw_loop_host/src/tool_diagnostics.rs
@think-in-universe
think-in-universe added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 92a2549 Aug 8, 2026
45 checks passed
@think-in-universe
think-in-universe deleted the issue-7225-bounded-tool-details branch August 8, 2026 06:20
Kampouse pushed a commit to Kampouse/ironclaw that referenced this pull request Aug 13, 2026
* feat(inspector): add operator inspection API

* docs(inspector): assign product service ownership

* test(inspector): ratchet diagnostic contracts

* feat(inspector): add debug panel shell

* test(inspector): cover debug panel shell e2e

* fix(inspector): stop diagnostics when panel closes

* feat(inspector): add prompt inspection

* fix(inspector): follow current webui ownership

* feat(inspector): add model call statistics

* test(inspector): cover model statistics e2e

* fix(inspector): avoid uncollected tool metrics

* test(inspector): cover prompt diagnostics e2e

* test(inspector): align statistics e2e scope

* fix(inspector): redact prompt metadata

* fix(inspector): preserve per-call model identity

* fix(inspector): classify prompt instruction sources

* test(inspector): assert reported token usage

* feat(inspector): add activity timeline and turn navigation

* test(inspector): cover activity timeline in browser

* fix(inspector): read current run before publishing activity

* feat(inspector): add bounded tool execution details

* test(inspector): cover bounded tool details in browser

* fix(inspector): validate retained tool result sizes

* fix(inspector): address review feedback

* fix(inspector): retry transient snapshot failures

* fix(inspector): address prompt diagnostic review findings

* fix(inspector): follow debug query navigation

* fix(inspector): preserve stream terminal state

* fix(inspector): capture full capability surface

* fix(inspector): scope projection activity to its run

* fix(inspector): harden activity diagnostics

* fix(inspector): bound tool result diagnostic capture

* fix(inspector): harden tool diagnostic pipeline

* fix(inspector): address prompt diagnostic review feedback

* fix inspector model call stats review findings

* fix inspector refresh and truncation regressions

* fix(inspector): address activity timeline review feedback

* fix(inspector): harden activity lifecycle handling

* fix(composition): move tool diagnostics to loop host

* fix(inspector): cancel stale tool detail requests

* fix(inspector): address bounded tool detail review

* fix(inspector): validate tool detail responses
Kampouse pushed a commit to Kampouse/ironclaw that referenced this pull request Aug 13, 2026
* feat(inspector): add operator inspection API

* docs(inspector): assign product service ownership

* test(inspector): ratchet diagnostic contracts

* feat(inspector): add debug panel shell

* test(inspector): cover debug panel shell e2e

* fix(inspector): stop diagnostics when panel closes

* feat(inspector): add prompt inspection

* fix(inspector): follow current webui ownership

* feat(inspector): add model call statistics

* test(inspector): cover model statistics e2e

* fix(inspector): avoid uncollected tool metrics

* test(inspector): cover prompt diagnostics e2e

* test(inspector): align statistics e2e scope

* fix(inspector): redact prompt metadata

* fix(inspector): preserve per-call model identity

* fix(inspector): classify prompt instruction sources

* test(inspector): assert reported token usage

* feat(inspector): add activity timeline and turn navigation

* test(inspector): cover activity timeline in browser

* fix(inspector): read current run before publishing activity

* feat(inspector): add bounded tool execution details

* test(inspector): cover bounded tool details in browser

* fix(inspector): validate retained tool result sizes

* fix(inspector): address review feedback

* fix(inspector): retry transient snapshot failures

* fix(inspector): address prompt diagnostic review findings

* fix(inspector): follow debug query navigation

* fix(inspector): preserve stream terminal state

* fix(inspector): capture full capability surface

* fix(inspector): scope projection activity to its run

* fix(inspector): harden activity diagnostics

* fix(inspector): bound tool result diagnostic capture

* fix(inspector): harden tool diagnostic pipeline

* fix(inspector): address prompt diagnostic review feedback

* fix inspector model call stats review findings

* fix inspector refresh and truncation regressions

* fix(inspector): address activity timeline review feedback

* fix(inspector): harden activity lifecycle handling

* fix(composition): move tool diagnostics to loop host

* fix(inspector): cancel stale tool detail requests

* fix(inspector): address bounded tool detail review

* fix(inspector): validate tool detail responses
l3ocifer pushed a commit to l3ocifer/frick-ironclaw that referenced this pull request Sep 3, 2026
* feat(inspector): add operator inspection API

* docs(inspector): assign product service ownership

* test(inspector): ratchet diagnostic contracts

* feat(inspector): add debug panel shell

* test(inspector): cover debug panel shell e2e

* fix(inspector): stop diagnostics when panel closes

* feat(inspector): add prompt inspection

* fix(inspector): follow current webui ownership

* feat(inspector): add model call statistics

* test(inspector): cover model statistics e2e

* fix(inspector): avoid uncollected tool metrics

* test(inspector): cover prompt diagnostics e2e

* test(inspector): align statistics e2e scope

* fix(inspector): redact prompt metadata

* fix(inspector): preserve per-call model identity

* fix(inspector): classify prompt instruction sources

* test(inspector): assert reported token usage

* feat(inspector): add activity timeline and turn navigation

* test(inspector): cover activity timeline in browser

* fix(inspector): read current run before publishing activity

* feat(inspector): add bounded tool execution details

* test(inspector): cover bounded tool details in browser

* fix(inspector): validate retained tool result sizes

* fix(inspector): address review feedback

* fix(inspector): retry transient snapshot failures

* fix(inspector): address prompt diagnostic review findings

* fix(inspector): follow debug query navigation

* fix(inspector): preserve stream terminal state

* fix(inspector): capture full capability surface

* fix(inspector): scope projection activity to its run

* fix(inspector): harden activity diagnostics

* fix(inspector): bound tool result diagnostic capture

* fix(inspector): harden tool diagnostic pipeline

* fix(inspector): address prompt diagnostic review feedback

* fix inspector model call stats review findings

* fix inspector refresh and truncation regressions

* fix(inspector): address activity timeline review feedback

* fix(inspector): harden activity lifecycle handling

* fix(composition): move tool diagnostics to loop host

* fix(inspector): cancel stale tool detail requests

* fix(inspector): address bounded tool detail review

* fix(inspector): validate tool detail responses

This branch was successfully deployed

No deployments
ironclaw-ci-preview / ironclaw-pr-7279 — e7a11052 Deployed Aug 8, 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: low Changes to docs, tests, or low-risk modules scope: docs Documentation size: XL 500+ changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Inspector] Add bounded verbose tool details

2 participants