Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions docs/PRODUCT-EXPERIMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Reverse chronological. Legend: ✅ Success · ❌ Failed · ⚪ Inconclusive ·

| Date | Entry | Status |
|------|-------|--------|
| 2026-09-08 | [Italian interaction and translation clarity](#2026-09-08-italian-interaction-and-translation-clarity) | Implemented in [PR #77](https://github.com/Darkmatter-AI/deepbreathing/pull/77); production verification pending |
| 2026-09-05 | [App acquisition funnel and shared website campaign](#2026-09-05-app-acquisition-funnel-and-shared-website-campaign) | 🔄 Implemented locally — deployment pending |
| 2026-08-30 | [Guest completion provider-parity hotfix](#2026-08-30-guest-completion-provider-parity-hotfix) | 🔄 Implemented locally, approval pending |
| 2026-08-30 | [Assistant recommendation handoff instrumentation](#2026-08-30-assistant-recommendation-handoff-instrumentation) | 🔄 Implemented in PR [#72](https://github.com/Darkmatter-AI/deepbreathing/pull/72) — live receipt pending |
Expand Down Expand Up @@ -58,6 +59,20 @@ See also: [docs/FUNNEL-DASHBOARD.md](FUNNEL-DASHBOARD.md) for the current state,

## Active Experiments

### 2026-09-08: Italian interaction and translation clarity

**Observed baseline.** Italian has no published web experience. Existing French settings show missing accents and the English label “Pink Noise (Rain)”. The speed control displays a multiplier as seconds per phase even though the actual phase durations are listed separately. These are directly observed copy and meaning defects, not measured conversion failures. Research for August 9–September 5 found 8 Italian-browser-language web users and 6 users firing a session-start event; that cohort is too small to infer an engagement rate change.

**Hypothesis.** Complete Italian controls and account prompts, clear language destinations, and accurate speed units will make the published Italian exercises usable without changing session timing or authentication behavior.

**Pre-committed gates.** The Italian session can start and pause, settings and guest account prompts are in Italian, template variables remain intact, unavailable translated destinations are not linked, and the speed display identifies a multiplier rather than seconds. Existing-language controls retain their actions. Verify desktop and mobile rendering with screenshots. Do not send authentication emails or modify real accounts for this check.

**Outcome checkpoint.** On 2026-11-03, use the Italian-page session-start threshold from the matching SEO experiment (10 users) as an initial adoption signal. Below that threshold the product outcome is inconclusive. Retain objectively correct labels regardless of immature conversion data. Transactional emails and provider-hosted authentication screens are outside this on-site translation change.

**Implementation.** Italian home/library 4-7-8 links open the Italian timer, whose main timer link returns to its own player. The Italian mobile home introduction flows below the player to avoid overlap between its longer copy and duration buttons. Desktop layout remains unchanged.

**Status.** Implemented and locally verified in [PR #77](https://github.com/Darkmatter-AI/deepbreathing/pull/77) on `codex/languages-italian-20260908`; production receipt pending.

### 2026-08-30: Guest completion provider-parity hotfix

**Observed baseline:** The live guest completion bucket is `loss_aversion` at 100%. A rendered one-minute signed-out completion shows Google and email only. The approved `keep_practice` Save-your-progress sheet contains both Apple and Google, but it is reachable only through its preview query or a stale persisted bucket. The earlier `keep_practice` conversion experiment failed at 8.37% intent (17/203 users); this hotfix does not relitigate that result.
Expand Down
17 changes: 17 additions & 0 deletions docs/SEO-EXPERIMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Reverse chronological. Legend: ✅ Success · ❌ Failed · ⚪ Inconclusive ·

| Date | Entry | Status |
|------|-------|--------|
| 2026-09-08 | [Italian pilot and translation corrections](#2026-09-08-italian-pilot-and-translation-corrections) | Implemented in [PR #77](https://github.com/Darkmatter-AI/deepbreathing/pull/77); production verification pending |
| 2026-08-30 | [Agent-Handoff Discoverability + Attribution](#2026-08-30-agent-handoff-discoverability--attribution) | 🔄 Implemented in PR [#72](https://github.com/Darkmatter-AI/deepbreathing/pull/72) — production verification pending |
| 2026-07-27 | [Index Coverage Hygiene + Canonical-Hijack Recovery](#2026-07-27-index-coverage-hygiene--canonical-hijack-recovery) | 🔄 Implemented |
| 2026-07-22 | [First-Load-JS Webpack Experiment (PR #31) — Production Outage Post-Mortem + Removal](#2026-07-22-first-load-js-webpack-experiment-pr-31--production-outage-post-mortem--removal) | ❌ Failed |
Expand Down Expand Up @@ -94,6 +95,22 @@ See also: [Key Learnings (Jan 2026)](#key-learnings-jan-2026) — synthesis of w

## Active Experiments

### 2026-09-08: Italian Pilot and Translation Corrections

**Hypothesis.** A complete Italian experience on a small, relevant route cohort can earn useful nonbrand search visits. Correcting objective errors in existing translations improves clarity without changing established URL identities or successful keyword targeting. One route-and-language publication policy will keep unfinished translations out of routes, alternate links and sitemaps.

**Baseline.** Research captured September 7–8 using Ahrefs country Google estimates, finalized GSC and hostname/platform-filtered GA4. Production has 331 sitemap URLs across English and five translated languages, with no Italian URLs. For August 9–September 5, translated URL prefixes received 283 GSC clicks and 5,205 impressions. Japanese Tummo accounted for 176 clicks and 1,787 impressions and is a preservation priority. Italy received 3 country-level GSC clicks and 136 impressions; Italian browser-language users numbered 8 in GA4 with 6 users firing a session-start event. Browser language and country are different cohorts. Ahrefs Italy estimates are 6,800 monthly searches for “respirazione diaframmatica”, 1,700 for “esercizi di respirazione”, 700 for “respirazione quadrata”, 600 for “respirazione 4 7 8”, and 400 for “coerenza cardiaca”. Overlapping keyword volumes are not added and are not traffic forecasts.

**Release scope.** Italian home, technique library, belly breathing, box breathing, 4-7-8 timer and coherent breathing, with translated controls, account prompts, privacy and support. Existing-language changes are source-faithful corrections, including clipped Spanish descriptions, French accents and VFC terminology, unclear German instructions, and Japanese count/typo corrections. Preserve the French coherent title and Japanese Tummo search positioning. No native mobile release is included.

**Immediate gates.** Existing canonical URLs remain available. Each published Italian page returns 200 with Italian server-rendered content, self-canonical metadata, reciprocal alternates and no English fallback in the primary interaction. Unpublished Italian paths remain unavailable and are absent from language destinations, alternate links and sitemap entries. Internal links point to an available destination. Existing compiler checks and relevant tests pass. Desktop and mobile browser checks exercise the session controls and language navigation. Production is built from reviewed GitHub main.

**Pre-committed outcome criteria.** At day 28, inspect all Italian pilot URLs for discovery, crawl and canonical status. At day 56, the learning threshold is at least 30 nonbrand GSC clicks to Italian pilot URLs and 10 users starting sessions on Italian pages. These are provisional decision thresholds, not a forecast. Below either threshold, classify as inconclusive and inspect query intent, indexation and session use before expanding; a persistent canonical or route defect is a release failure to fix immediately. Do not treat the breathing_session_end event as validated session completion. Measure the corrected existing-language cohort against the preceding finalized 28-day window, but retain correctness fixes independently of noisy CTR changes.

**Measure after.** 2026-10-06 for indexing; 2026-11-03 for the initial growth decision, assuming September 8 deployment. Shift dates if deployment changes.

**Status.** Implemented and locally verified in [PR #77](https://github.com/Darkmatter-AI/deepbreathing/pull/77) on `codex/languages-italian-20260908`, based on `main@12ae231`. Production verification and supported recrawl receipts will be recorded after release. Agent translation review is not native human certification.

### 2026-08-30: Agent-Handoff Discoverability + Attribution

**Context and baseline.** An older analytics snapshot recorded approximately 32 AI-assistant sessions per week, but that baseline is stale and the broad channel cannot isolate explicit handoffs. The March 2026 `llms.txt` experiment failed its organic-search goal, while its value for assistant discovery was not measured.
Expand Down
40 changes: 28 additions & 12 deletions docs/indexing-queue.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,20 @@
Tracks the index status of every URL. The **Indexed** column is refreshed from the
GSC URL Inspection API by `scripts/gsc-index-status.mjs` (see the `daily-indexing` skill).

The **GSC** and **Bing** date columns are historical. We no longer submit URLs anywhere:
Google has no supported submission API for pages like ours, and Bing is covered
automatically by IndexNow on every production deploy. Do not write new dates into them.
See the 2026-07-09 entry in `SEO-EXPERIMENTS.md`.
The **GSC** and **Bing** date columns below are historical; preserve them. Record
new release receipts in the dated release notes instead. Google supports sitemap
submission and the Search Console browser's Request indexing action. Its general
Indexing API is not eligible for these pages. Bing receives explicit canonical URL
batches through IndexNow; shared or localized diffs can correctly produce no automatic
submission and need a reviewed URL batch.

## Current state (as of 2026-07-27)
## Italian release preparation (2026-09-08)

The local native sitemap contains 339 URLs: the existing 331 plus eight Italian
pages. Production rollout and submission receipts are pending. Italian rows below
have unknown index status; inclusion in a sitemap is not evidence of indexing.

## Historical state (as of 2026-07-27)

- **Rows tracked**: **331**, exactly matching the cleaned canonical sitemap.
- **GSC Page Indexing report baseline**: **270 indexed / 61 not indexed** in the
Expand Down Expand Up @@ -59,14 +67,14 @@ Re-submitted **148 URLs** to GSC + Bing via the mass-translate Indexing API (`re
- **GSC** — ISO date submitted via GSC URL Inspection → Request Indexing or the `mcp__mass-translate-backend__request_indexing` API.
- **Bing** — ISO date submitted via Bing Webmaster → URL Submission or the `mcp__mass-translate-backend__submit_urls_bing` API.

## Submission channels (preferred order)
## Current submission channels

1. **mass-translate MCP API** — fast, batch-friendly, no UI automation.
- `mcp__mass-translate-backend__request_indexing` — Google Indexing API (one URL per call).
- `mcp__mass-translate-backend__submit_urls_bing` — up to 10 URLs per call. **Blocker**: needs Bing Content API key from BWT Settings → API Access → connect via backend.
2. **agent-browser UI** — fallback, slower but works without MCP auth.
- GSC URL Inspection — one URL at a time, ~10-20/day silent cap
- Bing Webmaster URL Submission — paste batch into dialog, 10K/day quota
1. Submit the canonical sitemap through the Search Console Sitemaps API after the
production sitemap is verified. Use browser URL Inspection → Request indexing for
a small priority cohort, subject to the account's available quota.
2. Submit the exact changed/new canonical URLs through IndexNow after checking each
against the live sitemap and its response. An accepted request does not confirm
crawling or indexing. Do not use the retired sitemap ping endpoints.

## Priority rationale

Expand All @@ -81,6 +89,14 @@ Re-submitted **148 URLs** to GSC + Bing via the mass-translate Indexing API (`re

| P | URL | Indexed | GSC | Bing |
|---|---|---|---|---|
| 1 | https://deepbreathingexercises.com/it | | | |
| 3 | https://deepbreathingexercises.com/it/breathe | | | |
| 1 | https://deepbreathingexercises.com/it/breathe/belly | | | |
| 1 | https://deepbreathingexercises.com/it/breathe/box | | | |
| 3 | https://deepbreathingexercises.com/it/breathe/coherent | | | |
| 3 | https://deepbreathingexercises.com/it/4-7-8-breathing-timer | | | |
| 3 | https://deepbreathingexercises.com/it/privacy | | | |
| 3 | https://deepbreathingexercises.com/it/support | | | |
| 1 | https://deepbreathingexercises.com/breathe/9d-breathwork | ✓ | 2026-06-13 | 2026-06-13 |
| 1 | https://deepbreathingexercises.com/breathe/hope-cartel-9d-breathwork | ✓ | 2026-06-13 | 2026-06-13 |
| 2 | https://deepbreathingexercises.com/about/abi | ✓ | 2026-06-13 | 2026-06-13 |
Expand Down
16 changes: 8 additions & 8 deletions docs/native-i18n/INVENTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,21 +235,21 @@ The groups below separate live coupling from migration provenance and historical

| Evidence | Dependency / cutover implication |
|---|---|
| `next.config.js:189` | Keeps locale-prefix stripping only in the legacy proxy build mode; native serving modes release those paths to the App Router. |
| `next.config.js:210` | Keeps locale-prefix stripping only in the legacy proxy build mode; native serving modes release those paths to the App Router. |
| `src/lib/seo/sitemap-routes.mjs:14` | Owns the five proxy prefixes, manufactures locale URLs/hreflang, and keeps `/languages` English-only. |
| `src/lib/seo/sitemap-routes.ts:6` | Typed adapter exposes proxy-specific sitemap constants and URL classification. |
| `src/app/sitemap.xml/route.ts:5` | Publishes locale-prefixed URLs even though the current Next.js app has no native locale route tree. |
| `src/app/sitemap.xml/route.ts:13` | Publishes locale-prefixed URLs even though the current Next.js app has no native locale route tree. |
| `scripts/ping-sitemap.mjs:11` | Builds the canonical URL allowlist used to fail closed when deriving changed-route IndexNow submissions; the legacy-named constant now represents the five published native locale prefixes. |
| `src/app/robots.ts:8` | Carries `/api/proxy/` crawl cleanup and query-parameter rules created for proxy canonical behavior. |
| `src/app/(site-en)/layout.tsx:72` | The English root explicitly selects the shared document language; the proxy currently changes locale-facing HTML outside the app. |
| `src/app/(site-en)/languages/page.tsx:348` | Hardcodes the locale discovery hub; proxy anchor rewriting is why this route is published only in English. |
| `src/app/(site-en)/languages/page.tsx:374` | Hardcodes the locale discovery hub; proxy anchor rewriting is why this route is published only in English. |

### Browser locale and translated-DOM contracts (active)

| Evidence | Dependency / cutover implication |
|---|---|
| `src/components/language-switcher.tsx:16` | Reads the injected proxy global, duplicates locale/path logic, and delays links until hydration to avoid rewritten double-prefix URLs. |
| `src/components/resonance/runtime-phrases.ts:914` | Uses the injected language as the first locale signal for the existing interactive phrase catalog. |
| `src/components/language-switcher.tsx:23` | Reads the injected proxy global, duplicates locale/path logic, and delays links until hydration to avoid rewritten double-prefix URLs. |
| `src/components/resonance/runtime-phrases.ts:1227` | Uses the injected language as the first locale signal for the existing interactive phrase catalog. |
| `apps/mobile/src/components/breathing-web/runtime-phrases.ts:498` | Mobile web-content copy mirrors the same injected-global locale detection. |
| `src/components/resonance/Resonance.tsx:13` | Consumes the runtime phrase resolver and reports fallback misses; native routing must provide its locale explicitly. |
| `src/components/auth/sign-in-sheet.tsx:9` | Detects the proxy-backed runtime locale before resolving sign-in copy. |
Expand Down Expand Up @@ -328,9 +328,9 @@ The groups below separate live coupling from migration provenance and historical
| `CLAUDE.md:100` | Canonical project guidance still documents proxy URL semantics and old OAuth context. |
| `AGENTS.md:21` | Project environment declares the origin application endpoint. |
| `.claude/skills/daily-indexing/SKILL.md:19` | Correctly states that MassTranslate submission/OAuth paths are retired for indexing; keep this negative dependency true. |
| `docs/runbooks/tools-and-data-sources.md:58` | Primary live runbook for proxy cache, signed-webhook bypass, URL semantics, and remaining GSC/Bing fallbacks. |
| `docs/runbooks/tools-and-data-sources.md:68` | Primary live runbook for proxy cache, signed-webhook bypass, URL semantics, and remaining GSC/Bing fallbacks. |
| `docs/runbooks/weekly-funnel-refresh.md:78` | Still contains MassTranslate GSC/Bing synchronization commands and OAuth recovery steps. |
| `docs/indexing-queue.md:44` | Contains operational and historical references to MassTranslate URL-submission tools. |
| `docs/indexing-queue.md:52` | Contains operational and historical references to MassTranslate URL-submission tools. |
| `docs/FUNNEL-DASHBOARD.md:154` | A dated dashboard snapshot names MassTranslate as a prior GSC data source. |

### App Store submission notes (active)
Expand All @@ -343,7 +343,7 @@ The groups below separate live coupling from migration provenance and historical

| Evidence | Dependency / cutover implication |
|---|---|
| `docs/SEO-EXPERIMENTS.md:236` | Permanent experiment history for proxy defects, mitigations, and indexing outcomes. |
| `docs/SEO-EXPERIMENTS.md:253` | Permanent experiment history for proxy defects, mitigations, and indexing outcomes. |
| `docs/UX-BACKLOG.md:102` | Historical ownership and translation-coverage findings. |
| `docs/qa-reports/traction-pages-2026-06-06.md:9` | Production evidence for delayed translation, partial coverage, and hydration failures. |
| `docs/research/eeat-citations-2026-05.md:16` | A dated content-research decision record. |
Expand Down
10 changes: 10 additions & 0 deletions docs/runbooks/tools-and-data-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ If any of these change, update this file FIRST, then update FUNNEL-DASHBOARD.md

---

## Current native-language release workflow (2026-09-08)

The July native-language cutover supersedes the proxy-specific notes retained below. Current translated content is repository-owned and server-rendered. Do not deploy new translations through MassTranslate, infer English fallback from an old proxy observation, or warm the retired proxy cache. Verify the current route response and browser state.

Production web releases must follow the `CLAUDE.md` provenance guard: review a branch, merge to GitHub `main`, then verify the Git integration's production deployment SHA and live aliases. Never promote a feature-branch deployment to production.

For a partial language rollout, maintain one publication policy for routable pages, internal destinations, language choices, sitemap membership and alternate links. Registering a language does not make every translated page ready. Translate and review the complete interaction and safety copy for each published route.

After verifying production, submit the canonical sitemap using the [Search Console Sitemaps API](https://developers.google.com/webmaster-tools/v1/sitemaps/submit). Google's [URL Inspection request-indexing flow](https://developers.google.com/search/docs/crawling-indexing/ask-google-to-recrawl) supports a small priority cohort. The API for general URL inspection is read-only; the separate Google Indexing API does not support these pages. For Bing, use [IndexNow](https://www.indexnow.org/documentation) with the exact verified changed/new URLs. Submission acceptance is not proof of crawling or indexing. Existing postbuild automation fails closed on ambiguous shared or locale content changes; inspect its receipt before deciding whether an explicitly authorized exact-URL submission is needed.

## Per-task lookup table

### Pull GA4 funnel data
Expand Down
Loading
Loading