Skip to content

refactor(composition): group webui cluster under webui/ (dissection n10) - #5843

Merged
serrrfirat merged 4 commits into
mainfrom
reborn/composition-dissection-webui
Jul 9, 2026
Merged

serrrfirat merged 4 commits into
mainfrom
reborn/composition-dissection-webui

Conversation

@serrrfirat

Copy link
Copy Markdown
Collaborator

What

Dissection step n10 of the composition god-crate refactor (docs/plans/2026-07-02-reborn-internal-module-refactor.md §3): group the 7-module WebUI cluster under a single webui/ internal module. Pure, behavior-preserving move — git mv + import repaths + 1:1 re-pointed crate-root pub use. No public API change.

Off current main (n8 slack + earlier steps already merged).

Files moved → crates/ironclaw_reborn_composition/src/webui/

webui.rs             → webui/facade.rs   (renamed — see below)
webui_body_limit.rs  → webui/webui_body_limit.rs
webui_operator_auth.rs → webui/webui_operator_auth.rs
webui_rate_limit.rs  → webui/webui_rate_limit.rs
webui_route_match.rs → webui/webui_route_match.rs
webui_serve.rs       → webui/webui_serve.rs
webui_ws_origin.rs   → webui/webui_ws_origin.rs

Facade renamed (webui.rs → webui/facade.rs): the old top-level module was itself named webui, so it can't be a submodule of a domain module also called webui (same pattern as n9's automation→facade).

Pure move — the plan's middleware sub-grouping and "pull webui-auth-interaction out" are deferred to a later logic PR.

cfg gates — non-uniform

mod webui; and the facade submodule are ungated (the facade always builds); the other six are #[cfg(feature = "webui-v2-beta")]. The default / --no-default-features builds confirm the six are correctly absent, and the full-feature build confirms they're present — so the gates are hung right.

Public-API preservation

RebornWebuiBundle, build_webui_services (via webui::facade), RateLimitConfigError (via webui::webui_rate_limit), and the full webui_serve item set remain exported — only their internal paths changed. Exported item-set is identical to base (256 == 256).

Verification

  • ✅ cfg-matrix: default · --no-default-features (six modules absent) · full feature set (present)
  • ✅ Consumer: reborn_cli compiles; architecture boundary tests pass (8 + 32, 0 fail; snapshot-surface test green)
  • ✅ Public-surface freeze (independently checked): item-set identical to base, both diff directions empty.
  • ✅ Stale-path sweep empty (one match was a benign intra-doc module link); fmt clean; tree clean.
  • ✅ One non-obvious facade export (build_webui_services_with_connectable_channels, referenced from slack_connectable_channel.rs) caught by the full-feature build and repointed.

Risk

Low — mechanical move (one intra-cluster rename for the name collision), byte-identical public API, full cfg-matrix green. Draft pending human review (SOC 2 — nothing auto-merges).

serrrfirat and others added 2 commits July 8, 2026 19:45
Move the WebUI facade and beta serve/middleware modules under a single
internal `webui/` module. The colliding `webui.rs` facade is renamed to
`webui/facade.rs`; the six `webui_*` middleware/serve files keep their
prefix. Crate-root `pub use` re-exports are repointed 1:1 so the public
API is unchanged (RebornWebuiBundle, build_webui_services now via
webui::facade; RateLimitConfigError via webui::webui_rate_limit; the
webui_serve item set via webui::webui_serve).

Pure move plus repaths — no logic changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… move (dissection n10)

Regenerate docs/plans/composition-pubuse.snapshot for the repointed
webui pub-use paths (item set unchanged) and take the rustfmt reflow of
the longer nearai_login_callback_mount return type in runtime.rs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ironloopai

ironloopai Bot commented Jul 8, 2026 •

Copy link
Copy Markdown
Contributor

🔎 IronLoop Review Status

Head: 3e49b759f44f89f06e3e34446c3862118cb1fe5b
Result: 1/1 reviewers completed without blocking findings.
Next: Ready for normal human review and CI checks.
Updated: 2026-07-09T08:13:09.286Z

Current reviewers:

Reviewer State Verdict Findings Last update
ironloop/common-reviewer (reviewer) Completed Approved 0 blocking findings / 0 notes 2026-07-09T08:13:09.279Z
Reviewer summaries
Reviewer Detail
ironloop/common-reviewer (reviewer) Approved; 0 blocking findings; No concrete actionable issues found. The PR is a scoped module regrouping of the Reborn WebUI composition code, with public re-exports preserved and path references updated.
Recent activity
Time Reviewer State Detail
2026-07-09T08:09:55.259Z ironloop/common-reviewer (reviewer) Queued Accepted review request for head 3e49b75.
2026-07-09T08:09:55.259Z ironloop/common-reviewer (reviewer) Queued Waiting for this reviewer lane to become available.
2026-07-09T08:09:55.263Z ironloop/common-reviewer (reviewer) Queued Added to the local review work handoff.
2026-07-09T08:09:56.306Z ironloop/common-reviewer (reviewer) Started Reviewer worker started attempt 1.
2026-07-09T08:09:59.089Z ironloop/common-reviewer (reviewer) Workspace ready Prepared isolated checkout (merge_ref) at d450ede.
2026-07-09T08:12:39.292Z ironloop/common-reviewer (reviewer) Running Codex is reviewing; process live; elapsed 2m 41s; timeout in 17m 19s; last heartbeat 2026-07-09T08:12:39.292Z. Codex emitted stderr output at 2026-07-09T08:12:27.186Z.
2026-07-09T08:13:09.279Z ironloop/common-reviewer (reviewer) Result captured Approved; 0 blocking findings.
2026-07-09T08:13:09.279Z ironloop/common-reviewer (reviewer) Completed Review completed and terminal status was persisted.
Available commands
  • @ironloopai help
  • @ironloopai agents
  • @ironloopai review
  • @ironloopai review --agent <agent>
  • @ironloopai status
Run metadata

Admission: webhook accepted the request and IronLoop persisted reviewer state before this projection.

@coderabbitai

coderabbitai Bot commented Jul 8, 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: c6f1ed29-0178-4870-833b-3229cc130d96

📥 Commits

Reviewing files that changed from the base of the PR and between a0dafa8 and 3e49b75.

📒 Files selected for processing (20)
  • crates/ironclaw_reborn_composition/CLAUDE.md
  • crates/ironclaw_reborn_composition/src/lib.rs
  • crates/ironclaw_reborn_composition/src/llm_admin/nearai_login_serve.rs
  • crates/ironclaw_reborn_composition/src/llm_admin/openai_compat_serve.rs
  • crates/ironclaw_reborn_composition/src/runtime.rs
  • crates/ironclaw_reborn_composition/src/slack/slack_connectable_channel.rs
  • crates/ironclaw_reborn_composition/src/slack/slack_host_beta.rs
  • crates/ironclaw_reborn_composition/src/slack/slack_serve.rs
  • crates/ironclaw_reborn_composition/src/webui/facade.rs
  • crates/ironclaw_reborn_composition/src/webui/mod.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_body_limit.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_operator_auth.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_rate_limit.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_route_match.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_serve.rs
  • crates/ironclaw_reborn_composition/src/webui/webui_ws_origin.rs
  • docs/plans/composition-pubuse.snapshot
  • docs/reborn/security-parity/01-auth.md
  • docs/reborn/security-parity/02-network-limits.md
  • docs/reborn/security-parity/03-headers-errors.md

📝 Walkthrough

Summary by CodeRabbit

  • Bug Fixes

    • Improved WebUI-related wiring so login, Slack, and LLM flows resolve consistently across the app.
    • Updated several public-facing integrations to use the current WebUI structure, reducing path-related issues.
  • Documentation

    • Refreshed release and security docs to match the latest WebUI layout.
    • Cleaned up test references and formatting for easier navigation.

Walkthrough

WebUI submodules are relocated under a new crate::webui module namespace (via webui/mod.rs), with RebornWebuiBundle/build_webui_services re-exported from webui::facade. All call sites across llm_admin, runtime, slack modules, and documentation are updated to the new crate::webui::* import paths accordingly.

Changes

WebUI module path relocation

Layer / File(s) Summary
Module declarations and re-exports
crates/ironclaw_reborn_composition/src/webui/mod.rs, crates/ironclaw_reborn_composition/src/lib.rs
mod.rs declares facade and feature-gated webui_* internal submodules; lib.rs drops old top-level module declarations and re-exports RebornWebuiBundle/build_webui_services from webui::facade.
Internal module import updates
crates/ironclaw_reborn_composition/src/webui/webui_serve.rs, .../webui_body_limit.rs, .../webui_operator_auth.rs, .../webui_rate_limit.rs, .../webui_ws_origin.rs, .../facade.rs
Imports and docs updated to reference crate::webui::facade, crate::webui::webui_route_match, and crate::webui::webui_rate_limit; WebuiServeError::RateLimit's #[from] source type path is updated.
Downstream crate call sites
crates/ironclaw_reborn_composition/src/llm_admin/nearai_login_serve.rs, .../openai_compat_serve.rs, .../runtime.rs, .../slack/slack_connectable_channel.rs, .../slack/slack_host_beta.rs, .../slack/slack_serve.rs
Import paths for PublicRouteMount, ProtectedRouteMount, PublicRouteDrain, build_llm_config_service, build_webui_services, and build_webui_services_with_connectable_channels updated to crate::webui::* paths; nearai_login_callback_mount return type updated accordingly.
Documentation path updates
crates/ironclaw_reborn_composition/CLAUDE.md, docs/plans/composition-pubuse.snapshot, docs/reborn/security-parity/*.md
Documented file paths and re-export sources updated to match the new webui::* module layout.

Estimated code review effort: 2 (Simple) | ~15 minutes

Suggested reviewers: ilblackdragon

Review note: mechanical path rename (webui_* → crate::webui::webui_*), no logic change; verify webui/mod.rs gates match old lib.rs cfg(feature = "webui-v2-beta") exactly — a mismatched gate here is the one way this silently breaks non-default builds. WebuiServeError::RateLimit #[from] source type change (range_351954e5f0d7) needs a check that no external caller matches on the old path.

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is relevant and detailed, but it does not follow the required template headings and omits several mandatory sections. Rewrite it to match the template: add Summary, Change Type, Linked Issue, Validation, Security Impact, Trust-Boundary Checklist, Database Impact, Blast Radius, Rollback Plan, Review Follow-Through, and Review track.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is conventional-commit style and accurately describes the WebUI composition refactor.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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-5843 July 8, 2026 16:50 Destroyed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request restructures the WebUI-related modules in the ironclaw_reborn_composition crate by grouping several individual webui_ submodules (such as webui_body_limit, webui_operator_auth, webui_rate_limit, webui_route_match, webui_serve, and webui_ws_origin) and the facade module under a single unified webui module. All internal references, imports, and documentation links across the codebase have been updated to reflect this new module hierarchy, while the crate's root re-exports are adjusted to keep the public API unchanged. There are no review comments, so I have no feedback to provide.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@github-actions github-actions Bot added size: M 50-199 changed lines scope: docs Documentation risk: low Changes to docs, tests, or low-risk modules contributor: core 20+ merged PRs labels Jul 8, 2026

@ironloopai ironloopai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ IronLoop Review: reviewer

Review at a glance

Verdict Blocking Notes Inline Head
✅ Approved 0 1 1 0101911d7c20

Head: 0101911d7c207bf7d46eea1dc91aa25ffd8f8f79
Next: No reviewer action needed.

Run details

Status: Current
Needs human: no
Needs validation: no

Summary

No blocking issues found in the WebUI module regrouping. The public re-exports appear preserved, but a few navigation/security docs still reference the old file paths.

Findings

Blocking: 0 / Notes: 1

Non-blocking notes (1)
1. 💬 [LOW] Update docs that still point at the old WebUI file paths

Location: crates/ironclaw_reborn_composition/CLAUDE.md:69
The WebUI files were moved under src/webui/, but the crate guide and security parity docs still point to deleted top-level files such as src/webui.rs, src/webui_serve.rs, and src/webui_rate_limit.rs (crates/ironclaw_reborn_composition/CLAUDE.md plus docs/reborn/security-parity/{01-auth,02-network-limits,03-headers-errors}.md). Update these references to the new paths like src/webui/facade.rs, src/webui/webui_serve.rs, and src/webui/webui_rate_limit.rs so the repo guidance does not lead readers to missing files.

Developer follow-up

After fixing this feedback:

  1. Push the fix to this PR branch.
  2. Re-run this reviewer with @ironloopai review --agent reviewer if you only changed this reviewer's findings.
  3. Re-run all reviewers with @ironloopai review when the fix may affect multiple areas.
  4. Use @ironloopai status to check queued/running/completed/stale/stalled state while reviewers run.
Inline review fallback

Inline comment projection fell back to a body-only PR Review because GitHub rejected the inline payload.
Reason: Unprocessable Entity: "Path could not be resolved" - https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request

IronLoop preserved the inline review comment payloads below instead of dropping them.

Inline fallback 1: crates/ironclaw_reborn_composition/CLAUDE.md:69

IronLoop reviewer: [LOW] Update docs that still point at the old WebUI file paths

The WebUI files were moved under src/webui/, but the crate guide and security parity docs still point to deleted top-level files such as src/webui.rs, src/webui_serve.rs, and src/webui_rate_limit.rs (crates/ironclaw_reborn_composition/CLAUDE.md plus docs/reborn/security-parity/{01-auth,02-network-limits,03-headers-errors}.md). Update these references to the new paths like src/webui/facade.rs, src/webui/webui_serve.rs, and src/webui/webui_rate_limit.rs so the repo guidance does not lead readers to missing files.

Developer follow-up

After fixing this feedback:

  1. Push the fix to this PR branch.
  2. Re-run this reviewer with @ironloopai review --agent reviewer if you only changed this reviewer's findings.
  3. Re-run all reviewers with @ironloopai review when the fix may affect multiple areas.
  4. Use @ironloopai status to check queued/running/completed/stale/stalled state while reviewers run.

@github-actions

github-actions Bot commented Jul 8, 2026 •

Copy link
Copy Markdown
Contributor

Coverage ratchet

Ratchet mode: ENFORCING

RATCHET PASS: global
  observed: 85.15% (282834 / 332168 lines)
  floor:    85.3% (tolerance 0.5pp -> effective floor 84.8%)
  denominator: 332168 lines now vs 320188 at floor capture (+11980 lines, +3.74%) — not a material change

⚠️ 3 Reborn crate(s) have 0 int-tier coverage (target: 0) — ironclaw_prompt_envelope, ironclaw_scripts, ironclaw_skill_learning

Reborn integration-tier coverage

Line coverage (Reborn crates): 85.15% — 282834 / 332168 lines

Per-crate breakdown (65 crates, lowest-covered first)
Crate Line % Covered / Total
ironclaw_prompt_envelope 0% 0 / 88
ironclaw_scripts 0% 0 / 347
ironclaw_skill_learning 0% 0 / 61
ironclaw_wasm_sandbox_core 7.37% 7 / 95
ironclaw_runtime_policy 33.2% 80 / 241
ironclaw_event_projections 43.34% 673 / 1553
ironclaw_run_state 52.36% 222 / 424
ironclaw_authorization 53.54% 461 / 861
ironclaw_triggers 59.79% 1740 / 2910
ironclaw_observability 61.54% 16 / 26
ironclaw_reborn_cli 62.84% 3816 / 6073
ironclaw_webui_v2 62.94% 2565 / 4075
ironclaw_mcp 63.15% 581 / 920
ironclaw_reborn_migration 67.01% 1172 / 1749
ironclaw_memory 67.12% 747 / 1113
ironclaw_dispatcher 67.15% 92 / 137
ironclaw_filesystem 67.44% 3815 / 5657
ironclaw_trust 72.88% 661 / 907
ironclaw_capabilities 74.08% 1658 / 2238
ironclaw_wasm_limiter 74.6% 47 / 63
ironclaw_reborn_event_store 74.61% 958 / 1284
ironclaw_extractors 74.72% 538 / 720
ironclaw_first_party_extensions 77.62% 5411 / 6971
ironclaw_llm 77.88% 19480 / 25013
ironclaw_product_context 78.57% 11 / 14
ironclaw_wasm_product_adapters 80.58% 1510 / 1874
ironclaw_process_sandbox 80.65% 671 / 832
ironclaw_reborn_openai_compat 80.95% 956 / 1181
ironclaw_memory_native 81.86% 3226 / 3941
ironclaw_wasm 82.54% 950 / 1151
ironclaw_secrets 82.7% 2791 / 3375
ironclaw_events 83.47% 1762 / 2111
ironclaw_processes 84.06% 965 / 1148
ironclaw_turns 84.24% 13099 / 15549
ironclaw_host_api 85.17% 2549 / 2993
ironclaw_product_workflow 85.71% 10748 / 12540
ironclaw_projects 85.92% 659 / 767
ironclaw_network 86.12% 670 / 778
ironclaw_common 86.46% 1514 / 1751
ironclaw_threads 86.62% 4132 / 4770
ironclaw_slack_v2_adapter 86.79% 1806 / 2081
ironclaw_auth 86.94% 2995 / 3445
ironclaw_reborn_config 86.98% 1730 / 1989
ironclaw_reborn_identity 87.03% 557 / 640
ironclaw_product_adapters 87.29% 3207 / 3674
ironclaw_skills 87.35% 4336 / 4964
ironclaw_hooks 87.84% 9916 / 11289
ironclaw_product_adapter_registry 87.96% 526 / 598
ironclaw_reborn_traces 88.21% 11931 / 13526
ironclaw_extensions 88.26% 2631 / 2981
ironclaw_reborn_composition 88.78% 69825 / 78647
ironclaw_host_runtime 88.95% 17523 / 19700
ironclaw_reborn 89.14% 15703 / 17616
ironclaw_conversations 90% 2924 / 3249
ironclaw_approvals 90.51% 1507 / 1665
ironclaw_event_streams 91.48% 1009 / 1103
ironclaw_loop_support 92.46% 14725 / 15926
ironclaw_attachments 93.06% 630 / 677
ironclaw_resources 93.09% 4637 / 4981
ironclaw_reborn_webui_ingress 93.19% 2217 / 2379
ironclaw_telegram_v2_adapter 93.87% 2452 / 2612
ironclaw_agent_loop 94.58% 8776 / 9279
ironclaw_safety 94.8% 3668 / 3869
ironclaw_first_party_extension_ports 95% 3094 / 3257
ironclaw_outbound 95.59% 3556 / 3720

This table itself is informational and never gates the PR on its own — not the percentage, not the per-crate holes, not the 0-coverage callout. A separate coverage ratchet (dry-run until enforce=true; see tests/integration/coverage-floor.toml) can fail the build on specific configured floors.

Exemptions (4 entry/entries excluded from the accounting above)
Module / Crate Reason Issue
crate: ironclaw_embeddings v1-only: consumed only by root ironclaw (src/app.rs, src/tools/builtin/memory.rs, src/workspace/mod.rs, src/config/{mod,embeddings}.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_gateway v1-only: consumed only by root ironclaw (src/channels/web/platform/static_files.rs, src/channels/web/handlers/frontend.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_oauth v1-only: consumed only by root ironclaw (src/auth/oauth.rs); no crates/* dependents. Crate's own doc comment confirms v1-only. Covered by "Tests (Legacy)". #5657
crate: ironclaw_tui v1-only: consumed only by root ironclaw (src/main.rs, src/channels/tui.rs); no crates/* dependents. Crate's own doc comment confirms it bridges INTO v1, not Reborn. Covered by "Tests (Legacy)". #5657

@railway-app

railway-app Bot commented Jul 8, 2026 •

Copy link
Copy Markdown

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

Service Status Web Updated (UTC)
ironclaw ✅ Success (View Logs) Web Jul 9, 2026 at 8:16 am

…(dissection n10)

Addresses IronLoop review note on #5843 — CLAUDE.md + security-parity docs
pointed at deleted top-level src/webui*.rs files.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5843 July 8, 2026 20:40 Destroyed
@serrrfirat

Copy link
Copy Markdown
Collaborator Author

Addressed the IronLoop doc note in 82829fe: updated the stale WebUI path references in crates/ironclaw_reborn_composition/CLAUDE.md and docs/reborn/security-parity/{01-auth,02-network-limits,03-headers-errors}.md to the new src/webui/facade.rs, src/webui/webui_serve.rs, src/webui/webui_rate_limit.rs, etc. paths. Pure-move code was already approved; this closes the only outstanding (non-blocking) note.

🤖 Addressed by Claude Code

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-5843 July 9, 2026 08:08 Destroyed
@serrrfirat
serrrfirat marked this pull request as ready for review July 9, 2026 08:09

@ironloopai ironloopai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ IronLoop Review: reviewer

Review at a glance

Verdict Blocking Notes Inline Head
✅ Approved 0 0 0 3e49b759f44f

Head: 3e49b759f44f89f06e3e34446c3862118cb1fe5b
Next: No reviewer action needed.

Run details

Status: Current
Needs human: no
Needs validation: no

Summary

No concrete actionable issues found. The PR is a scoped module regrouping of the Reborn WebUI composition code, with public re-exports preserved and path references updated.

Findings

None.

Developer follow-up

After fixing this feedback:

  1. Push the fix to this PR branch.
  2. Re-run this reviewer with @ironloopai review --agent reviewer if you only changed this reviewer's findings.
  3. Re-run all reviewers with @ironloopai review when the fix may affect multiple areas.
  4. Use @ironloopai status to check queued/running/completed/failed/superseded state while reviewers run.

@serrrfirat
serrrfirat merged commit 47bf6ce into main Jul 9, 2026
62 checks passed
@serrrfirat
serrrfirat deleted the reborn/composition-dissection-webui branch July 9, 2026 09:13

This branch was successfully deployed

No deployments
ironclaw-ci-preview / ironclaw-pr-5843 — 3e49b759 Deployed Jul 9, 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: M 50-199 changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant