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_1103CHANGEDfix(worker): log expected publish gate-holds as warning, not error
A
publish_post_failederror was paging the tracker as high-severity from thePipelineWorkerLambda: - PR_1101CHANGEDfix(logging): suppress bs4 XMLParsedAsHTMLWarning escalated as CloudWatch error
A
XMLParsedAsHTMLWarningfrom BeautifulSoup was showing up as a high-severity error in the error tracker, sourced from thePipelineWorkerLambda:
- PR_1099CHANGEDfix(dataforseo): retry transient 5xx/429/network faults in HTTP client
Adds transient-fault retry to the DataForSEO HTTP client (
_post), the single choke point behind every DataForSEO call. - PR_1097CHANGEDperf(projects): batch + filter-scope project-list card enrichment
The Projects list view (
/projects) fanned out 6 per-project detail calls inonMountedover the full, unfiltered project list. Filtering (e.g. searching "DNS" → 1 of... - PR_1095CHANGEDfix(publish): enforce destination capability contract + structured 4xx learning; surface generate no-ops
Two prod issues on
proj_63b11d19aa2b4fd7(publishing topublish.sendant.io): - PR_1094CHANGEDfeat(posts): monthly-post quota guardrail + Generate regression tests
Follow-up to #1088 (which merged only the error-surfacing commit). This carries the rest of the Generate-button work that wasn't in that merge.
- PR_1092CHANGEDfix(gsc): alias reserved words in live-probe re-bucket UpdateItem
GSCMetricsRepository.apply_live_probe_bucketbuilt its UpdateExpression asSET bucket = :b, severity = :s, …. Bothbucketandseverityare DynamoDB reserved words, s... - PR_1091CHANGEDprompts: answer-first intros, ban scene-setting filler, add comparison tables
Two additive, cross-tenant content-quality improvements to the blog writer prompts (
BLOG_POST_PROMPTandHYBRID_BLOG_POST_PROMPT), motivated by QA of the Steada tena... - PR_1090CHANGEDfeat(indexing): discovery-health findings + honest Indexing-API copy
Turns the passive "not indexed" badge into actionable, Vectra-owned signal. All checks are deterministic and free — they read state we already have (no model calls, no extra GSC...
- PR_1088CHANGEDfix(posts): surface Generate errors instead of failing silently
Clicking the manual Generate Posts button on the posts page appeared to do nothing — no job, no new post, no error message.
- PR_1086CHANGEDfix: replace retired Gemini 2.5 Flash
Production pipeline jobs fail with HTTP 404 because Google no longer serves
models/gemini-2.5-flash. Google documentsgemini-3.1-flash-liteas a GA migration path that aims...
- PR_1084CHANGEDFix secret separation boot guard
Closes #1073
- PR_1082CHANGEDfix: normalize custom_api cms_post_url to the declared canonical host
When a project configures
canonical_base_url, that's the public location VectraSEO already ships in the outgoing payload + JSON-LD. ButCustomAPIAdapterstored whatever host...
- PR_1080CHANGEDfix: expand short meta descriptions on repair
- PR_1078CHANGEDfix: repair post metadata with article context
- PR_1076CHANGEDfix: keep recommendations available on page summary errors
- PR_1074CHANGEDfeat: integrate DataForSEO market intelligence
- 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...