Tool · tool guide

SEO CI/CD: Build and Enforce Reliable Live Merge Gates

Build SEO CI/CD that pins the checker, preserves raw JSON, parses original status fields, and blocks unsafe pull requests with a reproducible merge gate.

Published Updated 10 min readBy William Zhu & InfiniSynapse Data Team

Author credentials: William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy · auto-coder). Desk: shipping SEO Health and the /en/tool/ visibility pages. No personal LinkedIn published. About: team / editorial standards.

Publisher credentials: InfiniSynapse has public profiles on GitHub, YouTube, and X. A 2026 WAIC Future Tech OPC excellence award covers the Agentic Data Infra entry (WAIC; third-party recap: Xinhua / Caohejing). That award does not review this page or SEO Health. Method CLI: infinitegrowth on npm. Archive: recognition and scope notes.

SEO CI/CD: Build and Enforce Reliable Live Merge Gates
On this page

By William Zhu · Cofounder, InfiniSynapse · Published: 2026-09-09 · Last updated: 2026-09-14 · Last verified: 2026-09-14 · Reviewed by the InfiniSynapse Data Team.

Reviewed by: InfiniSynapse Data Team · method review 2026-09-14. Local gate.mjs fixture run plus one first-party CLI document for this hub URL.

Trust / COI: About · Corrections. SEO Health is a commercial product from this team. The table below is a desk run, not a customer pipeline and not a hosted Actions badge.

TL;DR

SEO CI/CD is a repository decision: keep the JSON, read the original status fields, and return a nonzero process status when the page is unsafe to merge. A green CLI transport is not that decision.

Direct answer: Treat SEO CI/CD as a parser plus a required check. On 2026-09-14 a local Node gate exited 1 on a red fixture and 2 on a malformed fixture. The same afternoon the CLI exited 0 on this hub URL while Image Alt Text stayed warning. Process 0 is not a page pass.

The sample size is one local gate plus one first-party URL. That sample cannot establish that a hosted runner passed, and it does not prove a ranking outcome. A SEO CI/CD file that drops the package version is no longer replayable.

What you will learn

  • Which fixture exits we actually recorded
  • Why the live CLI left exit 0 beside a warning row
  • How the wrong npx argv fails before any URL is fetched
  • When a required check is still only telemetry
  • Where this SEO CI/CD hub stops and a sibling owns the surface

What a merge gate actually decides

Key definition: SEO CI/CD is the path from a generated page report to a repository yes-or-no. It does not certify rankings, predict traffic, or issue an official Google grade. Its useful output is a file, a log, and an exit status tied to one commit.

The continuous integration definition is the third-party reminder that integration happens before merge, not after a dashboard screenshot. That encyclopedia page does not grade this host.

People open SEO CI/CD when a preview is reachable and a pull request still needs a mechanical stop. They do not need a slide about culture. They need a path, a version, and a parser.

GitHub required status checks decide whether a failed job can merge. The local parser decides whether the report deserves that failure. Those are different layers.

SEO Health remains the deterministic evidence foundation for check JSON. After a red row is named, a team may send that row into an InfiniSynapse Server API long-task workspace, consume SSE /api/ai/events, then call /api/ai/message. The API does not replace the gate exit.

Process exit is not a page pass

The observed seo-health check --format json shape includes url, issues[], and onPage[]. Rows expose name and status. Recorded values in this desk were good and warning. The CLI process may exit 0 while a row is not good. SEO CI/CD has to read the row.

Warning rows still left exit 0

A transport success only proves that a process returned data. It does not prove the page passed the checks inside that data. For SEO CI/CD, that split is the whole job.

Desk record on 2026-09-14

Node v22.18.0 ran gate.mjs against four fixtures in /tmp. The same desk then called the pinned CLI against this hub URL.

InputProcess exitstderr / warning
red.fixture.json1SEO_RED Title Length
malformed.fixture.json2SEO_CONTRACT missing_result_arrays
warn.fixture.json0(empty)
good.fixture.json0(empty)
missing path2usage: node gate.mjs <report.json>
live hub CLI0Image Alt Text warning, 2/5 images

The live document for https://infinisynapse.com/en/tool/seo-ci-cd used title length 49, description length 153, word count 3332, speed 72, TTFB 1488 ms (warning), HTML 100.9 KB (warning), and one blocking script. cached was false. Top-level keys were url, page, onPage, issues, images, keywords, speed, seoData, and cached.

That is a SEO CI/CD evidence row, not a customer case. A later deploy can change the alt warning. Re-run the command.

Grouped bars for the 2026-09-14 desk: process exit beside warning-row count on fixtures and the hub URL

Figure: Two series from the same desk. Process exit is not warning-row count. Neither series is a ranking score.

Local fixture exits

The red fixture is valid JSON with one error row. The gate printed SEO_RED Title Length and exited 1. The malformed fixture has a url and no result arrays. The gate printed SEO_CONTRACT missing_result_arrays and exited 2. Node.js process exit codes is why those numbers are visible to a required check.

Live CLI on this hub URL

The CLI exit was 0. The issues array still carried one warning. A SEO CI/CD job that only inspects $? would have gone green. Keep the file.

How to reproduce the fixture

Save the same three files the desk used. Run them from an empty directory. Do not skip the malformed path.

node gate.mjs red.fixture.json; echo exit:$?
node gate.mjs malformed.fixture.json; echo exit:$?
# SEO_CONTRACT missing_result_arrays · exit 2

MDN JSON.parse is the parser the gate calls. Invalid JSON is exit 2, not a soft warning. SEO CI/CD should keep that distinction so a missing array does not look like a content red.

The fixture is a contract. It is not a hosted workflow. This website repository still has no .github/workflows directory at the app root. Do not paste a green badge from a runner we did not start.

How to reproduce the CLI

The wrong argv fails before a fetch. npx --yes infinitegrowth@0.1.1 seo-health check URL printed error: unknown command 'seo-health' and exited 1. The working form pins the package with -p:

npx --yes -p infinitegrowth@0.1.1 seo-health check \
  --format json --lang en \
  https://infinisynapse.com/en/tool/seo-ci-cd

As of 2026-09-14 that command wrote about 72 KB of JSON and left process 0. SEO CI/CD still has to parse issues[].status. Pin infinitegrowth@0.1.1. Floating latest is a different executable.

Why a required check still needs a parser

A job that fails but is not required is telemetry. Configure branch protection so the named SEO CI/CD job must pass. Keep the artifact on failure so the named row is visible.

Artifact missing is exit 2

A missing file is not green. Disk, network, and JSON.parse failures need their own nonzero code. The desk used 2 for contract failures. Use one code and document it.

Red row is exit 1

A valid report with status: "error" is a content failure. The desk used 1. Do not collapse 1 and 2 or incident triage starts with a guess.

Google SRE monitoring guidance is why we want a distinct symptom per layer. It does not say SEO Health is a search-engine score.

Validate the JSON SEO report before you grade lights. A missing url or a missing result array is still exit 2, even when the job square is green.

Where this hub stops

This page owns the shared decision model: file, fields, exit, required check. Surfaces that fail differently live on siblings. SEO CI/CD does not become a GitLab YAML walkthrough on this URL.

A scheduled sitemap sample is a clock job, not a pull-request gate. An agent chat is a transcript, not issues[].status. A registry listing is identity, not a merge proof.

Record the command, the package version, the UTC date, the target URL, the original fields, and the actual exit code. If any of those are missing, the SEO CI/CD replay is already broken.

Keep stdout on disk even when the parser later returns 1. A red check without a file creates an argument. A retained file creates a repair queue. Redirect the CLI to a known path and leave stderr in the job log. Never hand-edit the report between generation and parsing. If the command cannot reach the URL, classify that as command failure rather than writing an empty green object.

Six first-party tool URLs in the same desk all left CLI exit 0 and one Image Alt Text warning. Speed sat at 72 on every row. TTFB ranged from 1144 ms to 1488 ms. Those six rows are still a sample, not a site audit. SEO CI/CD on a pull request should start with one preview, not with a silent 500-page crawl.

The infinitegrowth npm page owns registry identity and the -p pin. This hub only needs the working argv and the rule that process 0 is incomplete. Open that sibling when the lockfile is the question.

Adoption in four reviewable commits

Do not land policy, preview, and branch protection in one opaque commit. SEO CI/CD is easier to revert when each change leaves a file.

Start with the red fixture and the malformed fixture. Record exits 1 and 2 in the pull-request body. Then connect one public, non-sensitive preview and archive the exact JSON. Only after that path is stable should the named job become required. Scheduled breadth, if you want it, is a later clock with an owner and a page cap.

A SEO CI/CD rollout that begins at audit --pages 50 hides the parser. Prove the negative path first. The fixture desk is enough to reject a plan that only screenshots the Actions UI.

Failure modes worth a red fixture

Wrong argv. Forgetting -p never reaches the URL. The desk already recorded that failure. Put it in the runbook before the first preview.

Green transport. CLI exit 0 plus a warning or error row. Parse the array. SEO CI/CD exists because that pair happens.

Agent approval. A model can say the title looks fine. The parser still has to see name and status. Keep the transcript as context if you want. Do not let it override the file.

Version drift. A global install that is not the lockfile version is a different program. Pin, then upgrade in its own change.

Missing artifact treated as skip. if: always() (or the GitLab equivalent) is how a red job still leaves a file. Without the file, SEO CI/CD cannot name the row.

Cluster guides

Use this hub for the shared rule, then open the surface you actually operate.

Job you actually haveGuide to open next
A pull_request workflow whose check reads the parsed reportGitHub Action website audit
A merge-request job in .gitlab-ci.ymlGitLab CI SEO check
CLAUDE.md plus a hook that is not a chat verdictClaude Code SEO
Codex non-interactive text that still needs a schemaCodex SEO
A committed .cursor/skills/ file that is not a parsercursor seo skill
A bounded URL list with per-URL JSONbatch SEO URL check
A clock-triggered sample with a page capscheduled site audit
A typed adapter around CLI output, not an invented HTTP APISEO API for developers
Package pin, lockfile, and the -p argvinfinitegrowth npm
An agent edit that still needs a preview plus a filevibe coding SEO
Schema and JSON.parse before policyJSON SEO report

Test the URL before you wire the repository check

Run the browser form once, then reproduce the same JSON from the pinned CLI and keep the file.

Run SEO Health Checker

Use a public URL and never paste secrets.

Frequently Asked Questions

Does the default merge gate require a login?

No. Default check, audit, and links do not need a CLI key. eeat, aivisibility, and gsc do. Keep those deep commands out of the default SEO CI/CD pull-request job unless a named owner accepts the spend.

How should malformed JSON affect the decision?

Fail closed. The desk used exit 2 for a missing issues array. Keep stderr. Malformed data is not a warning, because SEO CI/CD cannot prove the required checks ran.

Can process status decide the merge by itself?

No. The live hub CLI exited 0 while Image Alt Text was warning. Parse issues[] and onPage[]. Preserve name and status. Then apply the repository rule.

Is this merge policy an official Google score?

No. SEO CI/CD uses product traffic lights to enforce a local merge rule. It does not emit an official Google grade, guarantee indexing, or predict ranking changes.

Do we claim a hosted runner passed?

No. This rewrite executed a local fixture and one public CLI. A required check on GitHub or GitLab is a later commit. Do not display a badge we did not earn.

Conclusion

Use SEO CI/CD when the job is to turn a page report into a required repository decision. The 2026-09-14 desk shows fixture exits 1 and 2, and a live CLI that exited 0 beside a warning. Close the SEO CI/CD file when the command, the version, the raw fields, and the parser exit are still visible. A bounded fixture is more useful than an unsupported green badge.

Open the InfiniSynapse web app only if a signed-in deep task is required. The routine gate remains the pinned CLI and the retained JSON.

WZ

William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy

Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.

SEO CI/CD: Build and Enforce Reliable Live Merge Gates