• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

amacgregor / amgr_phx / 0e69e694d2567a56ff686aab301e726b3ed4f17a
41%

Build:
DEFAULT BRANCH: main
Ran 25 Aug 2026 02:47PM UTC
Jobs 1
Files 79
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

25 Aug 2026 02:43PM UTC coverage: 33.682% (+0.7%) from 32.959%
0e69e694d2567a56ff686aab301e726b3ed4f17a

push

github

amacgregor
Fix P1 and P2 SEO and LLM-discoverability findings

Seven findings from priv/seo-audit-2026-08.md, each verified against a
rendered response rather than assumed from source.

Titles. page_title was String.capitalize(page), so production served
"Services · Allan MacGregor" — 27 characters on the strongest field a page
has, naming neither the service nor the role. AmgrWeb.SEO.static_page_title/1
writes one per static page, and og:title reads the same string so the two
cannot drift.

llms.txt. /services and /about sat under "## Optional", which the llmstxt.org
spec defines as URLs to drop when a shorter context is needed. They now have
their own section, and /contact is listed for the first time.

Internal links. Three AI-agent posts pick up a disclosure note pointing at the
track that matches what the post describes, following the pattern the audits
already use. 94 posts carried one services link between them.

og:image. build_page/3 never called put_image, so /services, /posts, /about
and every tag page unfurled bare and fell back to twitter:card: summary. Page
cards resolve under cards/pages/ so a tag slug cannot inherit a post's card.

FAQPage. Four questions were already on the page in <details> markup with no
schema. Seven now, the three new ones phrased the way buyers ask, and both the
markup and the JSON-LD render from Amgr.Services.faqs/0 — Google requires them
to match, and a second copy of the answers would have drifted the way the track
descriptions already have.

Service.provider. It was a bare @id pointing at a node defined only on /about,
so a parser handed /services alone got a Service whose provider resolved to
nothing. The page now ships an @graph carrying the Person node. The @id is
unchanged, so /about and /services still describe one entity.

og:site_name. og:site_title is not an OpenGraph property and every consumer
dropped it.

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

29 of 33 new or added lines in 5 files covered. (87.88%)

547 of 1624 relevant lines covered (33.68%)

336.1 hits per line

Uncovered Changes

Lines Coverage ∆ File
4
60.0
-0.71% lib/amgr_web/seo/opengraph.ex
Jobs
ID Job ID Ran Files Coverage
1 0e69e694d2567a56ff686aab301e726b3ed4f17a.1 25 Aug 2026 02:47PM UTC 79
33.68
GitHub Action Run
Source Files on build 0e69e694d2567a56ff686aab301e726b3ed4f17a
  • Tree
  • List 79
  • Changed 5
  • Source Changed 0
  • Coverage Changed 5
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • 0e69e694 on github
  • Prev Build on main (#DE9779CD...)
  • Next Build on main (#B2DAC54B...)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc