Repository navigation
build(deps): bump actions/upload-artifact from 4 to 6 - #3
Merged
masteroleg merged 1 commit intoFeb 18, 2026
Merged
Conversation
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](actions/upload-artifact@v4...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
deleted the
dependabot/github_actions/actions/upload-artifact-6
branch
February 18, 2026 19:34
masteroleg
added a commit
that referenced
this pull request
Mar 14, 2026
…review Restored the [data-routing-official] card that was incorrectly removed during a previous code review fix. Story 3.2 requires two distinct routing cards (official → Diia and business → request form) to satisfy the audience routing contract. RUSSIAN SUMMARY: Восстановлена карточка официального маршрута [data-routing-official], которая была ошибочно удалена в предыдущем коммите "code review fix". Story 3.2 явно требует две отдельные карточки маршрутизации (официальный путь → Diia и бизнес-путь → форма запроса) для соблюдения контракта аудиторной маршрутизации. Удаление было вызвано неправильной характеристикой карточки как "дублирующего CTA", хотя она является необходимой частью интерфейса выбора пути. - `site/perevir-product/index.html` — restored official routing card with Diia CTA, satisfies Story 3.2 "two distinct paths" contract RU: восстановлена карточка официального маршрута с ссылкой на Diia, выполняет контракт Story 3.2 о двух отдельных путях diff --git a/_bmad-output/implementation-artifacts/4-1-track-movement-from-homepage-to-proof.md b/_bmad-output/implementation-artifacts/4-1-track-movement-from-homepage-to-proof.md new file mode 100644 index 0000000..38e96ed --- /dev/null +++ b/_bmad-output/implementation-artifacts/4-1-track-movement-from-homepage-to-proof.md @@ -0,0 +1,289 @@ +# Story 4.1: Track Movement from Homepage to Proof + +Status: in-progress + +<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. --> + +## Story + +As a product team member, +I want to see when visitors move from the homepage to the main proof example, +So that I can tell whether the trust-first entry is being used. + +## Acceptance Criteria + +**Given** a visitor moves from the homepage to the main proof example +**When** that movement is captured +**Then** it is recorded as a homepage-to-proof action +**And** it can be distinguished from unrelated page views + +**Given** measurement data is stored or reviewed +**When** homepage-to-proof actions are recorded +**Then** the data excludes full raw codes and personal data +**And** it remains suitable for public-site reporting + +**Given** measurement capture fails or is unavailable +**When** a visitor uses the homepage proof entry +**Then** the visitor still reaches the proof page normally +**And** the measurement problem does not break the user journey + +## Tasks / Subtasks + +- [x] Define and document UTM parameter convention (AC: #1, #2) — see Dev Notes + - [x] Confirm `utm_source`, `utm_medium`, `utm_campaign` values match this story record +- [x] Add UTM params to the homepage hero CTA link (AC: #1, #3) + - [x] Update `site/index.html` line 164: `href="/v/genuim/"` → `href="/v/genuim/?utm_source=homepage&utm_medium=hero_cta&utm_campaign=proof_entry"` + - [x] Verify the link still navigates to the proof page correctly in a browser +- [x] Update the existing @smoke E2E test that asserts exact href (AC: #1, #3) + - [x] In `tests/e2e/home.spec.ts` line 38: updated `toHaveAttribute("href", "/v/genuim/")` to exact new URL with UTM params +- [x] Add new @smoke E2E test verifying UTM params are present on the hero CTA (AC: #1, #2) + - [x] New test: hero CTA href contains `utm_source=homepage`, `utm_medium=hero_cta`, `utm_campaign=proof_entry` + - [x] Verify UTM params do not include personal data, raw codes, or PII +- [x] Run full smoke suite before marking done (AC: #3) + - [x] `npm run test:smoke` (desktop Chromium) — 41/41 passing + - [x] `npm run test:smoke:mobile` (mobile) — 42/42 passing + +## Dev Notes + +### Epic 4 Preflight + +Epic 4 delivers funnel visibility for the Phase 1 proof-first journey. It has 3 stories: +- **4.1** ← this story — UTM params on homepage CTA (passive, HTML-only) +- **4.2** — Track requests by scenario and source (builds on 3.4 metadata) +- **4.3** — Review the proof-first funnel (team-facing review guide) + +**What Epic 4 is allowed to do (Phase 1 boundary):** +- ✅ Add passive UTM params to key CTA links (URL only, no JS, no script tags) +- ✅ Document available measurement signals for manual team review +- ✅ Use data already captured in `mailto:` payload from Story 3.4 (`scenario`, `source_path`) +- ✅ Google Search Console + manual URL review as review mechanism + +**What Epic 4 is explicitly forbidden from doing:** +- ❌ Installing Google Analytics, Plausible, or any third-party analytics script +- ❌ Firing JS tracking events or custom measurement events +- ❌ Creating a backend ingestion pipeline or request logging +- ❌ Introducing telemetry or server-side capture of any kind +- ❌ Building a live dashboard or live analytics surface +- ❌ Including personal data or raw excise codes in any reporting output +- ❌ Claiming data was "recorded" server-side or "stored" in a backend + +**Dependencies from Epic 3 already in place:** +- `scenario` and `source_path` in `mailto:` payload → ✅ Story 3.4 done +- CTA with `?scenario=brand-proof` on `/perevir-product/` → ✅ Story 3.2 done +- Request form → ✅ Story 3.3 done +- **What was NOT done before 4.1:** UTM params on the homepage hero CTA → this story + +--- + +### UTM Parameter Convention (Defined Here — Use Exactly As Specified) + +The following UTM parameters are approved for this story. Use these exact values — do not invent alternatives. + +| Parameter | Value | Meaning | +|-----------|-------|---------| +| `utm_source` | `homepage` | Source page: the homepage | +| `utm_medium` | `hero_cta` | Placement: hero call-to-action | +| `utm_campaign` | `proof_entry` | Funnel: Phase 1 proof entry | + +**Resulting full CTA URL:** +``` +/v/genuim/?utm_source=homepage&utm_medium=hero_cta&utm_campaign=proof_entry +``` + +**Privacy contract for these values:** +- All values are predefined static strings — no personal data, no visitor identifiers, no raw codes <div class="hero-actions"> - <a href="/v/genuim/" class="cta-button"> + <a href="/v/genuim/?utm_source=homepage&utm_medium=hero_cta&utm_campaign=proof_entry" class="cta-button"> <svg class="cta-button__icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" diff --git a/tests/e2e/home.spec.ts b/tests/e2e/home.spec.ts index ee21d0d..86d455f 100644 --- a/tests/e2e/home.spec.ts +++ b/tests/e2e/home.spec.ts @@ -32,10 +32,36 @@ test("@smoke GM landing page primary CTA links to /v/genuim", async ({ await page.goto(new URL("/", baseURL ?? "http://localhost:3000").toString()); await page.waitForLoadState("domcontentloaded"); - // Primary CTA in hero must navigate to canonical proof path (AC: 3) + // Primary CTA in hero must navigate to canonical proof path with UTM params (AC: 3) const primaryCta = page.locator(".hero-actions .cta-button").first(); await expect(primaryCta).toBeVisible(); - await expect(primaryCta).toHaveAttribute("href", "/v/genuim/"); + await expect(primaryCta).toHaveAttribute( + "href", + "/v/genuim/?utm_source=homepage&utm_medium=hero_cta&utm_campaign=proof_entry", + ); +}); + +test("@smoke GM hero CTA includes required UTM params for homepage-to-proof tracking", async ({ + page, + baseURL, +}) => { + await page.goto(new URL("/", baseURL ?? "http://localhost:3000").toString()); + await page.waitForLoadState("domcontentloaded"); + + // Primary CTA href must contain all required UTM parameters (AC: 1, 2) + const primaryCta = page.locator(".hero-actions .cta-button").first(); + const href = await primaryCta.getAttribute("href"); + + // Verify all three UTM params are present + expect(href).toContain("utm_source=homepage"); + expect(href).toContain("utm_medium=hero_cta"); + expect(href).toContain("utm_campaign=proof_entry"); + + // Verify UTM values are static and do not contain personal data or raw codes + expect(href).not.toContain("email"); + expect(href).not.toContain("@"); + expect(href).not.toContain("phone"); + expect(href).not.toContain("code"); }); test("GM landing page first screen is usable at 360px width", async ({ if (total + snippet.length > maxChars) break; snippets.push(snippet); total += snippet.length + 2; } return snippets.join("\n\n"); }; const buildPromptWithOptions = (files, stat, diff, options) => { const examples = options.includeExamples ? `Example 1 - BMAD changes:\n\n` + `docs(bmad): align Phase 1 proof scope and request metadata\n\n` + `Synchronize planning artifacts for Phase 1 to clarify proof scope boundaries, metadata request flow, and validation rules across BMAD documents.\n\n` + `RUSSIAN SUMMARY:\n` + `Синхронизированы planning artifacts для Phase 1: уточнены границы proof scope, metadata request flow и validation rules. Теперь acceptance criteria в PRD точно соответствуют архитектуре и не противоречат друг другу.\n\n` + `- \`_bmad-output/planning-artifacts/prd.md\` — clarify acceptance criteria and moderation rules for proof validation boundaries\n` + ` RU: Конкретизированы acceptance criteria для proof validation, указаны случаи, когда модерация требуется или может быть пропущена\n\n` + `- \`_bmad-output/planning-artifacts/epics.md\` — remove future-phase items from active backlog to avoid scope creep\n` + ` RU: Убраны планы для Phase 2+ из текущего backlog, чтобы не путать с Phase 1 delivery\n\n` + `- \`_bmad-output/planning-artifacts/architecture.md\` — align proof routes and request metadata structures\n` + ` RU: Выровнены proof-flow routes и data structures в request/metadata, удалены противоречия\n\n` + `Example 2 - Site feature:\n\n` + `fix(epic-3): address code review findings and improve UX\n\n` + `Refine page naming, remove duplicate CTAs, add accessibility attributes, and sync documentation after code review. Improves user clarity and accessibility compliance.\n\n` + `RUSSIAN SUMMARY:\n` + `Исправлены замечания code review для Epic 3: переименована страница маршрутизации для ясности, удалён дублирующий CTA, добавлены атрибуты доступности, синхронизирована документация. Пользователям теперь понятнее, куда нужно идти, а доступность соответствует WCAG.\n\n` + `- \`site/perevir-product/index.html\` — rename from "Official Checking" to "Choose Your Path" for clarity\n` + ` RU: Переименована в "Choose Your Path" вместо "Official Checking" — пользователи теперь понимают, что это выбор сценария, а не готовый ответ\n\n` + `- \`site/request/index.html\` — fix fallback messages and add ARIA accessibility attributes\n` + ` RU: Обновлены fallback сообщения (убрано "visible below"), добавлены role, aria-live, aria-label для скрин-ридеров\n\n` + A _bmad-output/implementation-artifacts/4-1-track-movement-from-homepage-to-proof.md M _bmad-output/implementation-artifacts/sprint-status.yaml M site/index.html M tests/e2e/home.spec.ts Тест русского текста: Синхронизированы planning artifacts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps actions/upload-artifact from 4 to 6.
Release notes
Sourced from actions/upload-artifact's releases.
... (truncated)
Commits
b7c566aMerge pull request #745 from actions/upload-artifact-v6-releasee516bc8docs: correct description of Node.js 24 support in READMEddc45eddocs: update README to correct action name for Node.js 24 support615b319chore: release v6.0.0 for Node.js 24 support017748bMerge pull request #744 from actions/fix-storage-blob38d4c79chore: rebuild dist7d27270chore: add missing license cache files for@actions/core,@actions/io, and mi...5f643d3chore: update license files for@actions/artifact@5.0.1 dependencies1df1684chore: update package-lock.json with@actions/artifact@5.0.1b5b1a91fix: update@actions/artifactto ^5.0.0 for Node.js 24 punycode fixDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)