Skip to content

P0: recover #2 organic page from a 404 (Falcon alias) + R9 verdict - #493

Closed
pftg wants to merge 10 commits into
masterfrom
queue/puma-falcon-migration
Closed

pftg wants to merge 10 commits into
masterfrom
queue/puma-falcon-migration

Conversation

@pftg

@pftg pftg commented Aug 20, 2026 •

Copy link
Copy Markdown
Member

Started as "schedule a Puma→Falcon post", became a P0 recovery after 4-eyes review.

P0 — the site's #2 organic page is a 404

Google ranks /blog/falcon-web-server-async-ruby-**in**-production/ at 37 clicks / 3,778 impressions / position 10.1 over 90 days — second only to the homepage — and that slug has never existed in this repo. It returns 404 with no redirect, so every click on our best-ranking blog result hits an error page, and the whole falcon * head-term cluster ("falcon ruby" @4.8, "falcon server" @7.9, "falcon rails" @8.5) sits there.

Fix: aliases: ["/blog/falcon-web-server-async-ruby-in-production/"] on the live post — Hugo emits the redirect (verified in built output). The live slug keeps its name because every internal link, including the three posts shipped today, already points at it.

Isolated, not systemic: swept the top-10-by-clicks and the highest-impression pages; no other slug drift.

R9 verdict: Puma→Falcon is an in-place upgrade

The live post already carries a 207-line ## Migration from Puma/Unicorn section. Publishing a third Falcon URL while the ranking one is dead would compound the problem. Scope for rewriting that section as a real runbook is in §12a; the rewrite itself is already dispatched on a separate branch. Paul confirmed the approach.

Corrections to my own audit (recorded so they aren't repeated)

  • I attributed the cluster's rankings to the live URL. Wrong — they belong to the 404. The per-page query returning "no data" for the live URL was the signal I dismissed as odd.
  • I claimed the external cover_image broke og:image. Wrong — metatags.image resolves first and was already cover.png, and an absolute URL passed to Resources.Get can never win. The live og:image was already local. Frontmatter change kept as hygiene; cover_image_alt added, inert dev_to_id: 1 artifact dropped.

Reviewer verdict FIX-FIRST; all P0–P3 findings applied and re-verified by curl + per-page GSC pull. bin/hugo-build green.

🤖 Generated with Claude Code

…age was external

Paul asked to schedule a Puma->Falcon migration post. Premise audit says
write it INSIDE the page that already ranks, not as a new URL:
falcon-web-server-async-ruby-production already carries a ~200-line
'## Migration from Puma/Unicorn' section, is the site's #2 organic page,
and its cluster sits at position 4.8 for 'falcon ruby' (206 impr/90d).
Zero 'puma to falcon' queries drew impressions in 90 days, so there is
no separate intent to capture - a second page would only split a
position-4.8 cluster (the same §4 defect that forced the Rails 8 auth
consolidation). Recorded as R9 + §12a with the scope for the rewrite.
Paul confirmed the approach same day.

Also fixes a live STEP 6b violation found during the audit: that page's
cover_image pointed at an external practicaldev/Cloudinary URL while an
unused local cover.png sat in the bundle - og:image on our #2 page
depended on a third-party CDN. Now resolves to the Hugo-processed local
asset (verified in built output).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 749f2565-ade4-4d60-a7f9-ad2bf43b8251


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.

…dit record

4-eyes review caught that I attributed the Falcon cluster's rankings to
the wrong URL, and in doing so surfaced a much bigger defect than the
one the audit set out to fix.

Google ranks /blog/falcon-web-server-async-ruby-IN-production/ at 37
clicks / 3,778 impressions / position 10.1 over 90 days - the site's #2
organic page - and that slug has never existed in this repo. It returns
404 with no redirect, so every click on our best-ranking blog result
hits an error page, and the whole 'falcon *' head-term cluster sits
there. The live post (no 'in') records zero GSC data, which is exactly
the signal I dismissed as odd earlier in the audit.

Fix: aliases: ["/blog/falcon-web-server-async-ruby-in-production/"] on
the live post - Hugo emits the redirect (verified in built output). Live
slug keeps its name; every internal link, including the three posts
shipped today, already points at it. Swept the other top-10-by-clicks
and highest-impression pages for the same drift: none found, so this is
isolated.

Also corrected in §12a/§12b: the claim that the external cover_image
broke og:image was WRONG - metatags.image resolves first and was already
cover.png, and an absolute URL passed to Resources.Get can never win, so
the live og:image was already local. Kept the frontmatter change as
hygiene, added cover_image_alt, dropped the inert dev_to_id: 1
template artifact, and softened the 'zero migration queries' claim
('falcon vs puma' / 'puma vs falcon' each drew 1 impression).

Reviewer: core-reviewer 4-eyes pass, verdict FIX-FIRST; all P0-P3
findings applied. Every claim re-verified by curl + per-page GSC pull.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pftg pftg changed the title R9 verdict: Puma→Falcon as in-place upgrade + fix external cover_image on the #2 page P0: recover #2 organic page from a 404 (Falcon alias) + R9 verdict Aug 20, 2026
pftg and others added 8 commits August 20, 2026 19:02
…-URL sweep

Two invented config snippets on falcon-web-server-async-ruby-production,
both verified against Rails source before touching:
- async_query_executor = :fiber_pool - not a valid value (only nil,
  :global_thread_pool, :multi_thread_pool exist, per active_record.rb)
- allow_concurrency = true - a no-op with a wrong comment; only an
  explicit false does anything (inserts Rack::Lock, per railties
  default_middleware_stack.rb)
That block now carries just isolation_level = :fiber with an accurate
comment. A third fabrication (async: true in database.yml, not a real
HashConfig key) sits inside the 580-786 window being rewritten on
upgrade/falcon-puma-migration-runbook and is fixed there instead of
conflicting. Filed as §12c with the generalization: this is a dev.to-era
import ranking on head terms whose config examples were invented, so the
de-fabrication sweep should extend to the rest of the imported cluster.

Also strengthened §12b: a reviewer swept all 450 ranking /blog/ URLs
from the 90d GSC report against published output - the falcon 404 is the
only one, so 'isolated' now rests on the full population rather than a
top-N sample. Recorded the methodology correction too: do NOT diff GSC
URLs against ls content/blog/ (frontmatter slugs differ from directory
names - 17 false positives to 1 real hit here); the check must hit built
output or curl.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…'t tell readers to add it

Source verification for the Falcon migration rewrite turned up that
socketry/falcon ships a Railtie setting
config.active_support.isolation_level = :fiber unconditionally
(lib/falcon/railtie.rb, no guard or version check). The post I shipped
this morning framed it as one of 'two settings that matter' and handed
the reader a line to add - inaccurate under the very server the post
recommends. Reframed as 'you get this for free, here is what it does',
with the Railtie linked, and the stale 'with isolation_level = :fiber
set' instruction dropped from the closing advice. The pool: guidance,
which IS the reader's job, now stands on its own.

Caught by the upgrade coordinator's research pass, verified against
Falcon source before editing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d corrections

Source verification found two more beyond the three already logged: an
outdated Falcon config DSL (load :rack / rack hostname do, superseded by
require falcon/environment/rack + service ... include
Falcon::Environment::Rack) and an unsupported 'no explicit timeout
needed as fibers are cooperative' claim. Both sit inside the section
being rewritten and are fixed there.

Also recorded the two findings that inverted assumptions, each verified
against primary sources before being written down:
- Thread#[] is FIBER-local, not thread-local (Ruby docs: 'each fiber has
  its own bucket'); thread_variable_get/set is the thread-local pair. So
  'move thread-local state to fiber-local' is backwards for the API
  people actually use. Real failure modes are the reverse:
  thread_variable_set leaks request A's data into request B, while
  Thread.current[:cache] silently never hits.
- Falcon's Railtie sets isolation_level = :fiber unconditionally, which
  is why the fibers post shipped today needed its correction.

Sharpened the generalization to a P1: five invented/invalid/stale
examples on one ranking dev.to-era import means the imported technical
cluster needs the same de-fabrication sweep, config examples first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The upgrade writer caught that line 276 of this page still told readers
to add config.active_support.isolation_level = :fiber and called it
'Required under Falcon' - the exact defect I had just corrected in the
fibers post, left standing inside my own rewrite of that block. Falcon's
Railtie sets it unconditionally, so the page was about to contradict its
own new migration section.

Now reframed to match: the Railtie link, an explicit 'you do not add
this', what the setting actually governs, and pool: named as the
reader's real job. Both posts and the incoming migration section now
agree.

Worth recording as a pattern: fixing an instance of a defect is not the
same as fixing the defect. When a claim turns out wrong, grep the page
you are editing for it before moving on - I fixed a sibling post and
walked past the same sentence three lines from my own edit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Independent build-verified cross-check raised a coordination risk: two
branches edit the same top-ranking file (this one touches frontmatter +
the Rails Integration block, upgrade/falcon-puma-migration-runbook
rewrites the migration section) and my commits had already shifted the
other branch's line numbers twice. Recorded the resolution: this branch
merges first because it carries the 404 recovery, the upgrade branch
rebases after. Told that agent directly too.

Replaced the hard-coded 580-787 references with 'find it by heading, not
by number' - they had already gone stale twice in one session.

Also recorded what the same check verified, since it corrects an earlier
assumption of mine: cover_image never drove the rendered hero (the theme
resolves it via .Resources.GetMatch "cover.*") nor og:image (which comes
from metatags.image), so the frontmatter change is accessibility-only -
the alt attribute - with zero pixel change and no visual-suite risk. The
alias emits meta-refresh + canonical to the live URL and is excluded
from the sitemap, so no duplicate-content signal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Flagged by the upgrade writer as sitting just outside its editing
window. Same intensifier the batch sweep removed from four posts this
morning - it was pre-existing here, which is a small confirmation that
the tell predates today's batch rather than being introduced by it.
One word, no meaning lost.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agent-eval-specific companion to the monitoring post: bounded schemas as
the first check, a per-iteration jsonb audit trail on the run's metrics
row, funnel_summary, golden sets grown from flagged runs, and eval
replays against a local qwen3:0.6b.

SEO: title 30 chars, description 150 chars (og identical), primary
keyword in first 100 words, 5 internal links, 7 external citations.

First-hand material sanitized from a production talent-matching pipeline
(shapes and lessons only - no prompts, model IDs, or score bands).

Reviewer verdicts:
- Tech fact-check (core-reviewer): found 3 blocking errors in the draft -
  a false "no Rails engine for LLM testing" claim (ruby_llm-evals exists),
  an inverted lazy-block claim, and a config snippet that could not route
  to the local model. All three rewritten against the gem source at
  ruby_llm-1.16.0 and the ruby_llm-evals README.
- Cold-eyes 9-check gate (core-reviewer, fresh context): "PUBLISH-READY"
  after fixing an unsourced universal claim and two rhetorical flips.
- 4-eyes pre-commit (core-reviewer): "VERDICT: APPROVED FOR COMMIT" -
  all three blockers verified closed, including an empirical check that
  the published initializer resolves (Scorer < BaseAgent =>
  model=qwen3:0.6b provider=ollama temp=0.0).

Two claims were cut rather than published because the sources did not
support them: "answers in milliseconds" (no benchmark) and "landed in the
very next commit" (26 commits sit between the two).

Gates: bin/hugo-build green, bin/check-post-visuals exit 0, mermaid
pre-rendered to SVG at 14.45px effective font on a 390px viewport
(floor 9px), scroll gate clean at 1280x800 and 390x844 with zero
console errors and zero 404s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex cross-check BLOCKED this branch on a real defect in my own record.
§12c said three remaining fabrications 'are fixed there' on
upgrade/falcon-puma-migration-runbook. That branch has zero commits and
is unpushed - verified. So this PR would have routed 3,778 monthly
impressions onto a page while the document told a cold session the page
was clean. Now states plainly that the three are LIVE, that the branch
has not started, and 'do not read this as an all-clear'. Same fix for a
'both applied' heading that covered a Thread#[] correction which has not
been applied to any live line yet.

Content fixes from the same review:
- The rewritten block contradicted itself one sentence later: 'the one
  setting that matters' followed immediately by naming a second setting
  as the reader's job. Now 'the setting most migration guides tell you
  to add', with pool: given its own paragraph.
- 'you do not add this' was overstated for the workflow this same page
  prescribes: it puts falcon in the production group, so in development
  the Railtie never loads and isolation_level stays :thread. Caveat
  added.
- Railtie links pinned to v0.57.0 in both posts - blob/main can move
  under us, and the page pins a gem range two lines away.
- Recorded a sixth defect of the same class found on a later pass:
  after_connect: with a Ruby logger call in a second database.yml block,
  also not a real key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pftg

pftg commented Aug 20, 2026

Copy link
Copy Markdown
Member Author

🛑 DO NOT MERGE — converting to draft. All five checks are green, but this branch must not land as-is.

1. It contains another session's post. Commit 12e2ab1ac (content/blog/evaluating-rubyllm-agents-rails/, 3 files) landed here from a worktree collision. The batch session already relocated the real copy to rubyllm-evals-debugging-batch (2d2be86ae). Merging this would publish those files under a second SHA and collide with the branch that legitimately owns them.

2. That post has two open blockers, found by an independent codex pass with a runnable probe:

  • Its citation crmne/ruby_llm/blob/v1.16.0/... 404s — that repo's tags carry no v prefix. (Note: socketry/falcon does use v0.57.0, so the convention is per-repo.)
  • It tells readers a block passed to model is harmlessly ignored. It isn't: def model(model_id = nil, **options) assigns @chat_kwargs = options, so the block form wipes the inherited model and provider and silently falls back to config.default_model.

What this PR's own commits fix stays valid — the 404 recovery on the #2 organic page, two invalid Rails configs, the corrected audit record. Only 12e2ab1ac needs dropping.

Blocked on: my session is isolated to a different worktree and cannot reach this branch to drop the commit. Needs either the branch owner's session restored, or someone with access to run git rebase --onto 7a5b48044 12e2ab1ac queue/puma-falcon-migration (or revert 12e2ab1ac) and force-push.

Reopening for merge once that commit is gone.

@pftg

pftg commented Aug 20, 2026

Copy link
Copy Markdown
Member Author

Superseded by #498, which is the same work cherry-picked onto current master WITHOUT the stray commit 12e2ab1 (another session's R7 post, landed here by a worktree collision). #498 also carries two live defects found after this PR was opened: seven invalid falcon serve invocations including the systemd unit and Dockerfile, and the broken model { } sample in the multi-agent post.

Nothing is lost - all nine of this branch's own commits are in #498. Closing so the R7 post stays owned by its own branch.

@pftg pftg closed this Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant