feat(measurement): add Website Correction conversion signal - #11
Conversation
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>
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughThe 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. ChangesWebsite Correction conversion signal
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
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (4)
docs/measurement/public-conversion-signal.mdpackage.jsonpublic/contact/index.htmlscripts/test-public-conversion-signal.mjs
| 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. |
There was a problem hiding this comment.
🗄️ 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.
| 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 |
There was a problem hiding this comment.
🎯 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.
| console.log(`\n${checks} checks, ${failures} failures`) | ||
| process.exit(failures === 0 ? 0 : 1) |
There was a problem hiding this comment.
🎯 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.
There was a problem hiding this comment.
💡 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".
| /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)) |
There was a problem hiding this comment.
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 👍 / 👎.
| "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", |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
💡 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".
| 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)"); |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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) | |
There was a problem hiding this comment.
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 👍 / 👎.
… 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>
…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
Summary
npm testandnpm run ciintended-outcome: make reviewed-service source handoff measurable without analytics or auto-send
verify:
node scripts/test-public-conversion-signal.mjspasses (120 checks);npm testandnpm run ciretain only the pre-existingtest-active-operator-surfaces.mjs:143failure;sgscanhas no new findings;git diff --checkpassesKnown 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