tha‑shed · daily dispatch

Knobs & Trapdoors: Copilot’s New Effort Dial, and the GIL That Sneaks Back In

Two days apart, two ecosystems quietly handed developers a new lever to pull — and quietly left out what pulling it costs. Drag the dial on one, flip the switches on the other, and watch the fine print show up live.

01

The Dial

github.blog · oct 2, 2026
copilot · review-effort.api

GitHub’s Oct 2 changelog did two things at once: code review requests can now set an effort level through the REST/GraphQL API, and every repo’s default quietly moved from “Default” to “Balanced” on Sept 28. Drag the knob to feel what that default actually buys you — and what it costs.

LITE BAL THOROUGH
BALANCED
drag the dial — defaults to where GitHub put it
Comments / PR
4
Est. review time
19s
Noise
pull_request #482 · payments/refund_handler.rb
def process_refund(order)
– amount = order.total
+ amount = order.total_cents / 100.0
gateway.refund(order.id, amount)
end
critical Float division on currency — this will drift on large refunds. Use Money or integer cents end-to-end.
suggestion No rollback if gateway.refund raises after the DB write above — consider wrapping in a transaction.
suggestion Missing test for the zero-amount refund path.
nit Prefer order.total_cents.fdiv(100) over manual float division for readability.
nit Method is 14 lines — consider extracting the gateway-call branch.
# set the effort level per request instead of inheriting the org default
curl -X POST https://api.github.com/repos/acme/payments/pulls/482/copilot-review \
  -H "Authorization: Bearer $GH_TOKEN" \
  -d '{"effort":"balanced"}'
02

The Trapdoor

redhat.com · sept 14, 2026
python3.14t · free-threading status

Red Hat shipped python3.14t for RHEL 9.8/10.2 on Sept 14 — a real build with no GIL. Toggle your dependencies below. The moment one isn’t free-threading-ready, Python quietly re-enables the GIL for you — same code, same flags, suddenly single-threaded again.

Baseline tax: even when nothing falls back, Red Hat’s own docs put the free-threaded build at roughly 5–10% slower single-threaded than the regular build. You pay that whether or not you ever spin up a second thread.
✓your app code
pure python — always fine
✓numpy 2.x
ft-ready since 2.1
your async web framework
mostly pure-python, ft-ready
legacy C-extension dep
not yet ft-ready
effective concurrency mode
✅ free-threaded — full N-core parallelism

Illustrative dependency set — swap in your own stack. The mechanism (one unready C extension re-arms the GIL for the whole process) is the real, documented behavior; the specific chip labels are a stand-in for whatever’s in your requirements.txt.

Meanwhile, Ruby no opt-in required

YJIT ships on by default. There’s no ruby3.4t binary to remember to install, no C-extension registry to audit, no silent fallback — you either get the speed or you don’t, and you find out at benchmark time, not in production.

Rails just raised its own floor

Same week: This Week in Rails (Oct 2) bumped the minimum supported Ruby to 3.3.5 and deleted the decade-deprecated :controller/:action dynamic routing outright. No flag, no opt-in — Rails moves the whole ecosystem forward in one breaking commit instead of layering a parallel “fast mode” next to the old one.

Before you flip the switch

Two different philosophies, one practical checklist for whichever stack actually ships your next deploy.

# before python3.14t in prod
pytest -x                         # run the *whole* suite under python3.14t, not just cpython
pip list --format=freeze | xargs -n1 '' # audit every C-extension dep's ft status
# budget 5-10% baseline overhead even if nothing breaks

# before raising Copilot's review effort org-wide
curl -X PATCH .../copilot/review-settings -d '{"effort":"lite"}'  # pin it, don't inherit the new default
# ruby just needs: ruby -v

Tha-Shed

Type a brief, get a finished film. Characters, voices and music included.

Start creating