Every update Forge has shipped to this site, newest first — nightly SEO improvements, new trade pages, new town pages, and fixes. Same pipeline runs on every site we build.
'Cross-link each /trades entry to its matching /learn guide' was marked shipped 2026-09-04 (three variants), and the TRADE_GUIDES map in sites/forgelongisland/src/app/trades/[slug]/page.tsx does exist. But the 2026-09-14 crawl proves the two most obvious matches are missing: /trades/hvac-long-island's Further Reading lists only 'Phantom phone line vs. Google Ads' and the 90-day playbook — not /learn/seo-for-hvac-companies-long-island, which is the site's best-ranked commercial page (pos 3.08, 38 impressions, 'long island hvac seo' at pos 2.6 on 33 impressions). /trades/roofer-long-island lists only the 90-day playbook — not /learn/lead-generation-for-roofers-long-island (pos 4.5). The previous ship did not cover these entries. Add { href: '/learn/seo-for-hvac-companies-long-island', label…
Live metaDescription on /trades is 'Forge builds websites and runs phantom phone lines for Long Island service trades — electricians, plumbers, HVAC, landscapers, handymen. Nightly SEO + exclusive lead capture.' — 174 characters, so Google cuts it around 155 and the 'exclusive lead capture' close never shows. /trades draws 7 impressions at position 13.1 with 0 clicks in 28 days. Replacement is 155 chars, keeps every trade name, and front-loads 'Web design + phantom phone lines'. No /trades meta item appears in recentlyShipped.
The live homepage metaDescription runs 211 characters: 'Forge builds custom websites for Long Island service businesses in a week, then keeps shipping SEO and improvements every night. Or rent an exclusive phone line that rings your shop. No contract — Nassau & Suffolk.' Google cuts around 155, so the searcher never sees the phone-line offer or 'Nassau & Suffolk'. The homepage draws 13 impressions at position 8.85 with 0 clicks in 28 days — it is the best-ranked commercial surface on the property and its snippet is being cut mid-sentence. Replacement is 144 chars and leads with the exact 'Long Island web design' phrase.
The Huntington title already carries 'Website Design Company', but the description does not, and it is the description that carries the matched phrase into the snippet body. Live metaDescription is 'Web design shop headquartered in Huntington, NY 11743. Custom sites for Huntington Station, Cold Spring Harbor, Northport and Melville — built in a week.' GSC shows 'website design company huntington' at pos 31.6 (19 impressions), 'website design company in huntington' at pos 18.2 (11 impressions), and 'web developer huntington town ny' at pos 64.9 (15 impressions) — none of those exact phrases appear in the description. The replacement stays under the 155-char budget the file's own comment sets.
The Smithtown title retitle landed, but the description did not follow it. Live metaDescription is 'Forge is a Huntington, NY web design shop building sites for Smithtown, St. James, Kings Park, and Hauppauge — live in a week, improved nightly.' — no SEO phrase, no 'web designer'. Meanwhile the page ranks pos 19.2 for 'smithtown seo company' (33 impressions), pos 15.4 for 'search engine optimization smithtown', and pos 11.5 for 'smithtown web designer', all at 0% CTR. The snippet the searcher reads never repeats the phrase they typed.
GSC shows 'seo company babylon' at position 20.9 on 11 impressions and 'search engine optimization north babylon' at position 49, but the live title is 'Web Design Babylon NY — Website Design Company | Forge' — no SEO phrase anywhere in it. The identical retitle already landed on the Smithtown page (live title verified as 'Smithtown Web Design + SEO Company — Smithtown, NY | Forge'), so this mirrors a pattern already shipped on a sibling page rather than repeating it. New title is 54 chars with the brand token, so nothing truncates.
The title truncation fix shipped and worked: /learn/seo-for-hvac-companies-long-island now serves 'Long Island HVAC SEO: What Ranks and What It Costs | Forge' (58 chars). Position improved to 2.82 for 'long island hvac seo' on 34 impressions, and the page itself sits at pos 3.13 on 38 impressions — still 0 clicks. Title length is no longer the constraint; the description is. The current one runs 172 characters ('What SEO actually moves the needle for Long Island HVAC companies — Nassau/Suffolk local pack rankings, seasonal keyword timing, review volume, and realistic budget ranges.') and truncates around 155, cutting the budget figure that carries the click. Replace with a ≤155-char version that leads with the dollar range.
Shipped 2026-09-04 as 'Retitle /web-design-smithtown-ny to carry the SEO and web designer phrasing it already ranks for', but the 2026-09-06 crawl of the page (200) still shows title 'Web Design Smithtown NY — Website Design Company | Forge' — no 'SEO', no 'designer'. The previous fix did not land. The page's strongest queries are SEO queries it does not name: 'smithtown seo company' 30 impressions at pos 19.7, 'search engine optimization smithtown' 7 at pos 15.4, 'search engine optimization company smithtown' 3 at pos 26.3, plus 'smithtown web designer' 12 at pos 11.5. Set the title to 'Smithtown Web Design + SEO Company — Smithtown, NY | Forge' (57 chars).
The 28-day GA4 eventCounts contain only session_start (113), page_view (111), first_visit (110), user_engagement (26) and scroll (11). There is no form_submit, no generate_lead, and no tel: click event, so ga4.conversions is 0 by construction. Every crawled page carries a (631) 651-0722 CTA and /start renders a full 8-field work-order form, yet neither is measured. Until these fire, no proposal on this property can be judged on outcome — only on impressions.
'Add Article schema dateModified refresh + author Person to the 17 /learn guides' is marked shipped 2026-09-04, but the 2026-09-05 crawl of both sampled guides still shows author as {"@type":"Organization","name":"Forge of Long Island"} — the previous fix did not land. The site already publishes a Person node at https://www.forgelongisland.com/#founder ('Nick', jobTitle Founder) in the sitewide @graph, so the change is a one-line reference: author: {"@id":"https://www.forgelongisland.com/#founder"}. Named human authorship is the cheapest E-E-A-T and AI-citability signal available for a 17-guide library that currently ranks pos 3-10 across the board with 1 click in 28 days.
The crawled body renders the literal string 'PR #https://github.com/WebtasticLLC/Forge/commit/ef00922344fff7417fb1b9b31825ddf59478b0fa' — a full commit URL pasted into a 'PR #' label. Separately, every visible entry is dated 'September 4, 2026' even though the underlying items shipped between 2026-07-10 and 2026-09-04; the ledger is stamping the deploy date rather than the item's ship date, so a page selling nightly cadence shows 25 changes on one day and nothing on any other. Render the label as a short SHA linked to the commit, and use each item's own shippedAt for the date heading.
The 2026-08-30 run crawled 0 pages for every one of the 8 properties, yet still finished with exit 0 and touched both success heartbeats (tools/analyzer/nightly.success and ~/ObsidianVault/90-Meta/state/nightly-analyze.success, both stamped Aug 30 05:08). The deadman watcher therefore read the night as healthy while the analyzer was completely blind, and no Discord failure alert fired. That is why the outage survived into a second night. The crawl catch block should record how many of the configured topPaths returned ok=true; if that count is 0 for a property with topPaths configured, the run should exit non-zero so send_failure_alert fires and the heartbeat files are not touched. Partial failures (some pages 200, some not) should stay non-fatal as they are today.
The 2026-08-30 and 2026-08-31 runs both crawled 0 of 16 configured topPaths. nightly.log line 9101 shows 'browserType.launch: Executable doesn't exist at ~/Library/Caches/ms-playwright/chromium_headless_shell-1223/chrome-headless-shell-mac-arm64/chrome-headless-shell', and that cache directory does not exist on the Mac at all — the browsers were never installed here or were cleared. All 8 properties failed identically, so this is a host problem, not a site problem. Until it is fixed, every nightly report is blind: no titles, meta descriptions, H1s, canonicals or JSON-LD to reason against, and every on-page finding gets suppressed. Adding an idempotent 'playwright install chromium' step before the analyzer run makes the nightly repair itself instead of silently degrading.
The 2026-08-30 run logged "[forgelongisland] crawl failed: browserType.launch: Executable doesn't exist at ~/Library/Caches/ms-playwright/chromium_headless_shell-1223/..." and crawl.pages came back empty, so the analyzer had zero on-page evidence (no titles, meta descriptions, h1s, canonicals or jsonLdBlocks) for all 16 registered topPaths. Playwright wipes its browser cache whenever the npm package bumps its browser build; nothing in run-nightly.sh reinstalls it. Until this is fixed every nightly run is GSC/GA4-only and cannot detect or verify a single on-page issue.
The crawl failure was caught, logged as one line, and the run continued to completion — POSTing proposals, alerts and an SEO score derived from GSC/GA4 only. Nothing in the Discord alert or the dashboard tells the operator that the on-page half of the evidence was missing, so a night of degraded output looks identical to a healthy night. The analyzer should mark the run degraded when crawl.pages.length === 0 while topPaths.length > 0, fire the existing send_failure_alert path, and skip meta/schema/copy proposals for that property rather than letting the model guess at page state.
Shipped 2026-07-05 ('Rebind GA4 key event to generate_lead + phone_click'), and twice before that as generate_lead audits — but the 2026-08-03 GA4 pull still shows eventCounts = {page_view 34, session_start 21, first_visit 14, user_engagement 6, scroll 5} and conversions 0. There is no generate_lead, no form_submit, no phone/tel click event anywhere. The previous fixes did not land. Every crawled page carries a (631) 651-0722 CTA and /start carries the full work-order form, so the tracking surface exists; the events do not. Until this is closed, no ranking or copy change on this property can be evaluated.
GA4 reports conversions: 0 over 28 days, and the eventCounts object contains only page_view, session_start, first_visit, user_engagement and scroll. There is no form_submit, no click, no generate_lead — meaning the /start work-order form and the phone-tap CTAs emit nothing measurable. With 3 sessions on /start and 2 on /phantom-phone-line this month the absolute numbers are small, but the pipeline is blind: there is currently no way to tell a zero-lead month from an untracked one, which also makes every future SEO change unattributable.
The homepage runs a 'What shipped this week' section and its LocalBusiness/hero claims '168 PRs opened by AI' and '500+ updates shipped'. But the /changelog bodyExcerpt lists only 5 static entries dated April–June 2025 (newest: 'June 1, 2025 — Core Web Vitals pass'). A visitor cross-checking the 'we ship every night' proof point sees a 13-month-old ledger, which reads as abandoned and undercuts the core pitch. Wire the changelog to the actual auto-ship/PR feed so recent nightly ships render with 2026 dates.
Every page's footer (same template across all 6 crawled pages) lists 'Changelog' under the Product column, linking to /changelog. That page renders only 'The ledger couldn't be generated on this deploy — the pipeline is still shipping nightly.' as its body content — a visible generation failure, not a placeholder. The page also carries `<meta name="robots" content="noindex, follow">`, which keeps it out of search results but does nothing to hide the broken experience from users who click the footer link. Either the pipeline error needs to be resolved so the changelog renders, or the footer link should be removed until it does.
The /changelog page emits <link rel="canonical" href="https://www.forgelongisland.com"/> instead of https://www.forgelongisland.com/changelog. It also inherits the homepage title ('Forge of Long Island — Web design for Long Island service businesses') and homepage description verbatim. Google will treat /changelog as a duplicate of the home page and consolidate any link equity there rather than indexing the changelog on its own URL.
/changelog carries `<meta name="robots" content="noindex, follow"/>` while every page's footer lists it under the Product section alongside Build & ship, Phone line, and Pricing. The page currently renders a placeholder ('The ledger couldn't be generated on this deploy'), so the noindex may be intentionally temporary — but as long as it persists, Google will never index or surface the changelog as a trust/authority signal, even after the pipeline starts producing real content.
The primary navigation is identical across all 6 pages (Build → /#build, Phone line → /phantom-phone-line, Pricing → /#pricing, Work → /work, Learn → /learn) and includes no link to /changelog. The footer HTML was truncated in all crawled pages so a footer link cannot be confirmed or ruled out, but /changelog does not appear in any visible internal link across the other 5 pages. A publicly indexed, changelog-schema-marked page with no inbound nav link accumulates no internal PageRank and is practically invisible to visitors.
The changelog is the site's proof asset for the core promise ('websites that ship every night', '500+ updates shipped'), and its own ItemList declares numberOfItems 8 with the most recent entry dated July 5, 2026 — 25 days stale as of this crawl. Every crawled page's footer simultaneously renders 'last shipped 4h ago'. A visitor who clicks through from the homepage's 'What shipped this week.' section finds nothing from this month, which actively contradicts the pitch. GSC also shows /changelog earning impressions at avg position 5, so it is being seen.
GSC shows 'long island hvac seo' at position 3.69 with 16 impressions and 0 clicks, and /learn/seo-for-hvac-companies-long-island at position 7.88 on 17 impressions, 0 clicks — the single best-ranking commercial query on the property is converting nothing. The current title is 'SEO for HVAC Companies on Long Island — What Actually Ranks and What It Costs' (84 chars before ' | Forge' is appended), so Google truncates it well before the geo term and the searcher's phrase never appears in the snippet head. Leading with the matched phrase is the cheapest available CTR lever on the site.
The query 'long island hvac seo' sits at position 3.69 with 16 impressions and 0 clicks; the page itself shows 17 impressions at position 7.88, also 0 clicks. This is the site's best-ranked commercial query and it converts nothing. The current title is 'SEO for HVAC Companies on Long Island — What Actually Ranks and What It Costs | Forge' (84 chars) — Google truncates around 60, so the searcher sees the least-matching half. Rewriting to 'HVAC SEO on Long Island — What Ranks and What It Costs' (54 chars) puts the exact query head first. Note: frontmatter `title` in sites/forgelongisland/src/content/learn/seo-for-hvac-companies-long-island.md drives both the <title> and the rendered H1, so the H1 changes with it.