Skip to content

feat(measurement): add Website Correction conversion signal - #11

Merged
nish3451 merged 2 commits into
mainfrom
nightly/public-conversion-signal
Aug 7, 2026
Merged

feat(measurement): add Website Correction conversion signal#11
nish3451 merged 2 commits into
mainfrom
nightly/public-conversion-signal

Conversation

@nish3451

@nish3451 nish3451 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • adds a first-party, allowlisted source marker handoff for The Website Correction application route
  • makes the marker visible/editable in the email subject without analytics, cookies, fingerprinting, or auto-send
  • documents owner, retention, privacy boundary, and the rule that tags are not completed applications
  • adds a deterministic 120-check regression test wired into npm test and npm run ci

intended-outcome: make reviewed-service source handoff measurable without analytics or auto-send
verify: node scripts/test-public-conversion-signal.mjs passes (120 checks); npm test and npm run ci retain only the pre-existing test-active-operator-surfaces.mjs:143 failure; sgscan has no new findings; git diff --check passes

Known baseline: the existing operator-surface test fails on clean origin/main at the same assertion.

Co-Authored-By: Claude noreply@anthropic.com

Summary by CodeRabbit

  • New Features
    • Added a “The Website Correction” application section to the contact page.
    • Updated Website Correction links to route visitors to the application section.
    • Added an email CTA with optional source markers and recognized source-specific subject lines.
  • Privacy
    • Clarified that the flow does not use analytics, cookies, fingerprinting, or message collection.
  • Documentation
    • Documented conversion signal tagging, propagation, retention, and validation.
  • Tests
    • Added automated checks for CTA tagging, source propagation, manual email submission, and privacy boundaries.

intended-outcome: make reviewed-service source handoff measurable without analytics or auto-send\nverify: node scripts/test-public-conversion-signal.mjs (120 checks passed); npm test and npm run ci retain only the pre-existing operator-surface failure; sgscan findings unchanged; git diff --check passed\n\nCo-Authored-By: Claude <noreply@anthropic.com>

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c3a2c2b9-ddeb-461f-862f-e21a031ccfa7

📥 Commits

Reviewing files that changed from the base of the PR and between d2d9659 and fc37f5b.

📒 Files selected for processing (2)
  • public/contact/index.html
  • public/index.html
🚧 Files skipped from review as they are similar to previous changes (1)
  • public/contact/index.html

📝 Walkthrough

Walkthrough

The PR defines a Website Correction conversion signal, adds source-aware manual email submission, documents privacy and counting rules, and validates the contract through npm test and CI scripts.

Changes

Website Correction conversion signal

Layer / File(s) Summary
Signal contract and validation rules
docs/measurement/public-conversion-signal.md, scripts/test-public-conversion-signal.mjs
Documents registered sources, subject propagation, ownership, retention, privacy boundaries, and application-counting rules. The validator checks these requirements.
Contact-page application flow
public/index.html, public/contact/index.html, scripts/test-public-conversion-signal.mjs
Routes Website Correction CTAs to the contact-page application section. Recognized source values update the editable email subject. Unrecognized or missing values keep the default subject.
Automated enforcement
scripts/test-public-conversion-signal.mjs, package.json
Rejects analytics, cookies, fingerprinting, and prohibited collection APIs. Runs the validator during test and CI commands.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Visitor
  participant Homepage
  participant ContactPage
  participant EmailClient
  Visitor->>Homepage: Select the Website Correction CTA
  Homepage->>ContactPage: Open the application route with source
  ContactPage->>ContactPage: Validate the source query value
  ContactPage->>EmailClient: Create an editable mailto subject
  Visitor->>EmailClient: Review and manually send the application
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: adding a Website Correction conversion signal.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch nightly/public-conversion-signal

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/measurement/public-conversion-signal.md`:
- Around line 33-36: Update the documentation paragraph around “The Website
Correction” to remove the exact validator-forbidden phrase “reviewed service,”
while preserving the intended distinction between the offer name and its
human-reviewed description.
- Around line 10-13: Update the CTA contract in the documentation to define
source CTAs as inbound placement links, or explicitly exempt the direct
contact-page application link from the data-measure-source requirement. Preserve
the requirement for stable source tags on all other qualifying placement links.

In `@scripts/test-public-conversion-signal.mjs`:
- Around line 157-158: Update the final validation around checks and failures in
the test script so the reported result is verifiable: either use a fixed
homepage CTA fixture and assert exactly 120 checks, or revise the stated
verification result to reflect the dynamic count of 116 checks plus three per
CTA. Keep the existing failure exit behavior intact.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9758f357-a7c2-490b-8e26-a0246ebfdac9

📥 Commits

Reviewing files that changed from the base of the PR and between 24e516a and d2d9659.

📒 Files selected for processing (4)
  • docs/measurement/public-conversion-signal.md
  • package.json
  • public/contact/index.html
  • scripts/test-public-conversion-signal.mjs

Comment on lines +10 to +13
A Website Correction CTA is any public link that routes to the application
route (the contact page application section or the application email route)
or carries a `data-measure-source` marker. Every such CTA must carry an
explicit stable source tag naming its placement.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Define the direct application link as an exception.

Lines 10-13 require every application-endpoint link to carry data-measure-source. However, public/contact/index.html line 98 is the direct application link and intentionally has no marker. This makes the contract false for the current flow.

Define source CTAs as inbound placement links, or explicitly exempt the contact-page application link.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/measurement/public-conversion-signal.md` around lines 10 - 13, Update
the CTA contract in the documentation to define source CTAs as inbound placement
links, or explicitly exempt the direct contact-page application link from the
data-measure-source requirement. Preserve the requirement for stable source tags
on all other qualifying placement links.

Comment on lines +33 to +36
The application route names the offer exactly as the public copy does:
The Website Correction. It is never presented as a generic "reviewed
service"; the human-reviewed nature of the offer is described in words
("reviewed by a human"), not used as a substitute offer name. The application

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove the validator-forbidden phrase.

Line 34 contains reviewed service. scripts/test-public-conversion-signal.mjs line 70 requires that the documentation does not contain this text. Therefore, npm test and npm run ci fail on this checkout.

Reword the negative policy without that exact phrase.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/measurement/public-conversion-signal.md` around lines 33 - 36, Update
the documentation paragraph around “The Website Correction” to remove the exact
validator-forbidden phrase “reviewed service,” while preserving the intended
distinction between the offer name and its human-reviewed description.

Comment on lines +157 to +158
console.log(`\n${checks} checks, ${failures} failures`)
process.exit(failures === 0 ? 0 : 1)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the stated 120-check result verifiable.

With no homepage CTA, this script performs 116 checks. Each future homepage CTA adds three checks. The script does not assert an expected count, so it cannot validate the PR claim of a deterministic 120-check regression test.

Either enforce the intended fixed count with a fixed fixture, or update the stated verification result to match the dynamic check model.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/test-public-conversion-signal.mjs` around lines 157 - 158, Update the
final validation around checks and failures in the test script so the reported
result is verifiable: either use a fixed homepage CTA fixture and assert exactly
120 checks, or revise the stated verification result to reflect the dynamic
count of 116 checks plus three per CTA. Keep the existing failure exit behavior
intact.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d2d9659ace

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +52 to +54
/data-measure-source\s*=\s*"/i.test(a) ||
(/^mailto:support@tinystudio\.in\?subject=/.test(href) && href.includes("website correction")) ||
(href.includes("/contact/") && /[?&]source=/.test(href))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Detect untagged Website Correction CTAs

When the forthcoming homepage copy adds an untagged CTA such as <a href="/contact/#website-correction-application">Apply to The Website Correction</a>, this predicate returns false because it only recognizes links that already contain a source marker or a Website Correction mailto subject. The anchor is therefore excluded before line 91 checks for data-measure-source, so the advertised regression gate reports zero CTAs and passes while source attribution is broken.

Useful? React with 👍 / 👎.

Comment thread package.json
"mobbin:check": "node scripts/run-design-system-proving-lab.mjs --dry-run",
"ci": "node scripts/test-service-engine.mjs && node scripts/test-sales-intake-contract.mjs && node scripts/test-active-offer-projection.mjs && node scripts/test-active-operator-surfaces.mjs && node scripts/test-client-readiness-contract.mjs && node scripts/test-validated-service-client.mjs && node scripts/test-client-acceptance-gates.mjs && node scripts/check-product-truth.mjs && node scripts/check-human-service-kit.mjs && node scripts/test-design-system-proving-lab.mjs && node scripts/check-retention-automation.mjs && node scripts/test-retention-automation.mjs && node scripts/check-agency-defaults.mjs && node scripts/check-outbound-claim-safety.mjs && node scripts/check-outbound-send-readiness.mjs && node scripts/test-outbound-send-readiness.mjs && find scripts -name '*.mjs' -print0 | xargs -0 -n1 node --check",
"test": "node scripts/test-service-engine.mjs && node scripts/test-sales-intake-contract.mjs && node scripts/test-active-offer-projection.mjs && node scripts/test-active-operator-surfaces.mjs && node scripts/test-client-readiness-contract.mjs && node scripts/test-validated-service-client.mjs && node scripts/test-client-acceptance-gates.mjs && node scripts/check-product-truth.mjs && node scripts/check-human-service-kit.mjs && node scripts/test-design-system-proving-lab.mjs && node scripts/check-retention-automation.mjs && node scripts/test-retention-automation.mjs && node scripts/check-agency-defaults.mjs && node scripts/check-outbound-claim-safety.mjs && node scripts/check-outbound-send-readiness.mjs && node scripts/test-outbound-send-readiness.mjs && find scripts -name '*.mjs' -print0 | xargs -0 -n1 node --check"
"ci": "node scripts/test-service-engine.mjs && node scripts/test-sales-intake-contract.mjs && node scripts/test-active-offer-projection.mjs && node scripts/test-active-operator-surfaces.mjs && node scripts/test-client-readiness-contract.mjs && node scripts/test-validated-service-client.mjs && node scripts/test-client-acceptance-gates.mjs && node scripts/check-product-truth.mjs && node scripts/check-human-service-kit.mjs && node scripts/test-design-system-proving-lab.mjs && node scripts/check-retention-automation.mjs && node scripts/test-retention-automation.mjs && node scripts/check-agency-defaults.mjs && node scripts/check-outbound-claim-safety.mjs && node scripts/check-outbound-send-readiness.mjs && node scripts/test-outbound-send-readiness.mjs && node scripts/test-public-conversion-signal.mjs && find scripts -name '*.mjs' -print0 | xargs -0 -n1 node --check",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Run the conversion check before the known failure

In the checked .github/workflows/codex-ci.yml, CI invokes npm run ci, but this && chain places the new conversion test after test-active-operator-surfaces.mjs. The commit explicitly records that the earlier test fails on clean main, so shell short-circuiting prevents CI from ever executing the new 120-check gate (and the subsequent syntax checks); move this gate ahead of the known failure or repair the baseline so it is actually enforced.

Useful? React with 👍 / 👎.

…tract

- Keep both contact-page sections: the offer description (PR #10) now points
  its apply button at the canonical application section (PR #11) so there is
  one application route with one operator-visible subject.
- Tag the two homepage Website Correction CTAs from PR #10 with their
  registered data-measure-source names (homepage-hero, homepage-service) and
  route them through /contact/?source=<name>, as the measurement contract
  requires for any live CTA.
- Align the homepage managed-service prose with the application route.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@nish3451
nish3451 merged commit 15800c0 into main Aug 7, 2026
3 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc37f5b556

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread public/contact/index.html
var link = document.getElementById("website-correction-apply");
var source = new URLSearchParams(window.location.search).get("source");
if (link && source && REGISTRY.indexOf(source) !== -1) {
link.href = "mailto:support@tinystudio.in?subject=" + encodeURIComponent("The Website Correction application — from " + source + " (internal measurement marker)");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve source attribution when scripts are unavailable

When JavaScript is disabled or blocked, this assignment never runs and the static mailto at line 117 retains the untagged default subject even after a visitor follows either tagged homepage URL. Because the page provides a <noscript> stylesheet fallback and the application itself remains usable, these visitors silently lose the conversion signal; provide a non-JavaScript propagation fallback or explicitly narrow the signal contract to JavaScript-enabled visits.

Useful? React with 👍 / 👎.

Comment on lines +19 to +20
| `homepage-hero` | Website Correction CTA in the homepage hero rail | Defined; no live CTA (PR #10 copy not merged) |
| `homepage-service` | Website Correction CTA in the homepage managed-service section | Defined; no live CTA (PR #10 copy not merged) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark the newly wired homepage sources as live

This checkout adds active homepage-hero and homepage-service CTAs in public/index.html, but the signal contract still labels both dormant and states that PR #10 is not merged. Since this table is the documented registry operators are told to update when placements change, it now gives the opposite state from the deployed markup and can mislead future attribution maintenance.

Useful? React with 👍 / 👎.

nish3451 added a commit that referenced this pull request Aug 11, 2026
… leave the June-20 bundle (#81)

* fix(public): add the tinystudio.in release lane (Cloudflare Pages deploy path repair)

The live site has served the 2026-06-20 bundle (07acd07) since June 20 while
17+ public PRs merged to main; the Cloudflare Pages git connection for
tiny-studio-3f5 never shows checks/statuses on commits and no deploy
workflow or secrets exist in the repo. The fleet Workers token lacks
Cloudflare Pages:Edit, so no automation on this box can publish today.

Add an in-repo release lane that works the moment a Pages-scoped token is
provisioned (documented fail-closed message):
- scripts/prepare-public-deploy-bundle.mjs: filtered bundle (public/ minus
  the snoozed-by-Nish managed-service buyer path from PRs #10/#11; every
  other merged fix preserved), fail-closed in both directions
- scripts/test-public-deploy-bundle.mjs: regression guard, wired into
  npm test/ci (62 checks)
- scripts/publish-public-site.mjs: prepare -> wrangler pages deploy to
  tiny-studio-3f5 -> live verification
- scripts/check-public-live-deploy.mjs: live proof for the deploy-path
  accept (H2-after-H1 /promptly/support/ #18/#20, JSON-LD /contact/ #19,
  real 404s #34, homepage portfolio-only #29 + no buyer path)
- .github/workflows/deploy-public-site.yml: vps-verify lane on push to main
- wrangler 4.120.0 devDependency

verify: npm test (603 checks, 0 failures); node scripts/prepare-public-deploy-bundle.mjs; git diff --check

* fix(public): attach the source commit to Cloudflare Pages deployments

wrangler pages deploy accepts --commit-hash/--commit-message/--commit-dirty
for dashboard provenance. The bundle already records source_commit in
deploy-manifest.json; pass it through so the Pages dashboard links the
deployment to the exact tinystudio-in commit that produced the bundle.

verify: node --check scripts/publish-public-site.mjs; node scripts/test-public-deploy-bundle.mjs (62 checks, 0 failures)

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>

---------

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
nish3451 added a commit that referenced this pull request Aug 19, 2026
…oozed by design (#88)

Grok live-review finding ([unreviewed-by-grok]): the live homepage is missing
the entire <section id="managed-service"> block while the merged homepage on
main carries it. Verified 2026-08-11: intended, not a regression - the
managed-service buyer path (PRs #10/#11) is snoozed-by-Nish 2026-08-08, the
release lane strips the section from every publishable bundle, and the live
site (still the 2026-06-20 bundle 07acd07) predates PR #10.

Encode the verdict in the guards so future reviews find it:
- check-public-live-deploy.mjs: assert id="managed-service" and the exact
  section marker are absent from the live homepage (previously only covered
  indirectly via the 'Website Correction' phrase); document the disposition
- prepare-public-deploy-bundle.mjs: forbid id="managed-service" in the
  bundle alongside the other snooze markers
- docs/measurement/public-conversion-signal.md: record the review disposition
  with live evidence and the lift condition

verify: npm test (623 checks, 0 failures); node scripts/check-public-live-deploy.mjs
(new managed-service checks pass; the 6 stale-bundle failures predate this change);
git diff --check
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant