Add domain skills: youtube/upload, dev-to/publish, google-search-console/check#476
Add domain skills: youtube/upload, dev-to/publish, google-search-console/check#476engmsaleh wants to merge 4 commits into
Conversation
Step-by-step browser-harness flow for publishing to YouTube via Studio: Create->Upload videos, file via DOM.setFileInputFiles (last input), contenteditable #textbox title/desc, 'Made for Kids' curly-quote gotcha, coordinate-click visibility radios, Publish confirmation. Captured 2026-06-28 while publishing the Skilly Builders demo.
✅ Skill review passedReviewed 3 file(s) — no findings. |
There was a problem hiding this comment.
1 issue found across 1 file
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
DEV.to markdown-editor publish flow: front-matter+body in one textarea via React-safe native setter, published flag for draft/live, Save-changes-publishes, and the 'Invalid authenticity token' CSRF gotcha (reload to refresh). Captured 2026-06-28 cross-posting the Skilly Realtime-API article. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
3 issues found across 1 file (changes from recent commits).
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
…match video by title Fixes flagged by the automated reviewer (cubic) on PR browser-use#476: (1) move devto/publish.md into the existing dev-to/ dir (+ cross-ref scraping.md); (2) quote YAML front-matter scalars to survive colons/# in title/description; (3) add missing 'import json' to the snippet; (4) youtube/upload existing-video check now matches by title across the full Content list instead of trusting the latest dashboard card. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Thanks — all four issues identified by cubic are fixed in
(Skill review bot was already green.) |
There was a problem hiding this comment.
3 issues found across 2 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="domain-skills/youtube/upload.md">
<violation number="1" location="domain-skills/youtube/upload.md:7">
P2: Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.</violation>
<violation number="2" location="domain-skills/youtube/upload.md:7">
P2: Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.</violation>
</file>
<file name="domain-skills/dev-to/publish.md">
<violation number="1" location="domain-skills/dev-to/publish.md:25">
P2: Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
|
|
||
| ## Pre-flight | ||
| - User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio". | ||
| - **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video. |
There was a problem hiding this comment.
P2: Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/youtube/upload.md, line 7:
<comment>Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.</comment>
<file context>
@@ -4,7 +4,7 @@ Driving `studio.youtube.com` with browser-harness against the user's logged-in C
## Pre-flight
- User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
-- **Check for an existing video first.** The channel dashboard "Latest video performance" card shows the most recent upload — don't create a duplicate. To reuse an existing video's URL instead of uploading: go to `.../videos/upload`, scrape `a[href*="/video/"]` → `/video/(<id>)/` and build `https://youtu.be/<id>`.
+- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.
- Have the absolute path to the local `.mp4` ready.
</file context>
|
|
||
| ## Pre-flight | ||
| - User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio". | ||
| - **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video. |
There was a problem hiding this comment.
P2: Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/youtube/upload.md, line 7:
<comment>Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.</comment>
<file context>
@@ -4,7 +4,7 @@ Driving `studio.youtube.com` with browser-harness against the user's logged-in C
## Pre-flight
- User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
-- **Check for an existing video first.** The channel dashboard "Latest video performance" card shows the most recent upload — don't create a duplicate. To reuse an existing video's URL instead of uploading: go to `.../videos/upload`, scrape `a[href*="/video/"]` → `/video/(<id>)/` and build `https://youtu.be/<id>`.
+- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.
- Have the absolute path to the local `.mp4` ready.
</file context>
|
|
||
| <markdown body> | ||
| ``` | ||
| Quote any user-supplied scalar (title/description/canonical_url). dev.to's front matter is YAML, so an unquoted value containing `:` or a leading `#` will fail the parse or be misread, and the publish silently breaks. |
There was a problem hiding this comment.
P2: Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/dev-to/publish.md, line 25:
<comment>Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.</comment>
<file context>
@@ -11,21 +13,23 @@ Driving `dev.to/new` with browser-harness against the user's logged-in Chrome. D
<markdown body>
+Quote any user-supplied scalar (title/description/canonical_url). dev.to's front matter is YAML, so an unquoted value containing : or a leading # will fail the parse or be misread, and the publish silently breaks.
- YouTube / Tweet embeds: liquid tag on its own line —
{% embed https://youtu.be/<id> %}. - Body links are normal markdown
[text](https://...)and render dofollow.
</file context>
</details>
```suggestion
Quote any user-supplied scalar (title/description/canonical_url) and YAML-escape it inside the quotes — escape embedded double quotes (`"`) as `\"` and backslashes (`\`) as `\\`. dev.to's front matter is YAML, so an unquoted value containing `:` or a leading `#`, or an improperly escaped quoted value, will fail the parse or be misread, and the publish silently breaks. Prefer generating the front matter with a YAML library to avoid hand-escaping.
Browser-harness flow for GSC: sitemap submit (domain-property full-URL gotcha + two-input targeting), Pages indexing report, URL inspection, Performance — plus how to read 'Discovered – currently not indexed' (authority/crawl-budget, not a bug). Captured 2026-06-29 submitting the tryskilly.app sitemap + reading the indexing report. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
2 issues found across 1 file (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="domain-skills/google-search-console/check.md">
<violation number="1" location="domain-skills/google-search-console/check.md:35">
P2: The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.</violation>
<violation number="2" location="domain-skills/google-search-console/check.md:42">
P2: The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
| - Impressions / clicks / avg position / top queries. Early-stage sites show little — that's expected. | ||
|
|
||
| ## Interpreting "not indexed" reasons | ||
| - **"Discovered – currently not indexed"** → Google found the URL (via sitemap/links) but deprioritized crawling it. This is a **domain-authority / crawl-budget** signal, NOT a technical error. Fix: earn backlinks, strengthen internal linking (hub→spoke), Request-Indexing the key pages, and wait. If most pages sit here, **do not mass-generate more pages** — they'll pile up unindexed; raise authority first. |
There was a problem hiding this comment.
P2: The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/google-search-console/check.md, line 35:
<comment>The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.</comment>
<file context>
@@ -0,0 +1,42 @@
+- Impressions / clicks / avg position / top queries. Early-stage sites show little — that's expected.
+
+## Interpreting "not indexed" reasons
+- **"Discovered – currently not indexed"** → Google found the URL (via sitemap/links) but deprioritized crawling it. This is a **domain-authority / crawl-budget** signal, NOT a technical error. Fix: earn backlinks, strengthen internal linking (hub→spoke), Request-Indexing the key pages, and wait. If most pages sit here, **do not mass-generate more pages** — they'll pile up unindexed; raise authority first.
+- **"Crawled – currently not indexed"** → crawled but judged low-value/thin/duplicate. Improve content quality/uniqueness.
+- **"Page with redirect"** → usually benign (trailing-slash or http→https canonicalization); the redirect target is the indexed URL.
</file context>
| - **"Not found (404)"** → a referenced URL is broken; find + fix or remove the reference. | ||
|
|
||
| ## Why no API | ||
| GSC has a Search Console API (sitemaps, URL inspection, search analytics) but it needs a **service account added to the property** or an **OAuth client** — neither is set up here (a prior attempt stalled on service-account propagation). Until that's configured, this browser flow is the way. If you do set it up, the `searchconsole.googleapis.com` URL-inspection + `webmasters` sitemaps endpoints replace steps 1–3. |
There was a problem hiding this comment.
P2: The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/google-search-console/check.md, line 42:
<comment>The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).</comment>
<file context>
@@ -0,0 +1,42 @@
+- **"Not found (404)"** → a referenced URL is broken; find + fix or remove the reference.
+
+## Why no API
+GSC has a Search Console API (sitemaps, URL inspection, search analytics) but it needs a **service account added to the property** or an **OAuth client** — neither is set up here (a prior attempt stalled on service-account propagation). Until that's configured, this browser flow is the way. If you do set it up, the `searchconsole.googleapis.com` URL-inspection + `webmasters` sitemaps endpoints replace steps 1–3.
</file context>
Adds
domain-skills/youtube/upload.md— a battle-tested browser-harness flow for publishing a video to YouTube via Studio.Captured end-to-end while actually publishing a video, so it documents the real selectors + the non-obvious traps:
DOM.setFileInputFiles(use the lastinput[type=file])#textboxdivs (not inputs)No, it's not 'Made for Kids') — loose-match it; it's required before Nextcss = displayed × 0.96)Follows the existing
tiktok/upload.mdpattern. No secrets; the one example video URL is a public launch demo.🤖 Generated with Claude Code
Summary by cubic
Adds battle‑tested domain skills for
youtube/upload,dev-to/publish, andgoogle-search-console/checkthat map reliable publish and indexing flows for browser‑harness. Enables first‑try YouTube uploads, instant DEV.to cross‑posts with dofollow links, and quick GSC sitemap submits + index checks, with safer duplicate checks and stronger YAML handling.domain-skills/youtube/upload.md: Create → Upload; set file viaDOM.setFileInputFiles(last input); edit contenteditable#textbox; coord‑click visibility; capture immediateyoutu.belink. Duplicate check now matches by title across the full Content list; notes: curly‑quoted Kids label, 2× retina coord conversion.domain-skills/dev-to/publish.md: YAML front matter + body in one textarea; set via native setter and fire input/change; Save changes publishes whenpublished: true. Quote YAML scalars (title/description/canonical_url), includeimport json, and reload/re‑insert on CSRF “Invalid authenticity token”.domain-skills/google-search-console/check.md: Submit sitemap and check indexing via GSC. Domain properties require the full URL (https://<domain>/sitemap-index.xml) and targeting the sitemap card input (two‑input gotcha); read Pages “Why pages aren’t indexed,” and use URL Inspection + Request indexing (reports lag).Written for commit 6f99dc8. Summary will update on new commits.