Field Report 2026-07-25 ~4 min skim · ~8 min deep

The Feed That
Wouldn't Listen.

An autonomous agent walks into a signed-in browser session and tries to clean up a recommendation engine that has decided its user loves physics documentaries. Ninety minutes later: six lessons, one cascade discovery, and a deployable playbook.

6
Outliers removed
3
Channels dropped
9
Boost targets saved
100
Videos audited
01

The ask, as posed

Five seconds of reading. A Sunday-evening prompt in plain English:

"Go to my feed. Analyze the outlier recommendations. Lots of one specific topic I never asked for. Hit not interested or don't recommend channel." — the opening instruction

What could go wrong?

As it turns out: the next ninety minutes would touch signed-in browser sessions, anti-automation walls, two competing frameworks, the topic-graph internals of a recommender system, and a surprise about how dismissal actually works.

02

Act One — picking the wrong tool

The choice every browser-automation task starts with: which framework drives the session?

First pick
chrome-devtools MCP
Talks directly to Chrome's DevTools Protocol. Fast, official, stateful. Seemed like the right call.
Should have been
Playwright MCP
Persistent profile support. Survives between sessions. The unlock we'd discover in Act Two.

chrome-devtools loaded the session signed-out — the persistent profile had lost its auth cookie. No problem, I thought, the user will just sign in again. Then this:

# Google's anti-automation wall
Couldn't sign you in.
This browser or app may not be secure.
Try using a different browser.
Mistake compounded I saw signed-out state on one tab and started closing things — without checking whether another tab held the live session. The user, watching this, had a reasonable question.
"What the fuck are you doing? I was able to use this to sign in. You checked my Gmail and everything." — the user, correctly frustrated
techniqueHow the reset was done safely

The constraint: the user's real Chrome was also running — 26 processes, real tabs, real work. Killing "everything Chrome" would have been a disaster.

The fix: filter by the user-data-dir flag that every Chrome process carries. MCP-controlled Chrome runs against a sandboxed profile; the user's real Chrome runs against their default.

# MCP-controlled Chrome (safe to kill)
49122  9253  6246  4758  3986  92791

# User's real Chrome (do NOT touch)
33983  47389  27409  26621  ...26 more

Six PIDs killed, twenty-six left alone. MCP servers themselves had also crashed — those needed a manual restart from the user's side.

04

Act Three — the cleanup

With a signed-in session, the actual work began. Feed is virtualized — videos outside the viewport leave the DOM — so a single snapshot wouldn't catch everything.

patternProgressive scroll + keyword harvest
for (let i = 0; i < 40; i++) {
  const found = await page.evaluate((t) => {
    const m = [...document.querySelectorAll('h3, a#video-title')]
      .find(el => el.textContent.includes(t));
    if (m) { m.scrollIntoView({block:'center'}); return true; }
    return false;
  }, target);
  if (found) break;
  await page.evaluate(() => window.scrollBy(0, innerHeight * 0.7));
}

The sweep turned up six physics videos in two clusters: Brian Cox quantum explainers (Big Think, Cleo Abram) and neutron-star astrophysics (Kurzgesagt, History of the Universe, Progress Science Docs, Orbital Dreams).

I opened the kebab on the first one and clicked Not interested.

Something unexpected happened.

The cascade discovery

Refreshing the feed, three more physics videos were gone — none of them clicked. Big Think's Brian Cox piece. Progress Science Docs. Orbital Dreams. All vanished.

The recommender's secret "Not interested" isn't a per-video veto. It's a topic vote. YouTube treats one click as a signal against the entire semantic cluster — topic, format, channel's adjacent content. The whole cohort gets pulled.
A single "Not interested" isn't a per-video veto. It's a topic vote, and the algorithm listens.
practicalWhat this means for cleaning any feed

You don't need to dismiss every offending video. You need to dismiss one or two representatives of each unwanted topic cluster, and the recommender cascades the rest.

Six videos would have taken six kebab clicks and six menu selections. Two clicks achieved the same result. The recommender did the other four for free.

05

Act Four — the audit

Physics gone. Next question: what's actually in this feed? Same scroll-and-harvest pattern, but capturing every video into a deduplicated Map. After ~80 scroll iterations with stability detection, the count settled at 100 unique videos.

31%
28%
9%
7%
25%
Software Dev (31) AI / LLMs (28) Electronics (9) Ethereum (7) Drop — noise (25)

Feed was already 75% on-target. Software Dev + AI dominate, as they should. Two things stood out:

Ethereum underweighted Only 7% of the feed, and four of those seven were Bankless podcast episodes leaning on subscriptions — not fresh builder content.
Real noise in the drop bucket Macro-finance (Prof G Markets, Plain Bagel, Wall Street Millennial), geopolitics (TLDR News Global + EU), movie trailers (Warner Bros. pushing The End of Oak Street).
06

Act Five — the boost

Not just removing noise — actively re-biasing toward Ethereum development. The user wanted latest stuff: current EIPs, current rollup architecture, current builder ecosystem.

researchWhat "latest" means in mid-2026

A WebSearch on Ethereum dev news surfaced the live roadmap:

  • Glamsterdam hard fork (mid-2026) — higher throughput, tighter L2 integration
  • EIP-7702 account abstraction — shipping in Pectra, the dev community is actively implementing
  • Based rollups — gaining traction as the next L2 architecture
  • Circle UTS — rollup-bridging fix

With those as search seeds, queried YouTube with its this-month only filter (sp=EgIIBA%3D%3D) and harvested top results.

Signal vs noise in the search results Raw results were polluted with price-prediction spam ("Tom Lee says ETH to $50,000!") and "Flash USDT smart contract" scam tutorials. The signal was in the long tail — small dev channels with single-digit subscribers doing real implementations.

Nine videos made the cut. Adding them to Watch Later required figuring out YouTube's playlist-dialog DOM:

codeThe DOM pattern that worked
// Open the playlist dialog
document.querySelector('button[aria-label="Save to playlist"]').click();

// Inside ytd-popup-container, click the Watch later label
const popup = document.querySelector('ytd-popup-container');
const label = [...popup.querySelectorAll('yt-formatted-string, span, div')]
  .find(el => el.textContent.trim().toLowerCase() === 'watch later');
label.click();

Three attempts to land on the right selector. The aria-label="Save to playlist" button + label-text-match inside ytd-popup-container was the stable combo.

All nine verified present. Each save is a positive interest signal — weaker than a watch-through but stronger than a search.

07

The drops that didn't quite land

While the boost was clean, the drop side hit a hard architectural constraint.

Channel-level dismissal is home-feed-only "Don't recommend channel" appears only on the home feed's kebab menu. Not on channel pages. Not in search results. You can only dismiss a channel when one of its videos surfaces organically.

Of seven drop targets, four were currently surfaced and got dismissed:

DISMISSED
TLDR News Global → Don't recommend channel
Also kills TLDR News EU and TLDR News US — the family shares an interest graph.
DISMISSED
Wall Street Millennial → Don't recommend channel
Macro-finance noise, recurring.
DISMISSED
The Friday Checkout → Not interested
Mixed tech-news channel — softer action to preserve non-noise content.
MISSED
Prof G Markets
Rotated off the feed between identification and dismissal — nothing to click.

Three more (Plain Bagel, More Perfect Union, ABC News) weren't being surfaced at all during the session. They'll need to be caught next time they appear.

08

Five lessons that generalized

  1. Pick Playwright first. Persistent profile support means signed-in state survives across sessions. chrome-devtools MCP desyncs under load and trips Google's anti-automation heuristic more often. Cost of picking wrong: a 25-minute detour.
  2. "Not interested" is a topic signal, not a video signal. One click can pull three or four related videos off the feed. Don't dismiss every offender — pick one representative per cluster and let the cascade do the rest.
  3. Channel dismissal only works on the home feed kebab. Channel pages and search results don't expose it. Plan your dismissal list around what's currently surfaced.
  4. Virtualized feeds hate naive selectors. Videos outside the viewport are removed from the DOM. Always scrollIntoView({block:'center'}) before reading or clicking.
  5. Two-phase work prevents footguns. Report first (here's what I'd do), confirm, then act. Without that gate, a single bad selector could mass-dismiss the wrong videos before anyone notices.
09

The toolkit, plainly

Every action across ninety minutes was driven by one of four tools. No scripts on the user's machine, no browser extensions, no API keys handed over.

Browser automation
Playwright MCP
Persistent profile held the signed-in session. browser_run_code_unsafe + page.evaluate() became the workhorse.
Process control
Bash
Surgically killed 6 MCP Chrome PIDs, preserved user's 26 real Chrome PIDs. Filtered by user-data-dir.
Topic research
WebSearch
Pulled mid-2026 ETH roadmap so boost targets were actually current. Five searches, three minutes.
Hosting
Cloudflare Pages
Single-file direct upload via wrangler pages deploy. Live in under two seconds.
10

The full session, condensed

T+0:00
Wrong tool, lost session
chrome-devtools MCP loaded signed-out. Google blocked re-auth. Closed tabs without checking other sessions.
T+0:18
Hard reset, surgical kill
Filtered by user-data-dir. Killed 6 MCP PIDs, preserved 26 real Chrome PIDs.
T+0:25
Playwright swap, instant recovery
User: "Use playwright." Persistent profile still held valid auth. Live feed rendered.
T+0:32
Physics cleanup + cascade discovery
Six outliers identified. Two clicks dismissed; four cascaded off as topic votes.
T+0:52
100-video categorical audit
Progressive-scroll harvest with dedupe Map. Five buckets. 75% on-target.
T+1:14
Ethereum research + boost targets
WebSearch for current roadmap. Filtered spam. Nine videos selected.
T+1:22
Drops + Watch Later additions
Three channels dropped. Nine videos saved. All verified.