tools/seo/refresh_loop.py, tools/seo/refresh_scan.py — Refresh/re-audit loop scanners present — that capability is Phase 3, not Phase 1; built ahead of spec.tools/research/citation_tracker.py, tools/research/gsc.py — AI-citation tracking and Google Search Console tooling — citation-into-brief is Phase 5; GSC verification is a Phase-1 op step but the tool is broader than the spec calls for in Phase 1.tools/publishers/upload_post.py, tools/publishers/sync_social.py — Distribution/syndication publishers exist — article syndication & video bridge are explicitly Phase 4 / out of Phase 1 scope.tools/research/instagram_competitors.py, tools/research/scrapecreators_ig.py, tools/research/ig_normalize.py — Instagram competitor research — no spec line in the content-engine MVP at all (belongs to the video/social product).tools/research/question_fanout.py, tools/research/entity_mapping.py, tools/research/winnability.py, tools/research/opportunity_score.py, tools/research/keyword_discover.py — Research toolset backing the brief stage — partially specced (brief-director composes them); listed for traceability, mostly legitimate Phase-1 support.pipeline_defs/*.yaml (animated-explainer, cinematic, avatar-spokesperson, clip-factory, etc.) + remotion-composer/ — The full OpenMontage video-production system — the host product the content engine is grafted onto; no Phase-1 content-spec line, acknowledged only as 'OpenMontage video base'.tools/analysis/plan_assessment.py, tools/analysis/virality_predictor.py — Content-plan scoring / virality gate for the video product — unrelated to the SEO article gates in this spec.| Capability | Phase | Status | Signals | Mapped code | Evidence |
|---|---|---|---|---|---|
| Rendering fix — serve designed page as a top-level document (de-iframe) · critical-path | 1 | Partial | dod fail | control-center/components/seo/feed/designed-page-frame.tsx, control-center/app/[...key]/page.tsx, control-center/components/seo/feed/iframe-auto-height.tsx, control-center/lib/seo-review-write.ts |
designed-page-frame.tsx:51-59 renders the page in a sandboxed iframe; [...key]/page.tsx:99 still uses DesignedPageFrame — the de-iframe rendering fix is not done |
| Deterministic page-gate checker wired to block promotion · the-work | 1 | Partial | dod fail | skills/pipelines/seo-article/references/aeo-page-spec.md, skills/pipelines/seo-article/design-director.md, control-center/lib/seo-review-write.ts |
seo-review-write.ts:74-82 promotes purely on status, ignoring the gate; the gate itself is an LLM checklist in aeo-page-spec.md + design-director.md:96 |
| Performance gate (Lighthouse / Core Web Vitals) | 1 | Not started | specced not built | — | grep for lighthouse/PageSpeed/CWV finds only aeo_audit.py marking TTFB unmeasurable and a label in seo-modal.tsx; no performance gate exists |
| Editorial voice + humanizer + reads-human gate | 1 | Not started | dod failspecced not built | skills/pipelines/seo-article/draft-director.md |
draft-director.md uses generic craft; no humanizer/voice/AI-signal gate code exists in tools/ or control-center/ |
| Deterministic article AEO audit gate (keep as-is) | 1 | Built | tools/analysis/aeo_audit.py, pipeline_defs/seo-article.yaml |
tools/analysis/aeo_audit.py is a fully deterministic (no-LLM) four-axis auditor wired as the required tool at the audit stage (seo-article.yaml:122-142) | |
| JSON-LD emission into the served document head | 1 | Partial | dod fail | skills/pipelines/seo-article/publish-director.md, control-center/app/[...key]/page.tsx |
publish-director.md:18 leaves author/date as TODO@publish; [...key]/page.tsx generateMetadata emits only title+canonical+robots |
| E8 knowledge base build + brief eat_block wiring · critical-path | 1 | Partial | dod fail | control-center/lib/kb/es.ts, control-center/app/admin/knowledge/page.tsx, control-center/lib/mcp/server.ts, skills/pipelines/seo-article/brief-director.md, tools/seo/site_seeds/e8-markets.json, tools/seo/build_site_pages.py |
KB infrastructure built (es.ts, MCP kb_* tools, /admin/knowledge, e8-markets seed) but content (author + proprietary data) is undelivered and lives on the gitignored PVC |
| Author entity pages (/author/<name>) + Person JSON-LD | 1 | Not started | specced not built | — | no /author route in control-center/app/; spec itself notes 'No author route exists today' |
| Real author photo (replacing CSS-initials avatar) | 1 | Not started | specced not built | — | no author-photo handling found; design author block is a name/bio text block only |
| OG / Twitter share image per article | 1 | Not started | specced not built | — | no openGraph/twitter image metadata and no og-image generation route found |
| Serve /llms.txt (and /llms-full.txt) for real | 1 | Stubbed | dod fail | skills/pipelines/seo-article/publish-director.md |
publish stage writes llms guidance text (publish-director.md:20) but no route serves /llms.txt |
| IndexNow ping on publish | 1 | Not started | specced not built | — | grep for indexnow/IndexNow returns nothing; approveDesign does no external indexing call |
| Search Console / Bing Webmaster verification + sitemap submission | 1 | Not started | dod failspecced not built | control-center/app/sitemap.xml/route.ts, tools/research/gsc.py |
sitemap.xml route present but no site-verification tokens; a gsc.py research tool exists (Phase 5-flavoured), not verification wiring |
| Per-host robots + near-free snippet directives | 1 | Partial | dod fail | control-center/app/robots.txt/route.ts, control-center/app/[...key]/page.tsx |
robots.txt/route.ts is per-host and correct, but the max-image-preview/max-snippet directives are not emitted anywhere |
| Canonical hygiene — one indexable document per article | 1 | Built | control-center/app/[...key]/page.tsx, control-center/app/page.tsx, control-center/lib/embed-host.ts |
[...key]/page.tsx:59-69 sets a single canonical and gates index on partner host + non-draft + non-hidden; tech domain stays noindex | |
| Collapse to one human approval (single-pause reconciliation) | 1 | Partial | dod fail | tools/seo/run_request.py, skills/pipelines/seo-article/brief-director.md, skills/pipelines/seo-article/publish-director.md, skills/pipelines/seo-article/design-director.md, control-center/lib/seo-review-write.ts |
runner enforces a single design-time pause (run_request.py:355-383) but brief-director.md:5/65 and publish-director.md:5 retain stale pause language the spec says to trim |
| Validation batch — one cluster of 10-15 assets generated & gated | 1 | Not started | dod failspecced not built | tools/research/keyword_prescreen.py, tools/seo/run_request.py, tools/research/topical_cluster.py |
generation tooling (run_request.py, keyword_prescreen.py, topical_cluster.py) exists but no validation cluster has been generated or approved; blocked on James's open decisions |
| Final manual interlink pass (close forward-only linking within the cluster) | 1 | Not started | dod failspecced not built | skills/pipelines/seo-article/publish-director.md, control-center/lib/published-pages.ts, tools/research/topical_cluster.py |
publish-director.md gates outbound cluster links (no orphans) but there is no backfill/relink; the manual pass is an unperformed operational step |
| Production go-live (one-time host/DNS/Helm plumbing) | 1 | Partial | dod fail | helm/envs/omni-cc-stage/omni-cc-app.yaml, tools/seo/build_site_pages.py, control-center/app/robots.txt/route.ts, control-center/app/sitemap.xml/route.ts |
helm omni-cc-app.yaml has staging host at ingressHosts[1] but no production host; build_site_pages.py exists but PVC build pending; staging is the rehearsal surface |
| Publishing model — engine generates and serves (no CMS hand-off) | 1 | Built | control-center/lib/seo-review-write.ts, control-center/lib/published-pages.ts, control-center/lib/embed-host.ts, control-center/components/seo/feed/feed-shell.tsx, control-center/app/page.tsx |
engine is system of record: approveDesign promotes & serves; host-scoped white-label feed exists — but delivery is still iframed (see rendering-fix) | |
| Shared token-driven design system (one design, layout composition only) | 1 | Built | dod fail | skills/pipelines/seo-article/references/e8-design-tokens.css, skills/pipelines/seo-article/references/section-catalog.md, skills/pipelines/seo-article/design-director.md |
e8-design-tokens.css ships the engine emerald-on-near-black theme as the single token source; section-catalog drives layout — but whether E8FN should be canonical is unresolved |
| Orchestrator rebuild (Python stage machine on raw Anthropic Messages API) | 2 | Not started | dod failspecced not built | tools/seo/run_request.py |
run_request.py is a single headless-claude subprocess runner; the Phase 2 orchestrator rebuild is not started |
| Orchestration Precision Monitor (8 invariants, CI conformance) | 2 | Not started | specced not built | — | no orchestration-precision-monitor code; this BCM register is a static-evidence stand-in, not the runtime OPM |
| Continuous engine — keyword clustering, scheduled loop, production feed, refresh, relink | 3 | Partial | dod fail | tools/seo/refresh_loop.py, tools/seo/refresh_scan.py, tools/research/topical_cluster.py, tools/research/keyword_discover.py |
refresh_loop.py/refresh_scan.py + clustering/discovery tools exist as early Phase-3 code but are not wired; marked Phase 3 by the spec |
| In-article media, article-to-video bridge, text-syndication, auto-publish | 4 | Not started | dod failspecced not built | tools/publishers/upload_post.py, tools/publishers/sync_social.py |
spec defers all media/video/syndication to Phase 4; only generic publisher tools exist (video product) |
| Authority — prop-firm comparison index, frameworks, citation-into-brief | 5 | Not started | dod failspecced not built | tools/research/citation_tracker.py |
Phase 5 capabilities not built; citation_tracker.py is early scaffolding |
| Compliance (Sentinel) — provenance, AII, legal-defensibility gate | 9 | Out of scope | dod fail | skills/pipelines/seo-article/brief-director.md |
spec defers Sentinel to Phase 9; seo_brief compliance block intentionally empty in Phase 1 |
# Build Conformance Digest — 2026-06-19 12:12 UTC **4 Built · 8 Partial · 1 Stubbed · 13 Not started · 1 Out of scope** against `mvp-scope-and-quality-gates.md` at `ca1b8b36f973` ## Movement - JSON-LD emission into the served document head moved Stubbed → Partial. - Per-host robots + near-free snippet directives moved Not started → Partial. - Production go-live (one-time host/DNS/Helm plumbing) moved Not started → Partial. ## Built, no spec line (scope check) - New: tools/seo/refresh_loop.py, tools/seo/refresh_scan.py with no spec line — scope check needed. Refresh/re-audit loop scanners present — that capability is Phase 3, not Phase 1; built ahead of spec. - New: tools/research/citation_tracker.py, tools/research/gsc.py with no spec line — scope check needed. AI-citation tracking and Google Search Console tooling — citation-into-brief is Phase 5; GSC verification is a Phase-1 op step but the tool is broader than the spec calls for in Phase 1. - New: tools/publishers/upload_post.py, tools/publishers/sync_social.py with no spec line — scope check needed. Distribution/syndication publishers exist — article syndication & video bridge are explicitly Phase 4 / out of Phase 1 scope. - New: tools/research/instagram_competitors.py, tools/research/scrapecreators_ig.py, tools/research/ig_normalize.py with no spec line — scope check needed. Instagram competitor research — no spec line in the content-engine MVP at all (belongs to the video/social product). - New: tools/research/question_fanout.py, tools/research/entity_mapping.py, tools/research/winnability.py, tools/research/opportunity_score.py, tools/research/keyword_discover.py with no spec line — scope check needed. Research toolset backing the brief stage — partially specced (brief-director composes them); listed for traceability, mostly legitimate Phase-1 support. - New: pipeline_defs/*.yaml (animated-explainer, cinematic, avatar-spokesperson, clip-factory, etc.) + remotion-composer/ with no spec line — scope check needed. The full OpenMontage video-production system — the host product the content engine is grafted onto; no Phase-1 content-spec line, acknowledged only as 'OpenMontage video base'. - New: tools/analysis/plan_assessment.py, tools/analysis/virality_predictor.py with no spec line — scope check needed. Content-plan scoring / virality gate for the video product — unrelated to the SEO article gates in this spec. ## Specced, not built (backlog) - Performance gate (Lighthouse / Core Web Vitals) still Not started (P1). - Editorial voice + humanizer + reads-human gate still Not started (P1). - Author entity pages (/author/<name>) + Person JSON-LD still Not started (P1). - Real author photo (replacing CSS-initials avatar) still Not started (P1). - OG / Twitter share image per article still Not started (P1). - IndexNow ping on publish still Not started (P1). - Search Console / Bing Webmaster verification + sitemap submission still Not started (P1). - Validation batch — one cluster of 10-15 assets generated & gated still Not started (P1). - Final manual interlink pass (close forward-only linking within the cluster) still Not started (P1). - Orchestrator rebuild (Python stage machine on raw Anthropic Messages API) still Not started (P2). - Orchestration Precision Monitor (8 invariants, CI conformance) still Not started (P2). - In-article media, article-to-video bridge, text-syndication, auto-publish still Not started (P4). - Authority — prop-firm comparison index, frameworks, citation-into-brief still Not started (P5). ## In code, below the bar (DoD-fail) - Rendering fix — serve designed page as a top-level document (de-iframe): Served as top-level document, not iframed; Head tags injected server-side. - Deterministic page-gate checker wired to block promotion: Deterministic script (not LLM checklist); Hard-fail per checklist item; Image alt/width/height/filename checks; page_gate record replacing LLM scores; approveDesign refuses promotion on any hard fail. - Editorial voice + humanizer + reads-human gate: E8FN voice loaded into draft stage; Humanizer pass; Pre-publication reads-human/E8FN discipline gate. - JSON-LD emission into the served document head: Resolve author/date TODO@publish from KB; Emit JSON-LD + meta/og into served head; Validate JSON-LD in the page gate; generateMetadata carries description/og/JSON-LD. - E8 knowledge base build + brief eat_block wiring: Named author bio ingested; Site facts mined from site_pages.json; Proprietary data/frameworks ingested as sourced entries. - Serve /llms.txt (and /llms-full.txt) for real: /llms.txt route serves article list; guidance vs served. - Search Console / Bing Webmaster verification + sitemap submission: GSC/Bing site verification. - Per-host robots + near-free snippet directives: max-image-preview:large / max-snippet:-1. - Collapse to one human approval (single-pause reconciliation): Stale pause language trimmed from brief/publish directors. - Validation batch — one cluster of 10-15 assets generated & gated: One cluster picked & pre-screened; E8FN word-count bands adopted; Budget cap raised/removed for batch; E8FN voice loaded at draft; Cluster gated + human-approved. - Final manual interlink pass (close forward-only linking within the cluster): Manual interlink pass performed; Re-gate touched pages on re-approval. - Production go-live (one-time host/DNS/Helm plumbing): Production host CNAME + ingressHosts entry; build_site_pages.py run on prod volume; robots/sitemap/canonical/JSON-LD verified on partner host. - Shared token-driven design system (one design, layout composition only): Token audit (no raw hex/px); Canonical theme decided (engine vs E8FN). - Orchestrator rebuild (Python stage machine on raw Anthropic Messages API): Python stage machine on Messages API. - Continuous engine — keyword clustering, scheduled loop, production feed, refresh, relink: Scheduled keyword→article loop; Production feed search/nav/IA; Refresh loop; Continuous relink/backfill. - In-article media, article-to-video bridge, text-syndication, auto-publish: Article media / video bridge / syndication. - Authority — prop-firm comparison index, frameworks, citation-into-brief: Comparison index + citation-into-brief. - Compliance (Sentinel) — provenance, AII, legal-defensibility gate: Compliance gate / AII / provenance. ## Open questions (ambiguous mapping) - Design system canonical theme: e8-design-tokens.css ships the engine dark-emerald theme (#2fe3a3 on #05080a), the opposite of E8FN's locked 'Editorial Brutalism' cream theme. Which is canonical? Choosing E8FN means rewriting the token file + restyling the section catalog (real build work not currently done). - Page gate ambiguity: the only 'page gate' is aeo-page-spec.md executed by the design-stage LLM and asserted into design_review.json. There is no deterministic parser script and approveDesign does not consult the gate. Confirm the deterministic page gate is genuinely unbuilt (not hiding in another module) — I found none. - design-director.md step 4 labels the page gate '(Phase 4)' while §3.1 makes the deterministic page gate Phase-1 'the work'. Is the Phase-4 label a stale annotation (images activate in Phase 4) or intended deferral of the gate itself? - E8FN word-count bands vs SERP-derived sizing: draft-director.md still targets the SERP-derived word_count_distribution; the spec's E8FN bands are an open decision pending James. Which governs the validation batch? - Elasticsearch in production: the KB code requires a reachable ES backend (no fallback) and the e8-markets KB content lives on the gitignored runner PVC. Confirm whether ES is actually deployed/reachable in prod and the KB is populated — it cannot be verified from the repo. ## Mapping flip-flops - `control-center/lib/seo-review-write.ts`: page-gate-deterministic → rendering-fix (mapping changed since last run). - `skills/pipelines/seo-article/references/aeo-page-spec.md`: page-gate-deterministic → deterministic-page-gate (mapping changed since last run). - `skills/pipelines/seo-article/design-director.md`: page-gate-deterministic → deterministic-page-gate (mapping changed since last run). - `control-center/lib/seo-review-write.ts`: page-gate-deterministic → deterministic-page-gate (mapping changed since last run). - `skills/pipelines/seo-article/draft-director.md`: editorial-voice-gate → editorial-voice-reads-human-gate (mapping changed since last run). - `control-center/app/[...key]/page.tsx`: rendering-fix → jsonld-emission (mapping changed since last run). - `control-center/lib/kb/es.ts`: e8-kb-population → e8-knowledge-base (mapping changed since last run). - `control-center/app/admin/knowledge/page.tsx`: e8-kb-population → e8-knowledge-base (mapping changed since last run). - `skills/pipelines/seo-article/brief-director.md`: e8-kb-population → e8-knowledge-base (mapping changed since last run). - `tools/seo/build_site_pages.py`: production-go-live → e8-knowledge-base (mapping changed since last run). - `skills/pipelines/seo-article/publish-director.md`: jsonld-emission → llms-txt-served (mapping changed since last run). - `control-center/app/sitemap.xml/route.ts`: robots-sitemap-canonical → gsc-bing-verification (mapping changed since last run). - `control-center/app/robots.txt/route.ts`: robots-sitemap-canonical → robots-snippet-directives (mapping changed since last run). - `control-center/app/[...key]/page.tsx`: rendering-fix → robots-snippet-directives (mapping changed since last run). - `control-center/app/[...key]/page.tsx`: rendering-fix → canonical-hygiene (mapping changed since last run). - `control-center/lib/embed-host.ts`: robots-sitemap-canonical → canonical-hygiene (mapping changed since last run). - `skills/pipelines/seo-article/brief-director.md`: e8-kb-population → single-approval-wiring (mapping changed since last run). - `skills/pipelines/seo-article/publish-director.md`: jsonld-emission → single-approval-wiring (mapping changed since last run). - `skills/pipelines/seo-article/design-director.md`: page-gate-deterministic → single-approval-wiring (mapping changed since last run). - `control-center/lib/seo-review-write.ts`: page-gate-deterministic → single-approval-wiring (mapping changed since last run). - `tools/seo/run_request.py`: single-approval-wiring → validation-batch (mapping changed since last run). - `tools/research/topical_cluster.py`: cluster-fit-outbound-linking → validation-batch (mapping changed since last run). - `skills/pipelines/seo-article/publish-director.md`: jsonld-emission → manual-interlink-pass (mapping changed since last run). - `control-center/lib/published-pages.ts`: cluster-fit-outbound-linking → manual-interlink-pass (mapping changed since last run). - `tools/research/topical_cluster.py`: cluster-fit-outbound-linking → manual-interlink-pass (mapping changed since last run). - `helm/envs/omni-cc-stage/omni-cc-app.yaml`: e8-kb-population → production-go-live (mapping changed since last run). - `control-center/app/robots.txt/route.ts`: robots-sitemap-canonical → production-go-live (mapping changed since last run). - `control-center/app/sitemap.xml/route.ts`: robots-sitemap-canonical → production-go-live (mapping changed since last run). - `control-center/lib/seo-review-write.ts`: page-gate-deterministic → publishing-system-of-record (mapping changed since last run). - `control-center/lib/published-pages.ts`: cluster-fit-outbound-linking → publishing-system-of-record (mapping changed since last run). - `control-center/lib/embed-host.ts`: robots-sitemap-canonical → publishing-system-of-record (mapping changed since last run). - `skills/pipelines/seo-article/references/e8-design-tokens.css`: design-system-tokens → visual-design-system (mapping changed since last run). - `skills/pipelines/seo-article/references/section-catalog.md`: design-system-tokens → visual-design-system (mapping changed since last run). - `skills/pipelines/seo-article/design-director.md`: page-gate-deterministic → visual-design-system (mapping changed since last run). - `tools/seo/run_request.py`: single-approval-wiring → orchestrator-rebuild (mapping changed since last run). - `tools/seo/refresh_loop.py`: refresh-relink-loop → continuous-engine (mapping changed since last run). - `tools/seo/refresh_scan.py`: refresh-relink-loop → continuous-engine (mapping changed since last run). - `tools/research/topical_cluster.py`: cluster-fit-outbound-linking → continuous-engine (mapping changed since last run). - `tools/research/keyword_discover.py`: keyword-clustering-scheduler → continuous-engine (mapping changed since last run). - `skills/pipelines/seo-article/brief-director.md`: e8-kb-population → compliance-sentinel (mapping changed since last run).