Skip to content

ci: tie the demo app's Rails defaults to the CI Rails matrix - #22

Open
developerz-ai[bot] wants to merge 4 commits into
mainfrom
dz/tie-the-app-s-rails-load-defaults-to-the-ci--43ec5176
Open

developerz-ai[bot] wants to merge 4 commits into
mainfrom
dz/tie-the-app-s-rails-load-defaults-to-the-ci--43ec5176

Conversation

@developerz-ai

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

Copy link
Copy Markdown
Contributor

What

config/application.rb's load_defaults version (7.2) becomes the single source of
truth for the Rails floor CI resolves: bin/rails-versions derives its floor from
it instead of a hardcoded 7.2, and the new bin/rails-defaults-check fails loudly
when the app's floor, the CI matrix's oldest resolved entry and the floor
advertised in README.md/llms.txt/AGENTS.md diverge. The gem's advertised Rails
floor (Rails 7.2+) is unchanged.

Acceptance

  • config/application.rb still boots the demo app with config.load_defaults 7.2; README.md:26, llms.txt:5 and AGENTS.md:22 still advertise 'Rails 7.2+' - the gem's advertised support floor is unchanged.
  • .github/workflows/ci.yml builds the Rails matrix without a pinned version: the rails-versions step runs ruby bin/rails-versions, whose floor comes from config/application.rb.
  • ruby bin/rails-defaults-check exits non-zero and names both versions when the app's Rails floor diverges from the matrix's oldest resolved entry or from the advertised floor; spec/ci/rails_defaults_spec.rb proves that failure path.
  • The guard runs inside the CI OK gate: the rails-versions job runs bin/rails-defaults-check with the resolved matrix and ci-ok lists rails-versions in its needs.
  • The demo app still boots on the matrix's oldest Rails (7.2): the rails job runs bundle exec rspec spec/features spec/gem/rails, which loads config/environment and applies config.load_defaults 7.2.
  • No gem file changes: nothing under lib/gem/ or ext/, the gemspec and the packaged file list (ruby2html.gemspec:50-55) are untouched; bin/ and spec/ are not packaged.

Changes

  • config/application.rb (edit) — Keep config.load_defaults 7.2 (the value must NOT change) and replace the generated comment with the invariant: this version is the demo app's Rails floor, the CI matrix's oldest entry is derived from it (bin/rails-versions), the gem advertises the same floor (README.md:26, llms.txt:5, AGENTS.md:22), and bin/rails-defaults-check fails CI when they drift. Say that raising it raises the app's floor and is the owner's call.
  • bin/rails-versions (edit) — Derive the matrix floor from the demo app instead of the hardcoded '7.2' (line 12): parse config.load_defaults <version> from config/application.rb, abort with a clear message when it cannot be parsed, and add a --floor mode that prints just that version and exits 0 without touching rubygems.org. An explicit MIN argument still overrides the listing; no other behaviour change.
  • bin/rails-defaults-check (create) — New stdlib-only guard script (no bundler, no Rails). Compares the app's Rails floor (from bin/rails-versions --floor) with the floor advertised in README.md and llms.txt (both must state 'Rails X.Y+') and, when given the resolved matrix JSON as argv[1], with that matrix's oldest entry. Exits 1 with a message naming every version compared and the files to align; exits 0 when consistent.
  • .github/workflows/ci.yml (edit) — In the rails-versions job (lines 206-216) drop the pinned 7.2 from ruby bin/rails-versions and update the comment; add a step running ruby bin/rails-defaults-check "$VERSIONS" with the resolved matrix passed through an env var (the JSON contains double quotes, so pass it via env, not inline). Add rails-versions to the ci-ok needs list (line 268) so the guard's failure is named in the CI OK gate. Leave the rails matrix job and canary.yml untouched.
  • spec/ci/rails_defaults_spec.rb (create) — Offline spec (no Rails, no network): asserts ruby bin/rails-versions --floor equals the config.load_defaults value parsed from config/application.rb, that ruby bin/rails-defaults-check exits 0 today, and that it exits non-zero with both versions in its message when handed a matrix whose oldest entry diverges (e.g. '["8.0"]'). Derive the expected versions from config/application.rb, never hardcode 7.2, so a legitimate floor change needs no spec edit.
  • AGENTS.md (edit) — Handoff from editor:rails-floor: The demo app's Rails floor is now derived, not hardcoded: bin/rails-versions parses config/application.rb and bin/rails-defaults-check fails CI when the app floor, the advertised floor and the CI matrix's oldest entry drift apart. — AGENTS.md is the repo's agent-facing source of truth and its Scripts row ('bin/gem-smoke, bin/changelog-notes, bin/build-ext') and CI row do not mention the two new scripts, so the next agent would not know the floor is derived or that a guard exists. Please add bin/rails-versions (--floor mode) and bin/rails-defaults-check to the S

Verification

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

What the editors ran to see the change working, and what they saw:

  • bundle exec rspec spec/ci/rails_defaults_spec.rb && bundle exec rubocop bin/rails-versions bin/rails-defaults-check spec/ci/rails_defaults_spec.rb config/application.rb (rails-floor): 3 examples, 0 failures; '4 files inspected, no offenses detected'
  • ruby bin/rails-versions --floor (rails-floor): prints '7.2' and exits 0 (no network)
  • ruby bin/rails-versions (rails-floor): prints ["7.2","8.0","8.1"] - same matrix the pinned '7.2' produced, now derived from config/application.rb
  • ruby bin/rails-defaults-check (rails-floor): 'Rails floor 7.2: app floor (config/application.rb), README.md, llms.txt agree.', exit 0
  • ruby bin/rails-defaults-check '["8.0"]' (rails-floor): exit 1 with 'Rails floor mismatch:' naming 'app floor (config/application.rb): 7.2', 'CI matrix (oldest entry): 8.0' and 'Align CI matrix with config/application.rb: bin/rails-versions derives the CI matrix from it.'
  • bundle exec rspec spec/ci/rails_defaults_spec.rb && bundle exec rubocop bin/rails-versions bin/rails-defaults-check spec/ci/rails_defaults_spec.rb config/application.rb (rails-floor): rspec: "3 examples, 0 failures" (Finished in 1.41 seconds); rubocop: "Inspecting 4 files / 4 files inspected, no offenses detected"; exit 0
  • code_grep 'Rails [0-9][0-9.]*\+' over README.md and llms.txt (rails-floor): README.md:26 and README.md:31 both advertise "Rails 7.2+" and llms.txt:5 advertises "Rails 7.2+" — the guard dedupes README's two occurrences to a single "7.2", so README.md/llms.txt and the app's config.load_defaults 7.2 agree and bin/rails-defaults-check exits 0
  • bundle exec rspec spec/ci/rails_defaults_spec.rb && bundle exec rubocop bin/rails-versions bin/rails-defaults-check spec/ci/rails_defaults_spec.rb config/application.rb (editor): 3 examples, 0 failures; then '4 files inspected, no offenses detected' (exit 0)
  • ruby bin/rails-defaults-check '["7.2","8.0"]' (editor): EXIT=0 - 'Rails floor 7.2: app floor (config/application.rb), README.md, llms.txt, CI matrix (oldest entry) agree.'
  • ruby bin/rails-defaults-check '["8.0","8.1"]' (editor): EXIT=1 - 'Rails floor mismatch: app floor (config/application.rb): 7.2 ... CI matrix (oldest entry): 8.0' (both versions named)
  • +2 more

Notes

Premises of the request the team disproved:

  • The request says the CI matrix 'resolves every stable Rails >= 7.2 up to edge'. The ci.yml matrix is stable lines only - bin/rails-versions rejects prereleases (bin/rails-versions:15) and ci.yml:226 says 'edge: monthly in canary.yml'. Rails edge is a separate, non-gating monthly job (canary.yml:36-53), not a matrix entry.
  • The request implies app and matrix already diverge. They agree today: config/application.rb:27 pins load_defaults 7.2 and bin/rails-versions:12 uses 7.2 as its floor, so the resolved matrix starts at 7.2. There is no current inconsistency - the missing piece is the tie and a check.
  • The stated failure mode ('a Rails release in the matrix stops honouring the 7.2 defaults') is the unlikely one: Rails 7.2 through main all still carry the when "7.2" branch of load_defaults. The break that really happens is the reverse - an app whose load_defaults is NEWER than the matrix's oldest entry, which Rails rejects at boot with RuntimeError: Unknown version "8.0".

Handoffs this run could not complete:

  • bin/rails-defaults-check — I wired the guard into the CI matrix job (it now runs on every CI run with the resolved matrix) and made the matrix floor derive from config/application.rb.; The policy names three advertised floors - README.md:26, llms.txt:5 and AGENTS.md:22 ('Rails 7.2+') - but the guard's ADVERTISED_FILES constant only covers README.md and llms.txt, so a drift in AGENTS.md would pass CI silently. Add 'AGENTS.md' to ADVERTISED_FILES (the script scans for /Rails (\d+(?:.\d+)*)+/ and AGENTS.md currently contains exactly one such string, 'Rails 7.2+', so the no-argument run keeps passing and the existing spec stays green). (named after the handoff rounds ran, by a repair round)

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

Raised automatically by the raw_task_triage lane.

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

config/application.rb's load_defaults version (7.2) becomes the single source of
truth for the Rails floor CI resolves: bin/rails-versions derives its floor from
it instead of a hardcoded 7.2, and the new bin/rails-defaults-check fails loudly
when the app's floor, the CI matrix's oldest resolved entry and the floor
advertised in README.md/llms.txt/AGENTS.md diverge. The gem's advertised Rails
floor (Rails 7.2+) is unchanged.

Dz-Task-Id: tsk_43ec5176c615e063bb636ec79a26ccd4
@developerz-ai developerz-ai Bot added dz/fleet-pr Opened by developerz.ai, an automated agent, from a fleet run. dz/model:MiniMax-M3 developerz.ai: model that wrote this bot PR. dz/provider:router.ai.developerz.ai developerz.ai: provider that served this bot PR. labels Nov 9, 2026
@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Benchmarks: aarch64 (linux)

ruby 4.0.9 (2026-10-23 revision 3e93b23afc) +PRISM [aarch64-linux] · commit 8cd8421017 · 2.0s per report
Δ is against main b69cba8f67 (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) 614,102 ± 0.8% 0.0016 0.00 fastest -0.7%
escape_html medium clean (200B) 336,030 ± 0.2% 0.0030 0.00 1.83x slower -1.0%
append short clean (10B) 207,389 ± 0.2% 0.0048 0.02 2.96x slower +0.1%
append short dirty (10B) 160,461 ± 0.2% 0.0062 0.00 3.83x slower +0.3%
append medium clean (200B) 147,606 ± 0.2% 0.0068 0.00 4.16x slower +0.2%
escape_html short dirty (10B) 109,536 ± 3.5% 0.0091 100 5.61x slower -1.4%
append medium dirty (200B) 73,412 ± 0.2% 0.0136 0.00 8.37x slower -0.5%
escape_html medium dirty (200B) 59,493 ± 0.2% 0.0168 100 10.32x slower +1.6%
escape_html long clean (10KB) 11,476 ± 0.2% 0.0871 0.00 53.51x slower -0.2%
append long clean (10KB) 9,029 ± 0.2% 0.1108 0.00 68.01x slower -0.5%
append long dirty (10KB) 1,205 ± 0.2% 0.8296 0.00 509.48x slower +0.3%
escape_html long dirty (10KB) 1,163 ± 2.7% 0.8602 100 528.25x slower +2.6%

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,532 ± 0.2% 0.0061 0.00 fastest -0.0%
append short clean (10B) 104,512 ± 0.2% 0.0096 0.02 1.57x slower +0.1%
escape_html short dirty (10B) 70,412 ± 0.4% 0.0142 100 2.34x slower +1.6%
append short dirty (10B) 58,524 ± 0.5% 0.0171 100 2.81x slower +1.3%
escape_html medium clean (200B) 56,862 ± 0.1% 0.0176 0.00 2.89x slower +0.0%
append medium clean (200B) 45,603 ± 0.2% 0.0219 0.00 3.61x slower +0.2%
escape_html medium dirty (200B) 25,382 ± 0.3% 0.0394 200 6.48x slower +1.5%
append medium dirty (200B) 22,651 ± 0.3% 0.0441 200 7.26x slower +2.0%
escape_html long clean (10KB) 1,632 ± 0.2% 0.6128 0.00 100.83x slower +0.0%
append long clean (10KB) 1,572 ± 0.2% 0.6361 0.00 104.66x slower +1.0%
escape_html long dirty (10KB) 1,093 ± 0.4% 0.9150 200 150.55x slower +1.9%
append long dirty (10KB) 979 ± 2.9% 1.0219 200 168.14x slower +3.0%

render_bench (C ext) · peak RSS 131 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 7,817 ± 0.3% 0.1279 713 fastest +2.8%
ruby2html 5,926 ± 0.5% 0.1688 419 1.32x slower +2.4%
phlex 587 ± 0.9% 1.7048 6,374 13.33x slower +4.3%

render_bench (pure Ruby) · peak RSS 131 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 7,781 ± 0.4% 0.1285 713 fastest +3.1%
ruby2html 2,418 ± 0.4% 0.4135 1,029 3.22x slower +3.9%
phlex 591 ± 0.8% 1.6917 6,374 13.16x slower +4.4%

tag_bench (C ext) · peak RSS 39 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 227,963 ± 0.4% 0.0044 7.00 fastest +4.4%
li(text) 165,268 ± 0.5% 0.0061 7.02 1.38x slower +4.0%
li(dirty text) 129,428 ± 0.3% 0.0077 7.00 1.76x slower +4.1%
div { block } 101,473 ± 0.5% 0.0099 7.00 2.25x slower +2.9%
span(text, class:) 31,390 ± 0.3% 0.0319 207 7.26x slower +1.2%
div(class:) { block } 29,825 ± 0.3% 0.0335 207 7.64x slower +1.5%
a(text, href:, class:) 24,025 ± 0.3% 0.0416 207 9.49x slower +1.1%

tag_bench (pure Ruby) · peak RSS 26 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 82,990 ± 0.5% 0.0120 107 fastest +1.3%
div { block } 64,090 ± 0.3% 0.0156 107 1.29x slower +1.6%
li(text) 55,133 ± 0.4% 0.0181 107 1.51x slower +1.9%
li(dirty text) 42,052 ± 0.3% 0.0238 207 1.97x slower +1.5%
div(class:) { block } 15,876 ± 0.3% 0.0630 207 5.23x slower +1.4%
span(text, class:) 15,773 ± 0.3% 0.0634 207 5.26x slower +2.1%
a(text, href:, class:) 9,913 ± 0.3% 0.1009 207 8.37x slower +1.6%

Rails request (C ext) · peak RSS 247 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
Ruby2html::Component 500 ± 2.0% 2.0012 4,584 fastest +5.7%
ruby2html .html.rb templates 496 ± 2.0% 2.0175 4,720 1.01x slower +5.0%
Slim 488 ± 4.9% 2.0497 4,258 1.02x slower +5.0%
ViewComponent + ruby2html 466 ± 2.1% 2.1473 4,441 1.07x slower +4.6%
ERB 429 ± 14.5% 2.3331 3,032 1.17x slower -4.3%
Phlex 426 ± 0.7% 2.3467 5,981 1.17x slower +3.0%

@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Benchmarks: x86_64 (linux)

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

escape_bench (C ext) · peak RSS 119 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 1,406,179 ± 2.2% 0.0007 0.00 fastest +99.3%
escape_html medium clean (200B) 839,116 ± 0.9% 0.0012 0.00 1.68x slower +100.3%
append short clean (10B) 487,967 ± 0.8% 0.0020 0.02 2.88x slower +93.1%
append short dirty (10B) 370,214 ± 1.7% 0.0027 0.00 3.80x slower +100.5%
append medium clean (200B) 353,063 ± 0.9% 0.0028 0.00 3.98x slower +104.7%
escape_html short dirty (10B) 267,075 ± 0.5% 0.0037 100 5.27x slower +108.3%
append medium dirty (200B) 167,708 ± 0.7% 0.0060 0.00 8.38x slower +83.2%
escape_html medium dirty (200B) 132,965 ± 0.6% 0.0075 100 10.58x slower +80.7%
escape_html long clean (10KB) 33,463 ± 1.0% 0.0299 0.00 42.02x slower +106.2%
append long clean (10KB) 25,225 ± 1.3% 0.0396 0.00 55.75x slower +120.8%
append long dirty (10KB) 2,445 ± 0.3% 0.4090 0.00 575.08x slower +61.3%
escape_html long dirty (10KB) 2,371 ± 1.6% 0.4217 100 593.02x slower +69.8%

escape_bench (pure Ruby) · peak RSS 147 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
escape_html short clean (10B) 410,995 ± 0.4% 0.0024 0.00 fastest +104.5%
append short clean (10B) 302,405 ± 1.7% 0.0033 0.02 1.36x slower +98.1%
escape_html short dirty (10B) 173,649 ± 0.4% 0.0058 100 2.37x slower +97.0%
append short dirty (10B) 145,658 ± 0.7% 0.0069 100 2.82x slower +117.9%
escape_html medium clean (200B) 96,227 ± 1.7% 0.0104 0.00 4.27x slower +67.5%
append medium clean (200B) 91,259 ± 1.8% 0.0110 0.00 4.50x slower +83.3%
escape_html medium dirty (200B) 51,530 ± 1.0% 0.0194 200 7.98x slower +102.5%
append medium dirty (200B) 48,566 ± 0.6% 0.0206 200 8.46x slower +111.5%
escape_html long clean (10KB) 3,955 ± 3.1% 0.2528 0.00 103.91x slower +155.6%
append long clean (10KB) 3,756 ± 1.9% 0.2663 0.00 109.43x slower +151.9%
escape_html long dirty (10KB) 2,227 ± 1.1% 0.4489 200 184.51x slower +117.2%
append long dirty (10KB) 1,966 ± 1.6% 0.5086 200 209.02x slower +114.8%

render_bench (C ext) · peak RSS 132 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 15,462 ± 0.7% 0.0647 713 fastest +91.9%
ruby2html 11,989 ± 0.5% 0.0834 419 1.29x slower +122.9%
phlex 976 ± 0.7% 1.0248 6,374 15.85x slower +97.5%

render_bench (pure Ruby) · peak RSS 132 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
erubi 15,376 ± 0.6% 0.0650 713 fastest +89.8%
ruby2html 4,207 ± 0.7% 0.2377 1,029 3.66x slower +94.2%
phlex 984 ± 0.5% 1.0163 6,374 15.63x slower +99.0%

tag_bench (C ext) · peak RSS 39 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 447,642 ± 2.6% 0.0022 7.00 fastest +73.8%
li(text) 342,280 ± 2.5% 0.0029 7.02 1.31x slower +101.1%
li(dirty text) 288,184 ± 7.8% 0.0035 7.00 1.55x slower +98.5%
div { block } 237,219 ± 0.7% 0.0042 7.00 1.89x slower +112.7%
span(text, class:) 74,057 ± 0.3% 0.0135 207 6.04x slower +127.8%
div(class:) { block } 62,277 ± 0.3% 0.0161 207 7.19x slower +124.6%
a(text, href:, class:) 54,394 ± 0.5% 0.0184 207 8.23x slower +132.4%

tag_bench (pure Ruby) · peak RSS 27 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
br 208,062 ± 2.8% 0.0048 107 fastest +109.6%
div { block } 170,010 ± 0.7% 0.0059 107 1.22x slower +117.3%
li(text) 148,116 ± 0.5% 0.0068 107 1.40x slower +105.2%
li(dirty text) 99,040 ± 8.1% 0.0101 207 2.10x slower +96.7%
span(text, class:) 30,548 ± 5.4% 0.0327 207 6.81x slower +111.1%
div(class:) { block } 25,540 ± 0.4% 0.0392 207 8.15x slower +93.1%
a(text, href:, class:) 19,504 ± 1.8% 0.0513 207 10.67x slower +104.6%

Rails request (C ext) · peak RSS 235 MB

Benchmark i/s ms / call allocs / call vs fastest Δ vs main
Slim 1,002 ± 1.1% 0.9981 4,357 fastest +86.0%
Ruby2html::Component 951 ± 0.6% 1.0515 4,701 1.05x slower +80.5%
ruby2html .html.rb templates 918 ± 8.7% 1.0898 4,846 1.09x slower +80.1%
ERB 884 ± 11.2% 1.1310 3,094 1.13x slower +86.3%
ViewComponent + ruby2html 875 ± 3.4% 1.1429 4,558 1.15x slower +79.8%
Phlex 828 ± 0.8% 1.2074 6,151 1.21x slower +81.4%

@developerz-ai

developerz-ai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor Author

Resolve merge conflict on #22

Work landed on #22 — watching it toward merge.

8m · 14 tool calls · 7 messages


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

@developerz-ai

developerz-ai Bot commented Nov 9, 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 .github/workflows/ci.yml.

The merge check refused the edit: .github/workflows/ci.yml: an edit outside the declared transforms (T1 pin, T2 narrow, T3 template) under 'jobs' — a run: line, a step, a with:, an env: or a removed job is not one the platform declared for #22 — proof path: git checkout b69cba8f6766c92d0113c760d00e5ab6a376ba7e -- .github/workflows/ci.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 9, 2026

Copy link
Copy Markdown
Contributor Author

File fence widened for a CI fix. The fix_pr follow-up for this pull request needed to change file(s) this PR did not touch, to fix the failing check — reason given: Security / bundle-audit:

  • Gemfile.lock

Why: The failing check "Security / bundle-audit" reads Gemfile.lock and reports Rails 8.1.4 vulnerable (log lines 174-341: actionmailbox/actionpack/actionview/activestorage/activesupport 8.1.4, e.g. GHSA-f3w6-w445-fwh9 Critical, all with "Solution: update to '>= 8.1.4.1'"). The lockfile pins rails (= 8.1.4) and every Rails component to 8.1.4, so only the lockfile can carry the patched release (8.1.4.1 is published; Gemfile's '~> 8.1' already allows it). Gemfile.lock is outside this round's exclusive file set, so it needs widening to regenerate.

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).

Follow-up intent: Fix failing CI on #22

Dz-Task-Id: tsk_91807250c18b8bb6f802584975b1aaa4
@developerz-ai

developerz-ai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ Reviewed — nothing blocking

0 actionable comment(s) · grounded on your code

⚠️ 1 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

⏱ 26s wall clock · glm-5.3-flash via router · 2 model call(s) · 285 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 — 6 file(s), 4 finding(s).

Critical 0 · Major 0 · Minor 4 · Nit 0

Derives the CI Rails matrix floor from the demo app's config.load_defaults and adds bin/rails-defaults-check to catch drift, wired into the rails-versions CI job and ci-ok needs. Low risk: no gem code touched.

File Findings
.github/workflows/ci.yml 1 minor
bin/rails-defaults-check 1 minor
spec/ci/rails_defaults_spec.rb 2 minor
  • 1 noise file(s) auto-skipped (lockfiles/generated/vendored — re-include with path_filters)

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

Comment thread .github/workflows/ci.yml Resolved
Comment thread bin/rails-defaults-check Resolved
Comment thread spec/ci/rails_defaults_spec.rb Resolved
Comment thread spec/ci/rails_defaults_spec.rb Resolved
Follow-up intent: Address review findings on #22

Dz-Task-Id: tsk_40c49f300874dbad5e9d25a42ee77923

@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 — 4 file(s), 0 finding(s).

Incremental PR: extends the Rails-floor guard to also compare AGENTS.md's advertised floor, prints labeled version pairs on success, and adds a spec proving a drifting advertised file fails the guard.

  • concern-tests: nothing to review — Incremental test-surface changes: the guard's advertised-file list gained AGENTS.md, its success output now names each version with its label, and the spec asserts the labeled strings and adds a drift case that copies the guard tree into a tmpdir and rewrites AGENTS.md.

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

…he-app-s-rails-load-defaults-to-the-ci--43ec5176

# Conflicts:
#	AGENTS.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), 0 finding(s).

Docs-only handoff edit: AGENTS.md documents the derived Rails floor (Scripts row now lists bin/rails-versions and bin/rails-defaults-check; new invariant edge 14), consistent with config/application.rb's load_defaults 7.2 and the guard.

  • 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
  • concern-security: nothing to review — The only file in this slice is a docs-only AGENTS.md edit (Scripts row and a new invariant note); no code, auth surface, credential or injection path is touched, and the claims match the described wiring.

🤖 developerz.ai review — automated, running on your model and your box. What is this? · Reviewed by router/glm-5.3-flash — 39.9k in / 285 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:MiniMax-M3 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