From 40d2b866dd48c3831ec050491f264c31ca5ed08f Mon Sep 17 00:00:00 2001 From: ejaz Date: Wed, 13 May 2026 23:26:45 +1000 Subject: [PATCH] docs(audit): roll up Phase C batch 2 (#77-#84) + portal-sweep follow-ups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cadence rollup for the Phase C HIGH batch 2 round. No code/runtime changes — audit-doc only. Updates: - Rows #4, #5, #6, #8 (§3 cross-cutting HIGHs): annotate Shipped in #81, #80, #79, #82 with the actual approach taken on each. - Row #16 (MED, JSON-LD personal twitter handle): Shipped in #78. - §20c (industry-page portal opt-out): 5 of 10 missing entries marked Resolved by #83 as intentional design call; the comment block in lib/marketing/background-media.ts is now the source of truth. - §20d (oversized portal JPEGs): record what #84 actually shipped (3 portrait recompresses) and what it didn't (4 landscapes that re-encoded larger). Lesson captured: aspirational ≤180 KB target only applies when the source is over-dimensioned. - New §19a section indexing the batch 2 PR list (#77-#84) and explicitly recording the severity-ordering self-catch where #78 (MED) shipped before §3 HIGHs, with course-correction. Co-Authored-By: Claude Opus 4.7 --- docs/audit/2026-05-13-marketing-audit.md | 113 +++++++++++++++-------- 1 file changed, 75 insertions(+), 38 deletions(-) diff --git a/docs/audit/2026-05-13-marketing-audit.md b/docs/audit/2026-05-13-marketing-audit.md index 38e6bdd4b..0fe8a5c70 100644 --- a/docs/audit/2026-05-13-marketing-audit.md +++ b/docs/audit/2026-05-13-marketing-audit.md @@ -109,11 +109,11 @@ Headline issues (by impact): | 1 | CRIT | `sitemap.xml`, `robots.txt`, JSON-LD on every page | A `SITE_URL` (or equivalent) constant is built with a trailing newline. Raw bytes of `` are `https://www.formaos.com.au\n/about`. `robots.txt` has `Sitemap: https://www.formaos.com.au\n/sitemap.xml`. Home JSON-LD: `"url":"https://www.formaos.com.au\n","logo":"https://www.formaos.com.au\n/og-image.png"`. Confirmed via `xxd` and grep across all 85 pages. **Shipped in #67** — `.trim()` at `config/brand.ts:siteUrl/appUrl`, one fix for sitemap+robots+JSON-LD. | Locate the constant (likely env var `NEXT_PUBLIC_SITE_URL` or a template literal in `lib/seo` / `app/sitemap.ts` / `app/robots.ts`); strip trailing whitespace at consumption or trim at the source. One fix corrects sitemap, robots, and all JSON-LD simultaneously. | | 2 | CRIT | `/status` | "All systems operational" banner with `0%` 7-day uptime, `0` 24h uptime, `0` 7-day checks, "No recent check data available". Monitoring data isn't reaching the page. **Shipped in #68** — page deleted, sitemap entry removed, footer pulse pill removed, 307 redirect added, four trust-page references and the /legal index card all stripped. The cron + public-uptime data pipeline + DB tables were intentionally left in place per directive (used by `app/api/trust-packet/vendor`). | Either gate the green badge on real data, or surface "monitoring data unavailable" honestly. Procurement teams screenshot this. | | 3 | HIGH | Every page footer + every JSON-LD block | Two contradictory identities on the same 82 pages: footer mailto `Formaos.team@gmail.com` (Gmail) vs JSON-LD `contactPoint.email: support@formaos.com.au`. JSON-LD says `addressLocality: Adelaide, addressRegion: SA`; visible footer + contact page say "Sydney, Australia". **Shipped in #70** — `config/brand.ts` now holds canonical `contactEmail` + `address`; Footer reads from there; 9 other marketing files had the Gmail literal replaced with `support@formaos.com.au`. | Pick one address + one contact email; mirror across visible copy and JSON-LD. The Gmail address on the visible side is the trust-side risk — a Gmail support address for a SOC 2 / ISO-claiming platform is a red flag in vendor-assurance reviews. | -| 4 | HIGH | `/security`, `/trust`, all industry pages | 18+ frameworks listed (SOC 2, ISO 27001, GDPR, HIPAA, PCI-DSS, NIST CSF, CIS Controls, etc.) with no certification-status qualifier — no "certified", "in progress", "supported", or "ready" anywhere on the public surface. Enterprise buyers reading "SOC 2" assume Type II certification. | Add a single status taxonomy ("Certified" / "Audit-ready" / "Supported framework") and apply it everywhere a framework name appears in trust context. | -| 5 | HIGH | 67 of 85 pages | Two `

` elements rendered per page with different Tailwind class signatures (`text-[2.35rem] ...` and `text-[2.5rem] ...`). Most visible on `/contact` and `/blog` where both `

`s carry the same text. Looks like the marketing layout's hero heading and the page-level heading both render as `h1`. A11y violation and SEO confusion. | Demote one to `h2` (probably the layout-level hero subtitle, or wrap it in a `role="banner"` block with `h1` only for the page-specific heading). | -| 6 | HIGH | `/features` | Hero claim says "18 features across compliance, automation, security, and collaboration." Category counts immediately below sum to 5+6+4+7+3 = **25**, not 18. | Fix the hero number or the category counts; they should match. | +| 4 | HIGH | `/security`, `/trust`, all industry pages | 18+ frameworks listed (SOC 2, ISO 27001, GDPR, HIPAA, PCI-DSS, NIST CSF, CIS Controls, etc.) with no certification-status qualifier — no "certified", "in progress", "supported", or "ready" anywhere on the public surface. Enterprise buyers reading "SOC 2" assume Type II certification. **Shipped in #81** — user decision: allowed labels are "Framework supported" / "In development" / "Custom"; disallowed without paper: "Certified", "Audited", "Compliant", "Accredited". Fixed ProductHeroVisual, FinalSecurityCTA, SecurityArchitecture, TrustModules, /trust/dpa. Demo dashboard mocks (sandbox/playground, /construction-compliance dashboard pills, /about DemoAuditTrailCard) kept their fictional state strings — flagged in the PR body for spot-check, not modified. | Add a single status taxonomy ("Certified" / "Audit-ready" / "Supported framework") and apply it everywhere a framework name appears in trust context. | +| 5 | HIGH | 67 of 85 pages | Two `

` elements rendered per page with different Tailwind class signatures (`text-[2.35rem] ...` and `text-[2.5rem] ...`). Most visible on `/contact` and `/blog` where both `

`s carry the same text. Looks like the marketing layout's hero heading and the page-level heading both render as `h1`. A11y violation and SEO confusion. **Shipped in #80** — removed the redundant `