Skip to content

refactor: move app and gem into apps/ruby2html (house layout) - #19

Open
developerz-ai[bot] wants to merge 7 commits into
mainfrom
dz/move-the-application-into-apps-ruby2html-house--697d5867
Open

developerz-ai[bot] wants to merge 7 commits into
mainfrom
dz/move-the-application-into-apps-ruby2html-house--697d5867

Conversation

@developerz-ai

@developerz-ai developerz-ai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

What

Move the 22 house-layout items (app, config, db, ext, lib, spec, bench, gemfiles, public, log, storage, vendor, Gemfile+lock, Rakefile, config.ru, ruby2html.gemspec, llms.txt, .rspec, .rubocop.yml, .ruby-version) under apps/ruby2html/, file by file. The root keeps the boundary: bin/, .github/, .dz/, .claude/, docs/, .devcontainer/, .gitignore, .dockerignore, .gitattributes, lefthook.yml, mise.toml, tmp/.

Root Gemfile becomes a workspace stub eval_gemfile'ing apps/ruby2html/Gemfile; bundler always runs from the app dir (bin/check, bin/setup, lefthook root:, CI working-directory, dependabot /apps/ruby2html). Boundary references updated: bin/ scripts, CI workflows, dependabot, .dz policies and briefs, .claude skills/agents, AGENTS.md and docs.

Packaging copies of README.md/LICENSE/CHANGELOG.md added beside the gemspec: bin/gem-smoke:43 requires them inside the built gem, which the gemspec selects via File.file? next to itself. .gitignore gains apps/ruby2html re-anchors; no existing rule removed; root .dockerignore untouched (devcontainer builds use root context).

Acceptance

  • Every moved file lives under apps/ruby2html/ with the old root file gone (identical-content create + delete, so git records renames); bin/, .github/, .dz/, .claude/, .devcontainer/, docs/, tmp/ stay at root
  • Root Gemfile is a workspace stub whose eval_gemfile names apps/ruby2html/Gemfile; apps/ruby2html/Gemfile holds the original 51 lines verbatim; no root lockfile created
  • ./bin/check exits 0: cd apps/ruby2html; bundle exec rake compile; ../../bin/rubocop --parallel . ../../bin; CI=1 bundle exec rspec; ../../bin/brakeman --no-pager
  • bin/{rails,rake,bundle,rubocop,console} resolve ../apps/ruby2html/{config,Gemfile,lib/gem,.rubocop.yml}; bin/{build-ext,gem-smoke,bench-report} anchor ROOT at apps/ruby2html
  • bin/setup keeps mise at repo root, bundles inside apps/ruby2html, and spec/bin/setup_spec.rb (pointing at ../../../bin/setup) still passes
  • .gitignore: every original rule retained verbatim, with a new /apps/ruby2html/... block appended (.bundle, .env*, log, tmp, storage, public/assets, config keys, pkg, ext build artifacts, coverage, gemfiles locks)
  • Root .dockerignore untouched byte-for-byte; apps/ruby2html/.dockerignore is its byte-identical copy
  • apps/ruby2html/{README.md,LICENSE,CHANGELOG.md} are byte-identical copies of the root originals; ruby2html.gemspec differs from the original only by the packaging-copies comment
  • spec/bin/setup_spec.rb references ../../../bin/setup; every other moved file byte-identical (escape surfaces ext/*, pure_ruby.rb, Java escaper untouched)
  • .github/workflows/{ci,release,canary,benchmark}.yml use working-directory apps/ruby2html, ruby-version apps/ruby2html/.ruby-version, BUNDLE_GEMFILE .../apps/ruby2html/gemfiles/, and ../../bin/ for root scripts
  • dependabot bundler directory is /apps/ruby2html; lefthook.yml commands run with root: apps/ruby2html/
  • AGENTS.md, README.md, CONTRIBUTING.md, SECURITY.md, docs/, .dz/ and .claude/* reference apps/ruby2html paths for moved trees, and no path outside the group was moved

Changes

  • apps/ruby2html/lib/assets/.keep (create) — Create with the exact bytes of old root path lib/assets/.keep (house-layout move; no content change).
  • apps/ruby2html/lib/tasks/.keep (create) — Create with the exact bytes of old root path lib/tasks/.keep (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html.rb. Its require_relative/version lines and dir-based autoloads (lines 6-28) are self-relative — no content change.
  • apps/ruby2html/lib/gem/ruby2html/version.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/version.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/render.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/render.rb. Line 20 require_relative '../../ruby2html/ruby2html' stays correct (lib/ruby2html/ moves alongside) — no content change.
  • apps/ruby2html/lib/gem/ruby2html/render/pure_ruby.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/render/pure_ruby.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/component.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/component.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/component_helper.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/component_helper.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_helper.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_helper.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/html_beautifier_middleware.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/html_beautifier_middleware.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/railtie.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/railtie.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/base_component.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/base_component.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/button_to.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/button_to.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/form_with.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/form_with.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/image_tag.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/image_tag.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/link_to.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/link_to.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/output_capture.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/output_capture.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/template_collector.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/template_collector.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/template_compiler.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/template_compiler.rb (house-layout move; no content change).
  • apps/ruby2html/lib/gem/ruby2html/rails_components/template_helpers.rb (create) — Create with the exact bytes of old root path lib/gem/ruby2html/rails_components/template_helpers.rb (house-layout move; no content change).
  • apps/ruby2html/ext/ruby2html/attributes.c (create) — Create with the exact bytes of old root path ext/ruby2html/attributes.c (house-layout move; no content change).
  • apps/ruby2html/ext/ruby2html/buffer.h (create) — Create with the exact bytes of old root path ext/ruby2html/buffer.h (house-layout move; no content change).
  • apps/ruby2html/ext/ruby2html/content.c (create) — Create with the exact bytes of old root path ext/ruby2html/content.c (house-layout move; no content change).
  • apps/ruby2html/ext/ruby2html/extconf.rb (create) — Create with the exact bytes of old root path ext/ruby2html/extconf.rb. Its dir-based source glob (line 40) is self-relative — no content change.
  • apps/ruby2html/ext/ruby2html/html_escape.c (create) — Create with the exact bytes of old root path ext/ruby2html/html_escape.c (house-layout move; no content change).
  • +289 more files

Verification

./bin/check passed (exit 0) in 12s.

Notes

Premises of the request the team disproved:

  • Earlier-run premise (keep the gemspec's README/LICENSE/CHANGELOG select plus a comment): bin/gem-smoke:43 aborts 'Gem is missing ...' when the built gem lacks those files, so rake smoke would fail in CI. They must physically exist beside ruby2html.gemspec — add byte-identical packaging copies instead
  • Request premise 'a move rewrites import paths across the repo' is overbroad: every require inside the moved trees is self-relative (config/boot.rb:3, config/application.rb:22, lib/gem/ruby2html/render.rb:20, bench/*:13-15, lib/gem/ruby2html.rb:6-28, extconf.rb:40, gemspec globs via dir); only root-boundary files need updates
  • Advisory listed mise.toml as likely touched: its Ruby version is inline (mise.toml:3), not a .ruby-version reference, so it needs no edit
  • tmp/ is not in the move group and stays at root with its tracked .keep files — .gitignore's root /tmp/* rules remain correct, and only apps/ruby2html runtime-tmp rules are appended

🤖 Opened by developerz.ai for task tsk_697d58676e6ed343d2e14497993be198 on sebyx07/ruby2html.

Raised automatically by the setup lane.

🤖 developerz.ai, an automated agent, not a human — this PR is one slice of a stacked plan.
Dispatched automatically by the setup lane
Model glm-5.3-flash on router.ai.developerz.ai via native, funded by account_key
Ran on box sebastian-1
Cost unknown: no list price on record for glm-5.3-flash on router.ai.developerz.ai
Run timeline run_77bbe9eaf0ec44bfb83e4014be2f23a3
Part 4/4 of plan run_2a4f7da500244060bd628bed79c06268

Move the 22 house-layout items (app, config, db, ext, lib, spec, bench, gemfiles, public, log, storage, vendor, Gemfile+lock, Rakefile, config.ru, ruby2html.gemspec, llms.txt, .rspec, .rubocop.yml, .ruby-version) under apps/ruby2html/, file by file. The root keeps the boundary: bin/, .github/, .dz/, .claude/, docs/, .devcontainer/, .gitignore, .dockerignore, .gitattributes, lefthook.yml, mise.toml, tmp/.

Root Gemfile becomes a workspace stub eval_gemfile'ing apps/ruby2html/Gemfile; bundler always runs from the app dir (bin/check, bin/setup, lefthook root:, CI working-directory, dependabot /apps/ruby2html). Boundary references updated: bin/ scripts, CI workflows, dependabot, .dz policies and briefs, .claude skills/agents, AGENTS.md and docs.

Packaging copies of README.md/LICENSE/CHANGELOG.md added beside the gemspec: bin/gem-smoke:43 requires them inside the built gem, which the gemspec selects via File.file? next to itself. .gitignore gains apps/ruby2html re-anchors; no existing rule removed; root .dockerignore untouched (devcontainer builds use root context).

Dz-Task-Id: tsk_697d58676e6ed343d2e14497993be198
@developerz-ai developerz-ai Bot added dz/fleet-pr Opened by developerz.ai, an automated agent, from a fleet run. dz/model:glm-5.3-flash developerz.ai: model that wrote this bot PR. dz/provider:router.ai.developerz.ai developerz.ai: provider that served this bot PR. labels Nov 3, 2026
@developerz-ai

developerz-ai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Waiting on the repository owner: this pull request changes a gate file, which the platform does not merge by itself.

It changes .dz/maintainer/maintainer.yml, .dz/maintainer/reviewer.md, .github/workflows/benchmark.yml, .github/workflows/canary.yml, .github/workflows/ci.yml, .github/workflows/release.yml.

The merge check refused the edit: .dz/maintainer/maintainer.yml: a modified policy has no declared transform — only a new one on a repo with none for #19 — proof path: git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .dz/maintainer/maintainer.yml && git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .dz/maintainer/reviewer.md && git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .github/workflows/benchmark.yml && git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .github/workflows/canary.yml && git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .github/workflows/ci.yml && git checkout c566c6e874fd1c8718637f24ca41f1a3555b92ba -- .github/workflows/release.yml and push — a head that leaves every gate path as the base has it needs no proof, and the rest of the PR merges; or keep only an edit that is exactly a declared transform below. When the gate edit IS the goal, no head of ours proves it: the owner applies it. the PR is re-proved when its head changes, when the platform changes its gate-path transforms or templates, and on the hourly re-check; no .maintainer.yml key and no approval releases it — a workflow edit proves only as a tag pin, a permissions narrowing or a platform template, an added .mcp.json or reviewer prompt only as the platform template, a modified .mcp.json only as the platform adding its managed servers to the base file and touching nothing of the maintainer's, and a policy file only as a NEW .dz/maintainer/maintainer.yml on a repo with none that grants no more than the account's posture default

The task it answers planned this edit, so the goal cannot be met without it and it is not re-filed without them.

To take it, merge it on GitHub. To have the platform merge it, push a narrower edit: a new head is checked again and merged when the check passes. Nothing here is re-tried or closed automatically, and no email is sent; the pull request is listed with the stuck pull requests.

🤖 Posted by developerz.ai — an automated agent, not a human.

@developerz-ai

developerz-ai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Resolve merge conflict on #19

Work landed on #19 — watching it toward merge.

4m · 8 tool calls · 6 messages


🤖 developerz.ai, an automated agent, not a human — developerz-ai[bot]

Follow-up intent: Fix failing CI on #19

Dz-Task-Id: tsk_a9004fbdca2d40f4c61ad24ed552390e
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Benchmarks: x86_64 (linux)

ruby 4.0.9 (2026-10-23 revision 3e93b23afc) +PRISM [x86_64-linux] · commit 0eabb94e3c · 2.0s per report
Δ is against main c566c6e874 (same runner type; expect a few % noise).

escape_bench (C ext) · peak RSS 120 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 881,363 ± 0.8% 0.0011 0.00 fastest -33.4%
escape_html medium clean (200B) 532,545 ± 0.8% 0.0019 0.00 1.66x slower -35.2%
append short clean (10B) 330,930 ± 2.1% 0.0030 0.02 2.66x slower -29.3%
append short dirty (10B) 248,391 ± 1.0% 0.0040 0.00 3.55x slower -31.3%
append medium clean (200B) 234,902 ± 0.8% 0.0043 0.00 3.75x slower -31.2%
escape_html short dirty (10B) 174,769 ± 1.0% 0.0057 100 5.04x slower -31.2%
append medium dirty (200B) 117,374 ± 2.7% 0.0085 0.00 7.51x slower -28.8%
escape_html medium dirty (200B) 91,216 ± 0.6% 0.0110 100 9.66x slower -28.1%
escape_html long clean (10KB) 18,554 ± 0.2% 0.0539 0.00 47.50x slower -39.0%
append long clean (10KB) 14,273 ± 0.6% 0.0701 0.00 61.75x slower -37.6%
append long dirty (10KB) 1,905 ± 0.3% 0.5249 0.00 462.65x slower -15.9%
escape_html long dirty (10KB) 1,836 ± 2.7% 0.5445 100 479.93x slower -16.7%

escape_bench (pure Ruby) · peak RSS 152 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 256,841 ± 1.0% 0.0039 0.00 fastest -32.9%
append short clean (10B) 195,990 ± 3.1% 0.0051 0.02 1.31x slower -33.2%
escape_html short dirty (10B) 117,777 ± 0.7% 0.0085 100 2.18x slower -30.0%
append short dirty (10B) 98,964 ± 1.1% 0.0101 100 2.60x slower -29.2%
escape_html medium clean (200B) 69,236 ± 2.0% 0.0144 0.00 3.71x slower -31.9%
append medium clean (200B) 61,318 ± 0.5% 0.0163 0.00 4.19x slower -31.3%
escape_html medium dirty (200B) 37,558 ± 4.2% 0.0266 200 6.84x slower -25.7%
append medium dirty (200B) 33,837 ± 2.6% 0.0296 200 7.59x slower -28.8%
escape_html long clean (10KB) 1,761 ± 1.1% 0.5680 0.00 145.87x slower -52.5%
append long clean (10KB) 1,708 ± 1.1% 0.5855 0.00 150.39x slower -50.3%
escape_html long dirty (10KB) 1,184 ± 1.2% 0.8449 200 217.01x slower -43.2%
append long dirty (10KB) 1,097 ± 2.9% 0.9116 200 234.13x slower -41.1%

render_bench (C ext) · peak RSS 132 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 10,508 ± 1.8% 0.0952 713 fastest -25.7%
ruby2html 7,712 ± 5.6% 0.1297 419 1.36x slower -24.0%
phlex 693 ± 0.9% 1.4426 6,374 15.16x slower -20.0%

render_bench (pure Ruby) · peak RSS 132 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 10,711 ± 1.7% 0.0934 713 fastest -24.7%
ruby2html 3,040 ± 4.9% 0.3289 1,029 3.52x slower -20.2%
phlex 693 ± 1.3% 1.4440 6,374 15.47x slower -17.8%

tag_bench (C ext) · peak RSS 39 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 327,553 ± 1.5% 0.0031 7.00 fastest -26.5%
li(text) 213,435 ± 1.9% 0.0047 7.02 1.53x slower -28.9%
li(dirty text) 170,999 ± 1.9% 0.0058 7.00 1.92x slower -29.0%
div { block } 150,189 ± 1.4% 0.0067 7.00 2.18x slower -31.1%
span(text, class:) 48,071 ± 0.7% 0.0208 207 6.81x slower -29.9%
div(class:) { block } 43,332 ± 0.4% 0.0231 207 7.56x slower -26.2%
a(text, href:, class:) 34,033 ± 2.6% 0.0294 207 9.62x slower -31.7%

tag_bench (pure Ruby) · peak RSS 27 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 134,677 ± 0.8% 0.0074 107 fastest -31.1%
div { block } 110,233 ± 0.5% 0.0091 107 1.22x slower -33.4%
li(text) 95,649 ± 0.9% 0.0105 107 1.41x slower -31.9%
li(dirty text) 67,751 ± 0.9% 0.0148 207 1.99x slower -27.5%
span(text, class:) 21,143 ± 0.6% 0.0473 207 6.37x slower -29.2%
div(class:) { block } 19,722 ± 0.6% 0.0507 207 6.83x slower -20.3%
a(text, href:, class:) 13,892 ± 3.3% 0.0720 207 9.69x slower -27.5%

Rails request (C ext) · peak RSS 238 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
Slim 697 ± 9.5% 1.4344 3,937 fastest -31.1%
ERB 645 ± 10.9% 1.5512 2,818 1.08x slower -29.8%
Ruby2html::Component 639 ± 5.9% 1.5652 4,251 1.09x slower -33.4%
ruby2html .html.rb templates 634 ± 5.4% 1.5772 4,381 1.10x slower -36.4%
ViewComponent + ruby2html 621 ± 2.7% 1.6096 4,108 1.12x slower -33.0%
Phlex 555 ± 1.4% 1.8004 5,525 1.26x slower -36.1%

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Benchmarks: aarch64 (linux)

ruby 4.0.9 (2026-10-23 revision 3e93b23afc) +PRISM [aarch64-linux] · commit 0eabb94e3c · 2.0s per report
Δ is against main c566c6e874 (same runner type; expect a few % noise).

escape_bench (C ext) · peak RSS 118 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 613,788 ± 0.2% 0.0016 0.00 fastest -1.0%
escape_html medium clean (200B) 337,885 ± 0.4% 0.0030 0.00 1.82x slower -0.3%
append short clean (10B) 209,223 ± 0.2% 0.0048 0.02 2.93x slower +0.7%
append short dirty (10B) 160,671 ± 0.3% 0.0062 0.00 3.82x slower -0.2%
append medium clean (200B) 148,132 ± 0.2% 0.0068 0.00 4.14x slower +0.2%
escape_html short dirty (10B) 108,740 ± 1.3% 0.0092 100 5.64x slower -2.0%
append medium dirty (200B) 73,674 ± 0.2% 0.0136 0.00 8.33x slower +0.4%
escape_html medium dirty (200B) 57,488 ± 0.7% 0.0174 100 10.68x slower -2.3%
escape_html long clean (10KB) 11,507 ± 0.2% 0.0869 0.00 53.34x slower +0.5%
append long clean (10KB) 9,062 ± 0.4% 0.1103 0.00 67.73x slower +0.5%
append long dirty (10KB) 1,202 ± 0.2% 0.8320 0.00 510.66x slower -0.2%
escape_html long dirty (10KB) 1,123 ± 3.3% 0.8906 100 546.65x slower -2.2%

escape_bench (pure Ruby) · peak RSS 150 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 164,678 ± 0.2% 0.0061 0.00 fastest +0.0%
append short clean (10B) 104,357 ± 0.2% 0.0096 0.02 1.58x slower -0.1%
escape_html short dirty (10B) 67,395 ± 1.1% 0.0148 100 2.44x slower -3.8%
escape_html medium clean (200B) 56,856 ± 0.2% 0.0176 0.00 2.90x slower -0.0%
append short dirty (10B) 56,175 ± 0.6% 0.0178 100 2.93x slower -2.6%
append medium clean (200B) 45,549 ± 0.2% 0.0220 0.00 3.62x slower -0.1%
escape_html medium dirty (200B) 23,753 ± 1.0% 0.0421 200 6.93x slower -3.0%
append medium dirty (200B) 20,743 ± 1.2% 0.0482 200 7.94x slower -5.4%
escape_html long clean (10KB) 1,633 ± 0.2% 0.6123 0.00 100.83x slower +0.3%
append long clean (10KB) 1,557 ± 0.5% 0.6422 0.00 105.76x slower -0.2%
escape_html long dirty (10KB) 1,085 ± 0.6% 0.9213 200 151.72x slower -0.2%
append long dirty (10KB) 962 ± 3.1% 1.0400 200 171.27x slower +0.6%

render_bench (C ext) · peak RSS 131 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 7,435 ± 0.9% 0.1345 713 fastest -4.1%
ruby2html 5,752 ± 0.6% 0.1739 419 1.29x slower -1.9%
phlex 550 ± 1.3% 1.8195 6,374 13.53x slower -5.1%

render_bench (pure Ruby) · peak RSS 131 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 7,459 ± 0.8% 0.1341 713 fastest -3.3%
ruby2html 2,322 ± 0.4% 0.4307 1,029 3.21x slower -2.4%
phlex 557 ± 1.3% 1.7967 6,374 13.40x slower -3.6%

tag_bench (C ext) · peak RSS 38 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 212,993 ± 0.6% 0.0047 7.00 fastest -5.5%
li(text) 155,756 ± 0.6% 0.0064 7.02 1.37x slower -4.0%
li(dirty text) 123,780 ± 0.5% 0.0081 7.00 1.72x slower -2.9%
div { block } 97,923 ± 0.5% 0.0102 7.00 2.18x slower -1.7%
span(text, class:) 30,411 ± 1.0% 0.0329 207 7.00x slower -2.1%
div(class:) { block } 28,787 ± 0.8% 0.0347 207 7.40x slower -2.7%
a(text, href:, class:) 23,178 ± 1.0% 0.0431 207 9.19x slower -2.0%

tag_bench (pure Ruby) · peak RSS 26 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 81,442 ± 0.6% 0.0123 107 fastest -0.1%
div { block } 63,496 ± 0.6% 0.0157 107 1.28x slower +0.8%
li(text) 54,234 ± 0.5% 0.0184 107 1.50x slower -0.1%
li(dirty text) 41,123 ± 0.8% 0.0243 207 1.98x slower +0.4%
span(text, class:) 15,271 ± 0.4% 0.0655 207 5.33x slower -2.4%
div(class:) { block } 15,239 ± 0.4% 0.0656 207 5.34x slower -3.5%
a(text, href:, class:) 9,616 ± 0.4% 0.1040 207 8.47x slower -2.5%

Rails request (C ext) · peak RSS 241 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
Ruby2html::Component 454 ± 1.8% 2.2033 4,454 fastest -2.8%
ruby2html .html.rb templates 446 ± 2.5% 2.2397 4,589 1.02x slower -3.5%
Slim 433 ± 6.9% 2.3087 4,130 1.05x slower -4.8%
ViewComponent + ruby2html 413 ± 3.4% 2.4197 4,311 1.10x slower -5.3%
Phlex 377 ± 2.4% 2.6496 5,806 1.20x slower -5.3%
ERB 363 ± 15.2% 2.7576 2,947 1.25x slower -9.5%

@developerz-ai

developerz-ai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

🟡 Reviewed

1 actionable comment(s) · grounded on your code

⚠️ 2 config note(s): test files were not shown to the reviewer — this diff touched no path recognised as a test, so no assertion was available to read the change against · 1 finding(s) from an earlier review still stand (spec/ci/advisory_audit_spec.rb) — nothing this pass saw withdraws them. They are listed again here and hold this pull request until a push fixes them

⏱ 44s wall clock · glm-5.3-flash via router · 2 model call(s) · 544 output token(s)

🤖 developerz.ai — automated review, running on your model and your box.

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 183 file(s), 8 finding(s).

Critical 0 · Major 1 · Minor 7 · Nit 0

House-layout move of the gem into apps/ruby2html with byte-identical files; verified Rakefile's ../../bin/gem-smoke and setup_spec's ../../../../bin/setup resolve correctly. One defect: the README copy's root-relative doc links now 404.

File Findings
.github/workflows/release.yml 1 major
.ruby-version 1 minor
CONTRIBUTING.md 1 minor
README.md 1 minor
apps/ruby2html/README.md 1 minor
apps/ruby2html/ruby2html.gemspec 1 minor
apps/ruby2html/spec/bin/setup_spec.rb 1 minor
docs/release.md 1 minor

6 finding(s) GitHub refused inline

GitHub rejected this review's inline comments, so posting them would have lost the entire review — summary and all. The most common cause is that the pull request moved after this pass read it, which retires the lines these findings anchor to. They are reproduced here so nothing is lost; the line numbers are the ones this pass read.

  • .ruby-version:1 minor · other The root .ruby-version now contains the literal string 'apps/ruby2html/.ruby-version' instead of a version, so tools that read this file as a version (rbenv/chruby local, and mise's legacy .ruby-version support before mise.toml wins) fail with "version not installed" at the repo root. Consider maki…
  • CONTRIBUTING.md:33 minor · docs CHANGELOG.md moved under apps/ruby2html/, so this root-level CHANGELOG.md link is broken. Use the new path.
  • README.md:260 minor · docs The move put CHANGELOG.md at apps/ruby2html/CHANGELOG.md, but this root README still links CHANGELOG.md, which now 404s. Point the link at apps/ruby2html/CHANGELOG.md.
  • apps/ruby2html/README.md:44 minor · docs This packaging copy's relative links still resolve against the new apps/ruby2html/ location, where the targets don't exist: .dz/maintainer/maintainer.yml, AGENTS.md (line 52), .claude/…
  • apps/ruby2html/ruby2html.gemspec:51 minor · docs The new comment claims the README.md/LICENSE/CHANGELOG.md copies beside the gemspec are "byte-identical copies ... kept in sync", but the diff shows the app README already diverges from the root one (it links llms.txt, ../../.github/workflows/benchmark.yml, and app/components/... while the ro…
  • docs/release.md:20 minor · docs The move removed CHANGELOG.md from the repo root, so the claim that bin/changelog-notes "reads the root CHANGELOG.md" is now false unless the script was updated to apps/ruby2html/CHANGELOG.md. Verify the script's path and word the note accordingly.

Findings outside the diff

  • .github/workflows/release.yml:155 major · bug The release job runs with working-directory apps/ruby2html, but download-artifact drops the java-gem at the workspace (repo) root, so ../../ruby2html-*-java.gem resolves above the checkout and matches nothing; the push fails and the release job aborts after the CRuby gem build, leaving no publish…

  • apps/ruby2html/spec/bin/setup_spec.rb:17 minor · test The spec asserts the order of stubbed commands but never the subprocess's working directory, yet the exact behaviour this PR changes is that bundle/rake now run inside apps/ruby2html instead of the repo root — a regression that reverted the chdir would still pass. Have the stub log $(pwd) alongsi…

  • 2 noise file(s) auto-skipped (lockfiles/generated/vendored — re-include with path_filters)

  • ci-release-workflows: nothing to review — Pure repo-restructure slice: workflow/path updates and root binstubs all consistently re-anchored to apps/ruby2html with ../../ for root scripts. Checked the tricky spots: release.yml artifact paths (upload path apps/ruby2html/...

  • concern-security: nothing to review — Pure workspace re-layout: file moves plus path-anchored updates to CI workflows, bin scripts, gitignore/attributes, and docs. No new code paths, no new input handling, no auth/tenant surface touched.

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/glm-5.3-flash — 750k in / 13.7k out over 13 calls; cost unknown: no price on record for router/glm-5.3-flash.

@developerz-ai

developerz-ai Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

File fence widened for a merge conflict resolution. The resolve_conflict follow-up for this pull request needed to change file(s) the merge left auto-merged but not conflicted, to resolve the conflict correctly — reason given: merge conflict resolution: stale pre-move paths in the issue-template comment:

  • .github/ISSUE_TEMPLATE/bug_report.yml

Why: main auto-merged a comment into .github/ISSUE_TEMPLATE/bug_report.yml telling the release agent to read the gem version from "lib/gem/ruby2html/version.rb" and the Rails version from "Gemfile.lock". This PR moves the app into apps/ruby2html/, so in the merged tree those paths no longer exist (verified: lib/ and root Gemfile.lock are absent; apps/ruby2html/lib/gem/ruby2html/version.rb and apps/ruby2html/Gemfile.lock exist). The conflict I resolved in docs/release.md and .claude/skills/release/SKILL.md now names the apps/ruby2html/... paths, so the issue template it points at ("see docs/release.md") must agree, otherwise the release step follows a dangling path. One-line comment fix only.

The platform granted it under the same area lock a new task takes (no other in-flight task holds these files), after checking the path is not a secret, CI configuration or a human-merge path.

Posted automatically by the developerz bot (AI-authored).

…the-application-into-apps-ruby2html-house--697d5867

# Conflicts:
#	.claude/skills/release/SKILL.md
#	docs/release.md

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 3 file(s), 1 finding(s).

Critical 0 · Major 1 · Minor 0 · Nit 0

House-layout move of the gem/app tree under apps/ruby2html/ plus path updates in release docs, the release skill and the issue template. Diff shown is docs-only; no defect surfaced in these lines.

  • test files were not shown to the reviewer — this diff touched no path recognised as a test, so no assertion was available to read the change against
  • 1 finding(s) from an earlier review still stand (.github/workflows/release.yml) — nothing this pass saw withdraws them. They are listed again here and hold this pull request until a push fixes them

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/MiniMax-M3 — 21.8k in / 200 out over 2 calls, on your flat-rate plan: no per-token charge (~<$0.01 at list price).

Comment thread .github/workflows/release.yml Resolved
Follow-up intent: Address review findings on #19

Dz-Task-Id: tsk_8bdfb20c10fdda445cc9ac5da6842b0c

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 1 file(s), 0 finding(s).

Release workflow fix: the java-gem artifact is now downloaded into apps/ruby2html and the push/release globs are relative to that directory. Path handling looks consistent; no defects found in this increment.

  • test files were not shown to the reviewer — this diff touched no path recognised as a test, so no assertion was available to read the change against

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/MiniMax-M3 — 12.9k in / 85 out over 1 call, on your flat-rate plan: no per-token charge (~<$0.01 at list price).

…the-application-into-apps-ruby2html-house--697d5867

# Conflicts:
#	AGENTS.md
#	apps/ruby2html/spec/bin/brakeman_spec.rb

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 1 file(s), 0 finding(s).

Pure file-move PR under apps/ruby2html; the only visible content change (brakeman_spec's script path) correctly gains two extra parent hops for the new depth, and all CI gates are green.

  • concern-tests: nothing to review — My slice is a renamed spec file with one line changed: script_path was re-anchored from ../../bin/brakeman to ../../../../bin/brakeman, which correctly resolves from apps/ruby2html/spec/bin to the root bin/brakeman that stays at the repo boundary.

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/glm-5.3-flash — 31.9k in / 471 out over 2 calls, on your flat-rate plan: no per-token charge (~<$0.01 at list price).

@developerz-ai

developerz-ai Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor Author

File fence widened for a merge conflict resolution. The resolve_conflict follow-up for this pull request needed to change file(s) the merge left auto-merged but not conflicted, to resolve the conflict correctly — reason given: merge-conflict resolution: audit wiring broken by the apps/ move:

  • apps/ruby2html/Rakefile
  • bin/audit-advisories
  • spec/ci/advisory_audit_spec.rb
  • spec/ci/support/rake_wiring_driver.rb

Why: Main's audit feature auto-merged into the PR's moved layout and broke: (1) apps/ruby2html/Rakefile:94 runs File.expand_path('bin/audit-advisories', __dir__) — my run shows CI=1 BUNDLE_GEMFILE=gemfiles/standalone.gemfile rake audit:advisories failing with "Command failed with status (1): [.../apps/ruby2html/bin/audit-advisories]" because the script stays at repo-root bin/ (same layout as the smoke task's ../../bin/gem-smoke). (2) bin/audit-advisories' fallback reads repo-root Gemfile.lock, which the move relocated to apps/ruby2html/Gemfile.lock — spec/ci's "audits the committed root Gemfile.lock without arguments" fails with exit 1 ("no such lockfile"). (3+4) root spec/ci/ fails 9 examples in the merged layout ("No Rakefile found" — the driver chdirs to repo root; Dir[root/gemfiles/*.gemfile] is empty since gemfiles/ moved into apps/ruby2html), and nothing runs root spec/ anymore since bin/check and CI's test job run the suite from apps/ruby2html — the specs must move to apps/ruby2html/spec/ci/ (inside my set) so main's guard keeps running, and the root originals deleted.

The platform granted it under the same area lock a new task takes (no other in-flight task holds these files), after checking the path is not a secret, CI configuration or a human-merge path.

Posted automatically by the developerz bot (AI-authored).

…the-application-into-apps-ruby2html-house--697d5867

# Conflicts:
#	AGENTS.md
#	apps/ruby2html/spec/bin/ruby_version_spec.rb

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 6 file(s), 1 finding(s).

Critical 0 · Major 1 · Minor 0 · Nit 0

House-layout move with correct path re-anchoring in Rakefile, bin/audit-advisories and the ruby-version spec; but the diff silently deletes spec/ci/advisory_audit_spec.rb and its driver — the tests guarding the CI audit wiring — instead of re-anchoring them.

Findings outside the diff

  • spec/ci/advisory_audit_spec.rb:1 major · test The PR moves files but silently deletes the coverage guard for the dependency audits: the spec pinning the rake audit wiring, the ACCEPTED_ADVISORIES snapshot against re-review, and the root-lockfile coverage all vanish instead of re-anchoring to apps/ruby2html. Nothing in the description accounts…

  • concern-security: nothing to review — Security review: the PR is a pure file relocation. It introduces no new input path, no auth change, no secret handling, and no injection surface.

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/glm-5.3-flash — 342.2k in / 6.65k out over 12 calls, on your flat-rate plan: no per-token charge (~$0.05 at list price).

…the-application-into-apps-ruby2html-house--697d5867

# Conflicts:
#	README.md

@developerz-ai developerz-ai Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Review summary — 1 file(s), 1 finding(s).

Critical 0 · Major 1 · Minor 0 · Nit 0

Monorepo-layout move: all 22 file trees relocated under apps/ruby2html/ with root boundary scripts, CI, and docs updated; CI matrix, packaging, and pure-Ruby/C parity checks all pass. README path updates verified consistent with the new layout; no defect found.

Findings outside the diff

  • spec/ci/advisory_audit_spec.rb:1 major · test The PR moves files but silently deletes the coverage guard for the dependency audits: the spec pinning the rake audit wiring, the ACCEPTED_ADVISORIES snapshot against re-review, and the root-lockfile coverage all vanish instead of re-anchoring to apps/ruby2html. Nothing in the description accounts…

  • test files were not shown to the reviewer — this diff touched no path recognised as a test, so no assertion was available to read the change against

  • 1 finding(s) from an earlier review still stand (spec/ci/advisory_audit_spec.rb) — nothing this pass saw withdraws them. They are listed again here and hold this pull request until a push fixes them

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/glm-5.3-flash — 22.9k in / 544 out over 2 calls, on your flat-rate plan: no per-token charge (~<$0.01 at list price).

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dz/fleet-pr Opened by developerz.ai, an automated agent, from a fleet run. dz/model:glm-5.3-flash developerz.ai: model that wrote this bot PR. dz/provider:router.ai.developerz.ai developerz.ai: provider that served this bot PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants