mainWhat we shipped.
One line per merged pull request, dated by merge day. Generated by the same automation that pushes the code, so the only delay between "we shipped it" and "it appears here" is a CI run.
What changed most recently in VectraSEO?
The changelog lists the latest merged pull requests by release date, with the newest shipped change first and older releases kept in the project archive.
Last updated·
- PR_1071CHANGEDsecurity(ssrf): pin DNS resolver on CMS publish + guard sitemap fetch
Closes two SSRF gaps that are still live on
main. These came out of QA on the stalesecurity/fix-critical-high-findingsbranch (~6 weeks / 1102 commits behind): most of that... - PR_1069CHANGEDfeat(autofix): orphan sweeper + cancel button + republish retry/error visibility (PR #1066 deferred)
Ships the deferred items from PR #1066 (autofix_batch durability) plus the fix for today's prod-QA "Fix all" no-op finding. Two commits:
- PR_1066CHANGEDfix(autofix): durable autofix_batch — checkpoint/resume, deadline-aware continuation, dedup, idempotency
A 17-fix "Fix all" on a live project (EchoThread, 2026-06-29) exceeded the 15-min Lambda budget. The pipeline FIFO message was redelivered 3× (
maxReceiveCount=3), **ea... - PR_1063CHANGEDfix(affiliates): invite non-partners to apply instead of erroring
QA against prod surfaced that a signed-in user who isn't a partner, navigating directly to
/affiliates, saw only a bare red "Your account is not yet a partner." with no pa... - PR_1064CHANGEDfix(migration): hide create form when the feature flag is off
QA against prod (where
migration_monitor_enabledis dark) surfaced that/projects/:id/migrationrendered a fully submittable "New migration" form above a red *"Migration... - PR_1061CHANGEDfeat(migration): Trestle P3 — post-launch verification monitor
Closes the Trestle closed loop (epic #1056). Once a migration is live, the approved redirect map frozen in P2 becomes a contract: every old URL is verified against its a...
- PR_1060CHANGEDTrestle P2 — staging validation + approval queue (draft→in_review→approved)
Third phase of the migration monitor (epic #1056), on top of merged P0 (#1057) and P1 (#1059). Turns the free P1 draft map into an approved, frozen redirect set — th...
- PR_1059CHANGEDfeat(migration): Trestle P1 — deterministic draft redirect map
Second phase of the migration monitor, building on P0 baseline ingest (PR #1057, merged). Turns the baseline's old URLs + the new site's sitemap(s) into a **deterministic ol...
- PR_1057CHANGEDfeat(migration): Trestle P0 — pre-migration baseline ingest (3rd monitor_type)
Ships P0 of epic #1056 (Trestle — ecommerce migration redirect protection) as a third VectraSEO monitor species,
monitor_type="migration", mirroring the AI-visibility moni... - PR_1054CHANGEDfeat(autofix): read the live page as source of truth, never overwrite edits
One-click Auto-Fix / "Fix all" / Auto-Pilot previously patched VectraSEO's stored S3 snapshot and republished it — which could silently **squash a customer's out-of-band edi...
- PR_1052CHANGEDfeat(autofix): one-click "Fix all" for Insights recommendations
Adds a single Fix all button to the Insights / "Needs attention" recommendation surface (project overview and
/insights). One click plans, confirms, and dispatches **o...
- PR_1050CHANGEDfix(autofix): keep the AEO answer block grounded (lands the last 2/3, epic #1034)
Follow-up to #1048. After the gate-layer fix deployed, a re-run of "Fix all 3 pages" landed 1/3 — the other two still held on
truth. A read-only diagnostic against the liv... - PR_1048CHANGEDfix(autofix): land additive fixes by delta-gating + truth-repair (Fix 2, epic #1034)
Closes the loop opened by #1046 (which made the *failure* observable). This makes the fix *succeed*.
- PR_1046CHANGEDfix(autofix): surface terminal fix disposition on Site-Health issues
One-click Site-Health Auto-Fix set the monitor issue to
fix_status=submittedat dispatch, but nothing ever advanced it pastsubmittedonce the job finished. A gate-held,... - PR_1044CHANGEDdocs(custom-api): document PUT update/republish requirement
Documents that VectraSEO republishes a live post via
PUT {publish_path}/{id}(edits, scheduled re-publishes, one-click Auto-Fix / "Fix all"), and that a destination servin... - PR_1041CHANGEDfix(monitors): make "Fix all N pages" outcome loud and verifiable
A user clicked Fix all 3 pages on a Site-Health AEO rule, saw it "do some work," then the button reset to Fix all 3 pages and the issue cards looked unchanged — so it ap...
- PR_1039CHANGEDfeat(autofix): Auto-Pilot scheduled remediation (One-Click Auto-Fix Phase 4)
Opt-in, hands-off remediation. After each Site-Health monitor scan, VectraSEO acts on the findings automatically:
- PR_1037CHANGEDAuto-fix Phase 2 + 3: batch fix-all, Tier B connected CMS, Tier C change-sets
Completes the One-Click Auto-Fix epic (#1034) — Phase 2 (Site-Health issues on the rail) and Phase 3 (Tier B connected CMS + Tier C change-sets + schema/alt fixers). Builds dire...
- PR_1035CHANGEDfeat: One-Click Auto-Fix ("Implement") — Phase 1 (Tier A authored posts)
Closes part of #1034. Turns Insights recommendations and Site-Health monitor issues from *suggestions* into a one-click Implement action: read the live page → apply a minima...
- PR_1032CHANGEDAI Visibility Improvements
- PR_1029CHANGEDfix: honor disabled image generation for hybrid posts
- PR_1027CHANGEDfix: allow versioned code years in freshness gate
- PR_1025CHANGEDfix: honor casual quality bar in publish pipeline
The affected project stored mode=casual while still carrying default explicit thresholds. The resolver applied the Casual preset and then overwrote it with those stale fields. W...
- PR_1023CHANGEDfeat(posts): automatically delete archived posts past retention
Implements automatic deletion logic for archived and orphaned posts past a configurable retention period (default 30 days) during the hourly schedule sweep.
- PR_1021CHANGEDfix(gsc): clear stale Google noindex when live probe is clean
Index Coverage badges on the posts list (
IndexBadge.vue) show a critical red "Conflict" (excluded_noindex_sitemap_conflict) for posts that are actually `index,follow... - PR_1019CHANGEDdocs(content-brief): internal reference + expanded public setup guide
Documents the Content Brief (the editorial / ICP contract that constrains both topic selection and writing for the content engine), which previously had no standalone refere...
- PR_1017CHANGEDfeat(settings): document every project setting + warn on unsaved changes
The Project Settings page (
/projects/:id/settings) is dense — 6 sections, ~40 controls — but many functions had no explanation, and editing was risky because there was **no pr... - PR_1015CHANGEDfeat(gaps): intent-weighted, striking-distance content prioritization
Closes the loop between the GSC signals VectraSEO already collects and the topics it generates. Today gap selection is ranked only by Gemini's heuristic
priority_score; th... - PR_1014CHANGEDfix(settings): scope "Use spec defaults" to the active project
Clicking Use spec defaults on the custom-API publish contract filled in emcognito-specific values in every project, regardless of which project you were in.
- PR_1012CHANGEDfeat(monitor): self-identifying X-VectraSEO-Monitor header + public /bot page
A customer asked how to filter VectraSEO traffic out of their analytics. The honest answer surfaced two gaps:
- PR_1010CHANGEDfix(url_probe): harden robots-meta content regex against apostrophe truncation
Hardens
url_probe._has_noindex'scontent=attribute matcher against the same apostrophe-truncation footgun that PR #1008 fixed induplicate_metadata. - PR_1008CHANGEDfix(duplicate_metadata): stop truncating meta descriptions at apostrophes
Monitor
mon_10da5dec2bc24586(echothread.io) flagged aduplicate_metadataWARNING:/terms/and/privacy/reported an identical meta description of"echothread". Su...
- PR_1005CHANGEDtest(gemini,truth-layer): update stale tests for provider fallback + #650 synthesis
Two unit tests were red on
main(surfaced during QA of an unrelated soft-404 fix). Both asserted contracts that intended features have since superseded — there is no p... - PR_1004CHANGEDfix(soft_404): stop flagging canonical-to-another-real-page as a soft 404
On alaskaroadtrip.com (
proj_28112aca8eaa4b15, monitormon_10da5dec2bc24586) two blog articles were shown aslive: Looks like a soft 404in index-coverage and docke... - PR_1001CHANGEDbuild(deps): bump undici from 7.24.7 to 7.28.0 in /frontend
Bumps undici from 7.24.7 to 7.28.0.
- PR_999CHANGEDSEO recommendations — 2026-06-20
Source reports: VectraSEO SEO & AEO Remediation Plan (scan 2026-06-20 01:05 UTC) and GSC SEO recommendations (2026-06-20 01:17 UTC).