Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
eeea5b1
feat(toolify): contextual recent-tool navigation on detail pages
appdevelopsk Nov 5, 2026
0ec9ac8
feat(toolify): place return-visit navigation below related tools
appdevelopsk Nov 5, 2026
d24551c
feat(analytics): distinguish recent-tool navigation from contextual r…
appdevelopsk Nov 5, 2026
59c6567
feat(analytics): distinguish recent-tool navigation from contextual r…
appdevelopsk Nov 5, 2026
4ce2ea5
feat: add deterministic recent-tool recommendation selector
appdevelopsk Nov 5, 2026
6fa4195
fix: skip stale and duplicate recent tool history
appdevelopsk Nov 5, 2026
65ce6ab
test(toolify): cover recent-tool selection and first-visit cases
appdevelopsk Nov 5, 2026
48858b8
docs: release QA, GA4 evaluation and privacy gates for engagement fea…
appdevelopsk Nov 5, 2026
59aa863
feat: percentage calculator A/B scenario compare without persistent i…
appdevelopsk Nov 5, 2026
220cb61
refactor: pure percentage scenario computation for A/B comparison
appdevelopsk Nov 5, 2026
4d95aaa
test: percentage scenario modes and invalid inputs
appdevelopsk Nov 5, 2026
b89cfe3
i18n: localize percentage A/B scenario controls in 17 locales
appdevelopsk Nov 5, 2026
3f6c3d1
i18n: use localized A/B controls across 17 locales
appdevelopsk Nov 5, 2026
54211ba
feat: opt-in 7-day percentage draft storage with strict validation
appdevelopsk Nov 5, 2026
1f2f5d6
i18n: add 17-locale opt-in resume and privacy labels
appdevelopsk Nov 5, 2026
e03d06e
feat: explicit local-only save, restore and delete for percentage tool
appdevelopsk Nov 5, 2026
d1ee822
test: percentage resume validates expiry, bounds and malformed storage
appdevelopsk Nov 5, 2026
bbc8853
fix: avoid meaningless delta across incompatible percentage modes
appdevelopsk Nov 5, 2026
6567602
docs: percentage compare, opt-in resume, QA and privacy release gate
appdevelopsk Nov 5, 2026
6bd286e
fix(ci): auto-fix failing CI (PR #39)
appdevelopsk Nov 5, 2026
425a5c3
fix: reject malformed and whitespace-only percentage inputs
appdevelopsk Nov 5, 2026
d086d67
test: reject malformed percentage text and blank input
appdevelopsk Nov 5, 2026
267c96c
feat(analytics): privacy-safe scenario comparison and resume interact…
appdevelopsk Nov 5, 2026
196636e
feat: track scenario controls without transmitting calculator values
appdevelopsk Nov 5, 2026
6458f34
fix: accept only decimal percentage inputs
appdevelopsk Nov 5, 2026
4eb7b77
test: decimal-only inputs including negative fractions
appdevelopsk Nov 5, 2026
a9c12ad
docs: extend privacy-safe event and parser regression verification
appdevelopsk Nov 5, 2026
575a42b
fix(ci): auto-fix failing CI (PR #39)
appdevelopsk Nov 5, 2026
8937dc4
fix: reject invalid or non-calculable percentage drafts at save and r…
appdevelopsk Nov 5, 2026
a35d171
fix: revalidate expiry on resume and disable saving invalid scenarios
appdevelopsk Nov 5, 2026
4db346a
test: reject invalid, non-calculable and malformed stored scenarios
appdevelopsk Nov 5, 2026
db02124
docs: record targeted strict TypeScript/22 assertions, expiry fix and…
appdevelopsk Nov 5, 2026
533d2a7
a11y: expose selected percentage mode and label comparison group
appdevelopsk Nov 5, 2026
453cdc0
a11y: label percentage mode group with calculator title
appdevelopsk Nov 5, 2026
b3a918f
test: verify A/B and resume copy across every active locale
appdevelopsk Nov 5, 2026
736f40e
docs: document a11y and locale regression tests, keep release gate cl…
appdevelopsk Nov 5, 2026
7df8d3d
fix: don't claim draft deletion succeeded when browser storage reject…
appdevelopsk Nov 5, 2026
ff6fbe6
chore: add non-deploying local PR39 test/typecheck/build release gate
appdevelopsk Nov 5, 2026
a6e4c67
docs: record local release runner, storage deletion fix and live prod…
appdevelopsk Nov 5, 2026
5fb3dcb
fix: bound percentage input restoration from untrusted share URLs
appdevelopsk Nov 5, 2026
54ed812
chore: add locale index-policy audit to manual engagement release gate
appdevelopsk Nov 5, 2026
0f9e4d5
docs: note bounded share URL restoration and index-policy release audit
appdevelopsk Nov 5, 2026
37845dd
fix: guard invalid time when serializing opt-in draft
appdevelopsk Nov 5, 2026
2d71bc9
test: guard nonfinite and negative draft timestamps
appdevelopsk Nov 5, 2026
2482eda
docs: save PR39 verification evidence and remaining blockers
appdevelopsk Nov 5, 2026
b31f1d2
fix: cap percentage input length to avoid unbounded URL state
appdevelopsk Nov 5, 2026
3482cd1
docs: note confirmed isolated checks and 40-character input hardening
appdevelopsk Nov 5, 2026
531b091
fix: validate shared percentage state atomically before restoring
appdevelopsk Nov 5, 2026
a6c4f16
fix: restore shared calculator fields only when all three are valid
appdevelopsk Nov 5, 2026
cf29fe9
test: reject partial and malformed share URL state
appdevelopsk Nov 5, 2026
d95c399
docs: record atomic share state fix and 38 independent checks
appdevelopsk Nov 5, 2026
6c12e6d
fix: avoid repeating related tools in recent tool recommendations
appdevelopsk Nov 5, 2026
ff93e26
feat: recent navigation excludes tools already linked in related section
appdevelopsk Nov 5, 2026
8e3c65f
feat: pass existing related tool slugs into recent recommendations
appdevelopsk Nov 5, 2026
691a9fb
test: skip overlap between recent and related tool suggestions
appdevelopsk Nov 5, 2026
b087112
docs: record deduplicated recirculation QA and unavailable live audits
appdevelopsk Nov 5, 2026
dc43c0b
docs: prioritize evidence-led engagement work and identify measuremen…
appdevelopsk Nov 5, 2026
b10f227
ux: surface related and recent tool paths before ads, retain existing…
appdevelopsk Nov 5, 2026
e394ad9
test: guard tool follow-up placement and existing ad inventory
appdevelopsk Nov 5, 2026
a4dcc7e
docs: capture result-first navigation experiment and analytics access…
appdevelopsk Nov 5, 2026
18fab6c
perf: replace ShareBar URL polling with change and history events
appdevelopsk Nov 5, 2026
1a381f7
perf: notify share controls when manually encoded tool URL changes
appdevelopsk Nov 5, 2026
29f10ef
perf: notify share controls when generic encoded tool URL changes
appdevelopsk Nov 5, 2026
7f09be0
test: prevent share URL timer regression and require notifications fr…
appdevelopsk Nov 5, 2026
ccd3e20
docs: track ShareBar event-driven update and browser QA gate
appdevelopsk Nov 5, 2026
57ba893
security: exclude hidden/password inputs and reject oversized generic…
appdevelopsk Nov 5, 2026
c12764b
security: cap manual share URL serialization and decoding size
appdevelopsk Nov 5, 2026
0a9bdc3
security: centralize share input-type and encoded-size policy
appdevelopsk Nov 5, 2026
fac8bfb
security: apply tested sharing policy to generic URL state
appdevelopsk Nov 5, 2026
e49eb8e
test: forbid password/hidden share input leakage and oversized payloads
appdevelopsk Nov 5, 2026
3817043
docs: record share URL security hardening and independent policy asse…
appdevelopsk Nov 5, 2026
66bdd64
security: exclude contact and autofill identity fields from generic s…
appdevelopsk Nov 5, 2026
e9824f2
security: apply private/autofill field filter on auto shared inputs
appdevelopsk Nov 5, 2026
d3b22c1
test: protect autofill and marked-private fields while keeping numeri…
appdevelopsk Nov 5, 2026
9b114f1
docs: accurately warn that shared URL state can leave the device
appdevelopsk Nov 5, 2026
ea4641a
docs: accurately warn that shared URL state can leave the device
appdevelopsk Nov 5, 2026
a61018b
test: guard share-input PII filtering in integration and URL size enf…
appdevelopsk Nov 5, 2026
26b545b
docs: record PII-aware shared URL protections and local policy checks
appdevelopsk Nov 5, 2026
a4f53c1
security: honor private markers on ancestor field groups as well as c…
appdevelopsk Nov 5, 2026
d55c63d
test: assert private marker inherited from fieldset/parent container
appdevelopsk Nov 5, 2026
f3fcffc
integrate(growth): add docs/GROWTH_RELEASE_GATE_2026-11-05.md
appdevelopsk Nov 5, 2026
9d383a9
integrate(growth): add site/scripts/check-live-growth.mjs
appdevelopsk Nov 5, 2026
9b2631c
integrate(growth): add site/scripts/growth-html-checks.mjs
appdevelopsk Nov 5, 2026
4efe5c8
integrate(growth): add site/scripts/growth-html-checks.test.mjs
appdevelopsk Nov 5, 2026
d7b470a
integrate(growth): add site/src/components/tools/ToolSoftwareRecommen…
appdevelopsk Nov 5, 2026
faedd0a
integrate(growth): add site/src/components/tools/ToolSoftwareRecommen…
appdevelopsk Nov 5, 2026
57b8caf
integrate(growth): add site/src/lib/software/recommendations.ts
appdevelopsk Nov 5, 2026
d540ba7
integrate(growth): preserve tested site/package.json
appdevelopsk Nov 5, 2026
8734b49
integrate(growth): preserve tested site/src/components/software/Softw…
appdevelopsk Nov 5, 2026
e686aa2
integrate(growth+engagement): preserve recent tools and software CTA …
appdevelopsk Nov 5, 2026
832d14e
integrate(growth+engagement): retain scenario/recent and software GA4…
appdevelopsk Nov 5, 2026
2f7493f
docs(integration): document PR38+PR39 verification and release gates
appdevelopsk Nov 5, 2026
b94a261
fix(growth): put relevant free-software CTA before ad blocks
appdevelopsk Nov 5, 2026
3019856
test(integration): guard software CTA location ahead of ads
appdevelopsk Nov 5, 2026
91da8c9
sync(integration): carry forward latest PR39 safeguard docs/PR39_VERI…
appdevelopsk Nov 5, 2026
980a622
sync(integration): carry forward latest PR39 safeguard site/src/lib/h…
appdevelopsk Nov 5, 2026
a2ff752
sync(integration): carry forward latest PR39 safeguard site/src/lib/h…
appdevelopsk Nov 5, 2026
7977929
sync(integration): refresh latest PR39 share restoration regression c…
appdevelopsk Nov 5, 2026
4275c88
docs(integration): capture executed Node tests, CTA order and moving …
appdevelopsk Nov 5, 2026
254cdb9
sync(integration): carry latest PR39 verification evidence
appdevelopsk Nov 5, 2026
b2ce2c8
test(integration): include growth HTML tests in existing local releas…
appdevelopsk Nov 5, 2026
7b0a116
docs(integration): record one-command no-Actions full release gate
appdevelopsk Nov 5, 2026
4556726
sync(integration): bring PR39 search safety site/src/lib/search/searc…
appdevelopsk Nov 6, 2026
c6035cf
sync(integration): bring PR39 search safety site/src/lib/search/searc…
appdevelopsk Nov 6, 2026
5bd7bf0
sync(integration): bring PR39 search safety site/src/lib/search/useSe…
appdevelopsk Nov 6, 2026
c7991a3
sync(integration): bring PR39 search safety site/src/lib/search/useSe…
appdevelopsk Nov 6, 2026
d64cd5b
test(integration): add dependency-free cross-PR UI and analytics regr…
appdevelopsk Nov 6, 2026
252e923
chore(integration): expose Node cross-PR verification command
appdevelopsk Nov 6, 2026
4ae1923
test(integration): run cross-PR regressions in local release gate
appdevelopsk Nov 6, 2026
83bb1c7
sync(integration): update PR39 latest validated search data site/src/…
appdevelopsk Nov 6, 2026
585f349
sync(integration): update PR39 latest validated search data site/src/…
appdevelopsk Nov 6, 2026
eec4a40
sync(integration): update PR39 latest validated search data docs/PR39…
appdevelopsk Nov 6, 2026
5476c40
docs(integration): record updated PR39 search safety and local regres…
appdevelopsk Nov 6, 2026
45b51f9
fix(growth): prevent script hydration text from satisfying live CTA c…
appdevelopsk Nov 6, 2026
80da8ab
test(growth): reject faux anchors inside hydration scripts and style …
appdevelopsk Nov 6, 2026
6dae305
docs(integration): record full PR39 file parity and executable script…
appdevelopsk Nov 6, 2026
ded9abb
sync(integration): adopt latest PR39 privacy-safe sharing docs/PR39_V…
appdevelopsk Nov 6, 2026
b66647f
sync(integration): adopt latest PR39 privacy-safe sharing site/src/co…
appdevelopsk Nov 6, 2026
edb07b5
sync(integration): adopt latest PR39 privacy-safe sharing site/src/li…
appdevelopsk Nov 6, 2026
1cbfaf8
sync(integration): adopt latest PR39 privacy-safe sharing site/src/li…
appdevelopsk Nov 6, 2026
07695ef
fix(integration): prevent release gate running against wrong git branch
appdevelopsk Nov 6, 2026
53d02a5
docs(integration): record real isolated Node checks and strict releas…
appdevelopsk Nov 6, 2026
88275cd
sync(integration): align current PR39 verification docs/PR39_VERIFICA…
appdevelopsk Nov 6, 2026
393f97c
sync(integration): align current PR39 verification site/src/lib/searc…
appdevelopsk Nov 6, 2026
e16f27d
fix(growth): ignore comment and hydration markup in all live SEO checks
appdevelopsk Nov 6, 2026
93ccec8
test(growth): reject commented and hydrated fake SEO tags
appdevelopsk Nov 6, 2026
6dcd489
docs(integration): record executed SEO smoke tests and latest PR39 pa…
appdevelopsk Nov 6, 2026
4a17e50
sync(integration): trust-only engagement regression test
appdevelopsk Nov 6, 2026
1c1db76
sync(integration): user-trusted interaction event safeguard
appdevelopsk Nov 6, 2026
d9b4496
test(integration): protect trusted-user-only engagement telemetry
appdevelopsk Nov 6, 2026
8a1d94f
sync(integration): refresh PR39 docs/PR39_VERIFICATION_2026-11-05.md
appdevelopsk Nov 6, 2026
a881ff2
sync(integration): refresh PR39 site/src/components/tools/ToolInterac…
appdevelopsk Nov 6, 2026
f81e40d
sync(integration): refresh PR39 site/src/components/tools/ToolInterac…
appdevelopsk Nov 6, 2026
bc07617
test(integration): guard engagement event reset and delayed cleanup
appdevelopsk Nov 6, 2026
f80a966
docs(integration): record latest PR39 parity and telemetry lifecycle …
appdevelopsk Nov 6, 2026
0fc3aa4
sync(integration): latest PR39 safeguards docs/PR39_VERIFICATION_2026…
appdevelopsk Nov 6, 2026
b2a1188
sync(integration): latest PR39 safeguards site/src/lib/hooks/share-in…
appdevelopsk Nov 6, 2026
88e0d9e
sync(integration): latest PR39 safeguards site/src/lib/hooks/share-in…
appdevelopsk Nov 6, 2026
6e2ce79
sync(integration): latest PR39 safeguards site/src/lib/hooks/share-in…
appdevelopsk Nov 6, 2026
1867acb
sync(integration): latest PR39 safeguards site/src/lib/hooks/useAutoS…
appdevelopsk Nov 6, 2026
48296ab
test(integration): safeguard PII-aware generic share field exclusions
appdevelopsk Nov 6, 2026
ed27dd3
docs(integration): capture latest sensitive-field policy and five int…
appdevelopsk Nov 6, 2026
bd31422
sync(integration): carry latest PR39 docs/PR39_VERIFICATION_2026-11-0…
appdevelopsk Nov 6, 2026
780aecd
sync(integration): carry latest PR39 site/src/components/tools/ShareB…
appdevelopsk Nov 6, 2026
d2aca46
sync(integration): carry latest PR39 site/src/lib/hooks/useAutoSharea…
appdevelopsk Nov 6, 2026
bc3f82f
sync(integration): carry latest PR39 site/src/lib/hooks/useShareableS…
appdevelopsk Nov 6, 2026
d87da8a
fix(seo): inspect X-Robots-Tag HTTP header for unintended noindex
appdevelopsk Nov 6, 2026
d3311ba
fix(seo): include HTTP robots directives in live growth smoke
appdevelopsk Nov 6, 2026
80bcf73
test(seo): ensure HTTP X-Robots-Tag noindex is detected without false…
appdevelopsk Nov 6, 2026
573c4aa
docs(integration): record robots HTTP header checks and isolated Node QA
appdevelopsk Nov 6, 2026
027fdad
docs(integration): record limited 3-day GSC evidence, avoid unsupport…
appdevelopsk Nov 6, 2026
d8d7134
sync(integration): PR39 recent fix docs/PR39_VERIFICATION_2026-11-05.md
appdevelopsk Nov 6, 2026
20730f5
sync(integration): PR39 recent fix site/src/lib/hooks/share-input-pol…
appdevelopsk Nov 6, 2026
2c28789
sync(integration): PR39 recent fix site/src/lib/hooks/share-input-pol…
appdevelopsk Nov 6, 2026
8413645
sync(integration): PR39 recent fix site/src/lib/hooks/share-input-pol…
appdevelopsk Nov 6, 2026
d75d622
fix(test): update combined share policy assertions for explicit text …
appdevelopsk Nov 6, 2026
b06aa77
docs(integration): record explicit-text sharing safety and test repair
appdevelopsk Nov 6, 2026
251b070
sync(integration): refresh PR39 docs/PR39_VERIFICATION_2026-11-05.md
appdevelopsk Nov 6, 2026
85c4313
sync(integration): refresh PR39 site/src/lib/hooks/share-input-policy…
appdevelopsk Nov 6, 2026
2139ad1
sync(integration): refresh PR39 site/src/lib/hooks/share-input-policy…
appdevelopsk Nov 6, 2026
c585787
sync(integration): refresh PR39 site/src/lib/hooks/share-input-policy.ts
appdevelopsk Nov 6, 2026
ff30cf3
sync(integration): refresh PR39 site/src/lib/hooks/useAutoShareableSt…
appdevelopsk Nov 6, 2026
5ee2fcf
test(integration): guard untrusted URL restore and stale shared-state…
appdevelopsk Nov 6, 2026
7072e68
docs(integration): record validated share restoration and source-chec…
appdevelopsk Nov 6, 2026
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
39 changes: 39 additions & 0 deletions docs/ENGAGEMENT_NEXT_WAVE_2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Toolify365 — engagement improvement follow-up (2026-11-05)

## Implemented in draft PR #39
- Recently visited links on tool pages, limited to 3; now exclude both current/unknown/duplicate and any destination already shown by the existing related-tools row.
- Percentage-calculator A/B comparison and explicit local draft save/restore/delete, 7-day expiry, 17-language text.
- Analytics: `recent_tool_click` and `scenario_action` (IDs only; no user-entered numbers).
- Standalone verification: pure-module strict TypeScript passed; 29 earlier independent assertions, 9 shared-state checks and 6 recent-link-selection checks passed separately. **Not full project Vitest/Next build**.

## Current release blocks
1. Full checkout cannot be fetched from this environment due to DNS resolution of github.com. Run `bash scripts/check-engagement-release.sh` on an owner-accessible clone.
2. Manual en/ja desktop/mobile keyboard, share-link, unavailable browser storage, expired draft, consent and GA4 DebugView QA.
3. Merge only after those checks; VPS deployment and post-deploy smoke test belong to owner.
4. HYPD live-browser and Lighthouse endpoints were not available on the connected plan, so no real mobile performance score was obtained. HYPD GA4 account summaries returned no **selected** properties; do not claim measured engagement improvements.

## Additional work worth doing after release, in impact order
**P0 — use evidence, not time-on-page alone.** Establish last 28 days vs preceding 28 days: engaged sessions, engagement rate, average engagement time per session, pages/session, `calculate`, `recent_tool_click`, `related_click`, `scenario_action`, affiliate click and revenue. Break down by tool landing page, device, locale and source. Deduplicate returning navigation and avoid counting passive tabs as improvement. Register necessary GA4 custom dimensions (event-scoped `destination_tool`, `action`) if they are absent; verify consent first.

**P1 — test on high-intent tools only.** Pick the top 5 landing pages from GA4 with enough traffic and the lowest engaged-session ratio; verify tool result is visible in first mobile viewport and no ad obscures it. Prioritize task completion, then a single logically related next action. Do not add generic link blocks or timers just to inflate average duration.

**P2 — contextual workflows.** After successful % calculator comparison, test task-specific save/compare for loan, tip and other numeric tools only if a privacy review confirms their inputs are safe for local persistence. For free-text, health, financial identifiers or uploads, avoid blanket auto-save.

**P3 — speed and A/B rollout.** Measure mobile Lighthouse LCP/INP/CLS, test reserved ad space and lazy loading, validate language navigation and ad placement. Roll out behind a tested feature gate or short evaluation window when analytics/sample size supports it. Roll back if tool completion or mobile performance worsens.

## Operational release policy
PR #39 stays draft / NO-GO until full build and real-device QA succeed. This document is a plan for further implementation, not a claim of production changes, conversion lifts or GA4 access.

## Additional implementation: result-first navigation (2026-11-05)
- `ToolFrame` now shows the existing related tool row and the new recent tool row **immediately after the workspace, before the below-result and banner ad units**. Both ad units, the in-article ad, and sidebar ad are retained; this is an ordering change, not an ad removal.
- The previous related/recent deduplication means suggestions maximize distinct follow-up actions.
- Added `site/src/components/tools/ToolFrame.order.test.ts` to enforce source-level order and retained ad components. This test was committed but has NOT been run inside the project's Vitest environment.
- GitHub code readback confirmed the order after commit; visual, iPhone, ad placement and RPM impact still require real device QA and post-release measurement.
- `percentage-calculator` was verified present in `MANUAL_SHARE_SLUGS`: its own `useShareableState` intentionally disables generic URL writing from `useAutoShareableState`, so this PR does not need to add a second serialization path.
- GA4 cannot currently be queried with the selected connection: HYPD reports connected GA4 accounts but no selected property. Select the Toolify365 property before any baseline analysis; do not infer current engagement from other businesses.

## ShareBar URL polling optimization (2026-11-05)
- Replaced unconditional one-second URL polling with change events and history/BFCache resynchronization.
- Both manual and automatic share hooks now notify the result-link control immediately after replaceState.
- Added source-level regression tests in ShareBar.events.test.ts; full project Vitest and browser tests not run.
- Validate result-link availability after edits, navigation and tab restoration before release. No performance uplift claimed.
86 changes: 86 additions & 0 deletions docs/GROWTH_RELEASE_GATE_2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Toolify365 Growth Release Gate — 2026-11-05

Related: #37, PR #38. No GitHub Actions are required or authorized for this rollout.

## Existing SEO safeguards (do not duplicate)
- `src/app/sitemap.ts`: generates only URLs selected by `isIndexableIn` / `indexableLocalesFor`.
- `src/app/robots.ts`: publishes robots/sitemap configuration.
- `src/lib/seo/metadata.ts`: canonical, robots and hreflang.
- `src/lib/tools/registry.ts`: demand-ranked core index allowlist + selective locale exceptions.
- `scripts/audit-seo.ts`, `scripts/report-index-policy.ts`, `scripts/indexnow.ts`: existing audits and index notification.

**Do not** bulk-index all 223 tools × 17 locales. GSC index coverage is NOT the same as the count of URLs intended for indexing.

## Local verification from repository root

```bash
cd site
npm ci
npm run typecheck
npm run test
npm run validate
npm run audit:seo
npm run audit:i18n
npm run audit:index-policy -- --json
npm run build
```

These checks need a machine with dependencies and network/required build environment. If any check fails, do not merge or deploy. Follow existing `prebuild` exchange-rate freshness policy; do not bypass it to force a green build.

## Browser QA before production
1. Check en and ja pages `/tools/character-frequency` and `/tools/reverse-text-generator`: free software CTA appears below tool and links to Text Batch Studio with correct locale.
2. Check `/tools/csv-json-converter` and `/tools/json-formatter`: only currently available CSV Cleaner Pro and JSON Studio destinations appear.
3. Confirm a tool with no mapping does not show an empty software panel.
4. On mobile and keyboard navigation, confirm CTA focus, labels and layout.
5. Check `/software/{csv-cleaner-pro,json-studio,text-batch-studio}` processing / downloading still work, and failed input still gives the previous error.
6. Consent/debug QA: `software_click` fires on CTA, `software_process` on process success/failure and `software_download` on a download click. No user-entered text, file name or file contents are sent. Without GA configuration events are safe no-ops.
7. Verify live canonical host is `https://toolify365.com`, and check HTTP 200, robots/sitemap and hreflang reciprocal URLs manually. Search-result snippets can lag deployment.

## GA4 definitions
Create event-scoped custom dimensions (where not already present): `tool_slug`, `locale`, `destination`, `software_slug`. Do not register redundant fields. Analyze:
- Organic landing sessions → `calculate` → `software_click`
- `software_click` → `software_process` successful
- `software_process` → `software_download`
Count users/sessions when possible, not only raw events. Exclude internal traffic. Not all click-through events guarantee successful navigation or file download.

## Search prioritization
- Obtain last 28 finalized days and prior 28 days from GSC / Bing, grouped by page + query + locale/country + device.
- Work on high-impression, low-CTR indexed pages first; ensure unique title, accurate introduction, examples and FAQ.
- Expand `INDEX_EXCEPTIONS` only for verified demand with localized content; 5–10 pairs at a time, assess after 28 days, rollback if indexing/crawl quality degrades.
- Do not automatically post marketing links to unrelated communities or create scaled thin pages.

## Deployment and rollback
- After all gates pass, merge PR #38 and deploy by the site's owner-managed process.
- Verify direct URLs and GA4 DebugView, then submit **changed, valid, canonical** URLs using existing IndexNow script (not Google).
- Record release commit, timestamp, and post-release GA4/GSC/Bing baseline.
- If UI/processing or analytics regress, revert PR #38 and redeploy; do not edit the sitemap allowlist as part of rollback unless it changed.

## Current evidence
Source-only reviews are not equivalent to running the above commands. The connected GSC access returned a 3-day sample (2026-10-31 to 2026-11-02) with no suggested opportunities; it cannot establish a 28-day comparison or zero traffic.

## Post-deployment automated smoke check (new)
Run only **after** a successful owner deployment:
```bash
cd site
SITE_URL=https://toolify365.com npm run audit:live-growth
```
This performs read-only HTTP checks on key en/ja tool and software pages, expected contextual CTA HTML, canonical presence, robots and sitemap. HTTP connectivity is required; a failure from a restricted runner is NOT proof that the production site is down. This script is not a substitute for browser interaction tests, GA4 DebugView, live Search Console URL Inspection or a local production build.

## Extended release safeguards (2026-11-05)
The `audit:live-growth` script now also checks that known index-eligible core tool pages do **not** return a noindex meta tag and appear in the served sitemap, while verifying same-origin self-canonical and unexpected redirects. This is a *post-deployment* check; it intentionally fails when the current production deployment does not yet contain the PR's CTA. Do not run it as a pre-deploy gate against the old production version.

## Dependency-free regression test (2026-11-05)
`cd site && npm run test:smoke-html` runs the Node built-in test suite for HTML meta robots, canonical extraction, and actual on-domain, same-locale software CTA anchor detection. This was also exercised in an isolated Node.js 22 environment (3 test groups passing). It is **not** a substitute for Next.js/Vitest full tests, real browser QA or deploy verification.

## Parallel PR integration guard — PR #39
PR #39 (engagement) also edits `site/src/components/tools/ToolFrame.tsx` and `site/src/lib/analytics/events.ts`, both changed in this PR #38. Do **not** overwrite either file with an entire version copied from one PR while merging the other.

When integrating:
1. Rebase/merge both branches locally in a scratch branch (not `main`).
2. Preserve in `ToolFrame.tsx` BOTH PR #39's engagement/navigation UI and PR #38's `ToolSoftwareRecommendations` section.
3. Preserve in `events.ts` ALL existing event exports plus PR #39 event changes and PR #38 `trackSoftwareClick`, `trackSoftwareProcess`, `trackSoftwareDownload`.
4. Resolve conflicts, run TypeScript, all tests including `test:smoke-html`, audits and build, and review DOM/keyboard order of CTA vs related/recents.
5. Only after passing checks merge/release through the owner process. Avoid untested sequential merges.

## Isolated execution evidence
Node.js 22 `node --test` was run on exact reproduced copies of `growth-html-checks.mjs` and its test cases in the working container: 3/3 subtests passed (robots/googlebot; canonical; valid destination/locale/origin). This does **not** validate the complete Next.js application, GitHub PR head in a cloned checkout, nor the deployed website.
Loading
Loading