From 3e059f5c1cbf61eb3533ae8302fbac6768243b90 Mon Sep 17 00:00:00 2001 From: profilesearch <222277199+profilesearch@users.noreply.github.com> Date: Tue, 21 Jul 2026 22:59:10 -0700 Subject: [PATCH 1/5] Finish council marketplace follow-up items --- backend/test_deep_audit_regressions.py | 75 +++++++++++++++++-- frontend/ai-assistant-human-checks.html | 2 +- .../blog/gig-economy-statistics-2026.html | 2 +- frontend/faq.html | 13 ++-- frontend/index.html | 29 ++++--- frontend/post-a-small-task.html | 2 +- frontend/pricing.html | 24 +++--- frontend/tests/browser-regression.spec.js | 40 +++++++++- .../hire-human-to-review-ai-output.html | 2 +- .../use-cases/lead-research-microtask.html | 2 +- frontend/use-cases/website-qa-task.html | 2 +- 11 files changed, 151 insertions(+), 42 deletions(-) diff --git a/backend/test_deep_audit_regressions.py b/backend/test_deep_audit_regressions.py index 162eaf8..af7f260 100644 --- a/backend/test_deep_audit_regressions.py +++ b/backend/test_deep_audit_regressions.py @@ -1699,6 +1699,72 @@ def test_high_intent_seo_pages_feed_starter_offer_funnel(self): missing[rel] = misses self.assertEqual(missing, {}) + def test_public_intent_ctas_do_not_emit_executive_conversion_events(self): + executive_event_call = re.compile( + r"(?:trackGHH|trackBlogCTA)\(\s*['\"](?:generate_lead|qualify_lead|close_convert_lead|purchase)['\"]" + r"|gtag\(\s*['\"]event['\"]\s*,\s*['\"](?:generate_lead|qualify_lead|close_convert_lead|purchase)['\"]" + ) + executive_violations = {} + misrouted_post_task_ctas = {} + for page in sorted((REPO_ROOT / "frontend").rglob("*.html")): + if page.name == "index.html" and page.parent == REPO_ROOT / "frontend": + continue + text = page.read_text(encoding="utf-8", errors="ignore") + matches = executive_event_call.findall(text) + if matches: + executive_violations[str(page.relative_to(REPO_ROOT))] = matches + bad_post_task_links = [] + for anchor in re.findall(r"]*>", text, re.IGNORECASE): + if "post_task_cta_click" not in anchor: + continue + href = re.search(r"\bhref\s*=\s*['\"]([^'\"]+)['\"]", anchor, re.IGNORECASE) + if href is None or "post-job" not in href.group(1): + bad_post_task_links.append(anchor[:240]) + if bad_post_task_links: + misrouted_post_task_ctas[str(page.relative_to(REPO_ROOT))] = bad_post_task_links + self.assertEqual(executive_violations, {}) + self.assertEqual(misrouted_post_task_ctas, {}) + + def test_faq_qualifies_checkout_and_privacy_sharing_claims(self): + faq = (REPO_ROOT / "frontend/faq.html").read_text(encoding="utf-8", errors="ignore") + self.assertNotIn("All payments are processed through Stripe", faq) + self.assertNotIn("never shared with third parties", faq) + self.assertIn("Where GoHireHumans checkout is configured, Stripe processes payments", faq) + self.assertIn("published listings and task content may be public", faq) + self.assertIn("service providers and marketplace participants as described in the Privacy Policy", faq) + + def test_starter_offer_taxonomy_matches_pricing_and_draft_defaults(self): + pricing = (REPO_ROOT / "frontend/pricing.html").read_text(encoding="utf-8", errors="ignore") + starter = (REPO_ROOT / "frontend/starter-offers.html").read_text(encoding="utf-8", errors="ignore") + app = (REPO_ROOT / "frontend/index.html").read_text(encoding="utf-8", errors="ignore") + canonical_offers = { + "AI Output Verification": ("ai_review", "99"), + "Automation QA Sprint": ("automation_verification", "199"), + "Clay/GTM QA Sprint": ("clay_gtm_qa", "199"), + "Real-World Check": ("phone_fact_check", "79"), + } + for offer, (template, amount) in canonical_offers.items(): + self.assertIn(f"

{offer}

", pricing) + self.assertIn(f"

{offer}

", starter) + match = re.search( + rf"\b{re.escape(template)}:\s*\{{.*?budget_amount:\s*['\"](\d+)['\"]", + app, + re.DOTALL, + ) + if match is None: + self.fail(f"Missing draft template budget for {template}") + self.assertEqual(match.group(1), amount, template) + self.assertNotIn("

Website QA Sprint

", pricing) + self.assertNotIn("

Lead List Verification

", pricing) + + def test_pricing_avoids_unsourced_competitor_rate_claims(self): + pricing = (REPO_ROOT / "frontend/pricing.html").read_text(encoding="utf-8", errors="ignore") + for name in ["Upwork", "Fiverr", "TaskRabbit"]: + self.assertNotIn(name, pricing) + self.assertIn("Other marketplaces", pricing) + self.assertIn("Varies; confirm current terms", pricing) + self.assertIn("1% + Stripe processing where checkout is configured", pricing) + def test_first_orders_conversion_infrastructure_is_discoverable(self): required = { "frontend/index.html": [ @@ -1720,11 +1786,11 @@ def test_first_orders_conversion_infrastructure_is_discoverable(self): 'data-pricing-order="fee-first"', "Prefer a fixed starting point?", "pricing_proof_first_cta_click", - "lead_research", + "clay_gtm_qa", ], - "frontend/use-cases/hire-human-to-review-ai-output.html": ["AI-output review proof pack", "template=ai_review", "qualify_lead"], - "frontend/use-cases/website-qa-task.html": ["Website QA proof pack", "template=website_qa", "qualify_lead"], - "frontend/use-cases/lead-research-microtask.html": ["Lead research proof pack", "template=lead_qualification", "qualify_lead"], + "frontend/use-cases/hire-human-to-review-ai-output.html": ["AI-output review proof pack", "template=ai_review", "post_task_cta_click"], + "frontend/use-cases/website-qa-task.html": ["Website QA proof pack", "template=website_qa", "post_task_cta_click"], + "frontend/use-cases/lead-research-microtask.html": ["Lead research proof pack", "template=lead_qualification", "post_task_cta_click"], "frontend/examples/sample-deliverables.html": [ "Sample website QA report", "Sample AI-output review scorecard", @@ -2868,7 +2934,6 @@ def test_gig_economy_stats_routes_drive_by_readers_to_first_task_draft(self): "Turn the data into one clear task", "Draft your first task", "first_task_blog_cta_click", - "trackBlogCTA('qualify_lead'", "/#/post-job?template=website_test", ]: self.assertIn(snippet, text) diff --git a/frontend/ai-assistant-human-checks.html b/frontend/ai-assistant-human-checks.html index 0be0754..d852195 100644 --- a/frontend/ai-assistant-human-checks.html +++ b/frontend/ai-assistant-human-checks.html @@ -53,7 +53,7 @@
AI assistant handoff guide

When an AI assistant should ask a human to check the work.

Use GoHireHumans when an AI-generated output affects a customer, payment, public claim, lead list, workflow handoff, or real-world decision and needs bounded human verification.

-

Start with a QA sprint See sample deliverables

+

Start with a QA sprint See sample deliverables

Good human-check triggers

diff --git a/frontend/blog/gig-economy-statistics-2026.html b/frontend/blog/gig-economy-statistics-2026.html index c60a844..13d09c8 100644 --- a/frontend/blog/gig-economy-statistics-2026.html +++ b/frontend/blog/gig-economy-statistics-2026.html @@ -1065,7 +1065,7 @@

Future Projections

Turn the data into one clear task

If you came here researching the gig economy, the next useful step is simple: post one bounded task — website QA, AI-output review, lead research, data cleanup, or a local check — and review the draft before publishing.

- Draft your first task + Draft your first task See AI QA services
diff --git a/frontend/faq.html b/frontend/faq.html index ec6c206..88ee8dc 100644 --- a/frontend/faq.html +++ b/frontend/faq.html @@ -105,7 +105,7 @@ "name": "Is my information safe on GoHireHumans?", "acceptedAnswer": { "@type": "Answer", - "text": "GoHireHumans takes privacy and data security seriously. All payments are processed through Stripe, which is PCI-DSS compliant. All task details and communications are stored securely. Personal and financial information is never shared with third parties without consent. You control what information you share with professionals through the platform." + "text": "GoHireHumans takes privacy and data security seriously. Where GoHireHumans checkout is configured, Stripe processes payments and handles raw card details. Drafts remain private; published listings and task content may be public. GoHireHumans shares information with service providers and marketplace participants as described in the Privacy Policy. Never put passwords, credentials, or sensitive customer data in public content." } }, { @@ -441,13 +441,14 @@

Frequently Asked Questions

Is my information safe?
-

GoHireHumans takes data security and privacy seriously. Key protections include:

+

GoHireHumans takes data security and privacy seriously. Key limits and practices include:

    -
  • Payments processed through Stripe (PCI-DSS compliant)
  • -
  • Encrypted data storage
  • -
  • No sharing of personal or financial data with third parties without consent
  • -
  • You control what task-specific details are shared with professionals
  • +
  • Where GoHireHumans checkout is configured, Stripe processes payments and handles raw card details.
  • +
  • Drafts remain private; published listings and task content may be public.
  • +
  • GoHireHumans shares information with service providers and marketplace participants as described in the Privacy Policy.
  • +
  • Never put passwords, credentials, or sensitive customer data in public content.
+

Read the Privacy Policy →

diff --git a/frontend/index.html b/frontend/index.html index 9c782c6..7d82803 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -519,7 +519,8 @@

Common agent-delegated work

} function providerBadge(service) { if (service.provider_type === 'ai') return 'Agent service'; - return 'Human service'; + if (service.provider_type === 'human') return 'Human service'; + return ''; } function relativeDate(str) { if (!str) return ''; @@ -724,7 +725,7 @@

Common agent-delegated work

description: 'Please review the AI-generated output I provide for factual errors, unsupported claims, risky wording, missing context, and unclear recommendations.\n\nAcceptance criteria:\n1. Check every item I provide.\n2. Return an issue table with item, issue, severity, evidence/source when available, and suggested fix.\n3. Clearly flag uncertainty instead of guessing.\n\nDeliverable: concise QA report plus corrected lines or notes where useful.', category: 'expert_review', budget_type: 'fixed', - budget_amount: '49', + budget_amount: '99', required_skills: 'AI output review, fact checking, editing, source checking' }, automation_verification: { @@ -732,7 +733,7 @@

Common agent-delegated work

description: 'Please spot-check the AI agent or automation outputs/runs I provide and report whether they match the expected behavior.\n\nAcceptance criteria:\n1. Review the sample runs, logs, screenshots, or outputs I provide.\n2. Mark each run pass/fail/uncertain with evidence.\n3. Identify recurring failure modes and the top fixes to check next.\n\nDeliverable: run checklist, anomaly report, and confidence notes.', category: 'testing', budget_type: 'fixed', - budget_amount: '75', + budget_amount: '199', required_skills: 'automation QA, AI agent review, testing, concise reporting' }, clay_gtm_qa: { @@ -764,7 +765,7 @@

Common agent-delegated work

description: 'Please make the short call or verify the fact I specify using the public details I provide.\n\nAcceptance criteria:\n1. Do not share private data or credentials.\n2. Record when and what you checked.\n3. Flag uncertainty, voicemail, no-answer, or conflicting information.\n\nDeliverable: call/fact-check log, outcome, and any source notes.', category: 'phone_call', budget_type: 'fixed', - budget_amount: '35', + budget_amount: '79', required_skills: 'phone calls, fact verification, concise notes' }, lead_qualification: { @@ -1611,8 +1612,12 @@

Something went } function serviceCard(s) { - const rating = Number(s.avg_rating ?? s.rating ?? 0); - const reviews = Number(s.total_reviews ?? s.review_count ?? s.reviews ?? 0); + const rating = Number(s.worker_rating || 0); + const reviews = Number(s.worker_review_count || 0); + const deliveryDays = Number(s.delivery_time_days); + const deliveryMeta = Number.isFinite(deliveryDays) && deliveryDays > 0 + ? `
${I.clock} ${deliveryDays} day${deliveryDays !== 1 ? 's' : ''}
` + : ''; return `
@@ -1629,7 +1634,7 @@

${esc(s.title)}

${stars(rating, reviews)}
View details →
@@ -1675,6 +1680,10 @@

${esc(s.title)}

const canOrder = !!state.user; const orderBtn = ``; + const deliveryDays = Number(svc.delivery_time_days); + const deliveryMeta = Number.isFinite(deliveryDays) && deliveryDays > 0 + ? `
${I.clock} Delivery: ${deliveryDays} day${deliveryDays !== 1 ? 's' : ''}
` + : ''; document.getElementById('app').innerHTML = ` ${renderPublicNav('services')} @@ -1689,7 +1698,7 @@

${esc(svc.title)}

${(svc.worker_name||'?').slice(0,2).toUpperCase()}
${esc(svc.worker_name || 'Worker')}
-
${stars(svc.worker_avg_rating, svc.worker_total_reviews)}
+
${stars(Number(svc.worker_rating || 0), Number(svc.worker_review_count || 0))}
@@ -1732,8 +1741,8 @@

${esc(svc.title)}

${formatPrice(svc)}
${svc.pricing_type === 'hourly' ? `
per hour
` : ''}
-
${I.clock} Delivery: ${svc.delivery_time_days||'?'} day${(svc.delivery_time_days||0)!==1?'s':''}
- ${svc.avg_rating ? `
${Number(svc.avg_rating).toFixed(1)} rating (${svc.total_reviews} reviews)
` : ''} + ${deliveryMeta} + ${Number(svc.worker_review_count || 0) > 0 ? `
${Number(svc.worker_rating || 0).toFixed(1)} rating (${Number(svc.worker_review_count)} reviews)
` : ''}
${orderBtn}

Payment status is tracked through the configured workflow after buyer review.

diff --git a/frontend/post-a-small-task.html b/frontend/post-a-small-task.html index 55b6a79..ba43679 100644 --- a/frontend/post-a-small-task.html +++ b/frontend/post-a-small-task.html @@ -56,7 +56,7 @@
First task templates

Humans who verify what your AI produces.

Scope a bounded task for a human to review AI output, verify automation runs, clean data, research options, make calls, or qualify leads. Draft first; review before anything is published.

-

Scope my first QA task See sample proof report

+

Scope my first QA task See sample proof report

What happens next: you draft the task, review the scope, set a fixed budget, and decide when to publish. Where payment processing is configured, paid work follows platform payment/review steps before release.
diff --git a/frontend/pricing.html b/frontend/pricing.html index 126282c..bd5619f 100644 --- a/frontend/pricing.html +++ b/frontend/pricing.html @@ -8,7 +8,7 @@ Pricing — GoHireHumans | 1% GoHireHumans Fee + Stripe Processing, No Subscriptions - + @@ -262,15 +262,15 @@

The Fee

-

Compare Fees

-

One compact comparison. Other platforms can change their pricing; confirm current terms before making a decision.

- - +

Compare Fee Structures

+

Other marketplaces set their own fees and terms. Confirm current terms on the marketplace you are considering.

+
PlatformGoHireHumansUpworkFiverrTaskRabbit
+ - - - - + + + +
ItemGoHireHumansOther marketplaces
Platform fee1% + Stripe processingUp to 20%20%15%
Free to sign upYesYesYesVaries
Monthly subscriptionNoneOptionalOptionalNone
Physical or local tasksSupportedLimitedLimitedSupported
Platform fee1% + Stripe processing where checkout is configuredVaries; confirm current terms
Free to joinYesVaries by marketplace
Monthly subscriptionNone requiredVaries by marketplace
Physical or local tasksSupported task type; availability varies by locationVaries by marketplace and location
@@ -279,9 +279,9 @@

Compare Fees

Prefer a fixed starting point?

These proof-backed examples are optional. You can also browse the broader marketplace or describe any small, scoped task.

-

AI Output Verification

$99 — claims, sources, errors, and confidence notes.

View example →

-

Website QA Sprint

$199 — flow checks, screenshots, reproduction steps, and severity notes.

View example →

-

Lead List Verification

$199 — row checks, source accuracy, duplicates, and risk flags.

View example →

+

AI Output Verification

$99 — claims, sources, errors, and confidence notes.

View example →

+

Automation QA Sprint

$199 — website, app-flow, agent-run, or automation checks with screenshots and reproduction notes.

View website QA example →

+

Clay/GTM QA Sprint

$199 — lead-list source checks, duplicates, unsupported claims, and row-level risk flags.

View lead-list example →

Real-World Check

$79 — a small phone, local, manual, or public-source verification.

View example →

diff --git a/frontend/tests/browser-regression.spec.js b/frontend/tests/browser-regression.spec.js index ff012fb..b6eb826 100644 --- a/frontend/tests/browser-regression.spec.js +++ b/frontend/tests/browser-regression.spec.js @@ -992,7 +992,7 @@ test.describe('GoHireHumans public/browser regression suite', () => { test.skip(!isMobile, 'mobile-only smoke'); await setupDeterministicLocalPage(page); await page.goto('/pricing.html'); - await expect(page.locator('body')).toContainText('Compare Fees'); + await expect(page.locator('body')).toContainText('Compare Fee Structures'); await page.goto('/#/services', { waitUntil: 'domcontentloaded' }); await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {}); await expect(page.locator('#services-result-count')).toBeVisible(); @@ -1045,8 +1045,8 @@ test.describe('GoHireHumans public/browser regression suite', () => { status: 200, contentType: 'application/json', body: JSON.stringify({ services: [ - { id: 'svc-new', title: 'New service', description: 'No reviews yet.', pricing_type: 'fixed', price: 50, avg_rating: 0, total_reviews: 0, provider_type: 'human', worker_name: 'New provider', delivery_time_days: 2 }, - { id: 'svc-reviewed', title: 'Reviewed service', description: 'Has verified review history.', pricing_type: 'fixed', price: 75, avg_rating: 4.8, total_reviews: 8, provider_type: 'human', worker_name: 'Reviewed provider', delivery_time_days: 3 } + { id: 'svc-new', title: 'New service', description: 'No reviews yet.', pricing_type: 'fixed', price: 50, worker_rating: 0, worker_review_count: 0, provider_type: 'human', worker_name: 'New provider', delivery_time_days: 2 }, + { id: 'svc-reviewed', title: 'Reviewed service', description: 'Has verified review history.', pricing_type: 'fixed', price: 75, worker_rating: 4.8, worker_review_count: 8, provider_type: 'human', worker_name: 'Reviewed provider', delivery_time_days: 3 } ], total: 2 }) })); await page.goto('/#/services', { waitUntil: 'domcontentloaded' }); @@ -1073,6 +1073,40 @@ test.describe('GoHireHumans public/browser regression suite', () => { expect(sellerTop).toBeGreaterThan(top); }); + test('service detail uses canonical provider, review, and delivery facts', async ({ page }) => { + await setupDeterministicLocalPage(page); + await page.route('https://gohirehumans-production.up.railway.app/services/91', route => route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + id: 91, + title: 'Evidence review', + description: 'Review one bounded artifact.', + category: 'expert_review', + pricing_type: 'fixed', + price: 99, + worker_id: 14, + worker_name: 'Early provider', + provider_type: null, + worker_rating: null, + worker_review_count: null, + delivery_time_days: null + }) + })); + await page.route('https://gohirehumans-production.up.railway.app/users/14/reviews', route => route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ reviews: [] }) + })); + await page.goto('/#/services/91', { waitUntil: 'domcontentloaded' }); + await expect(page.getByRole('heading', { name: 'Evidence review' })).toBeVisible(); + await expect(page.locator('.badge-human, .badge-ai')).toHaveCount(0); + await expect(page.locator('.stars-row')).toHaveCount(0); + await expect(page.locator('.svc-worker-row')).toContainText('New listing'); + await expect(page.locator('.svc-order-meta')).not.toContainText('Delivery:'); + await expect(page.locator('body')).not.toContainText('? days'); + }); + test('empty jobs route has one truthful state and no contradictory inventory claims', async ({ page }) => { await setupDeterministicLocalPage(page); await page.route('https://gohirehumans-production.up.railway.app/jobs**', route => route.fulfill({ diff --git a/frontend/use-cases/hire-human-to-review-ai-output.html b/frontend/use-cases/hire-human-to-review-ai-output.html index 16eaffb..e950010 100644 --- a/frontend/use-cases/hire-human-to-review-ai-output.html +++ b/frontend/use-cases/hire-human-to-review-ai-output.html @@ -28,7 +28,7 @@ if (event.target.closest('.lp-mobile-link')) toggleMobileMenu(false); }); } -
AI output review

Hire a human to review AI output before it reaches customers.

Use GoHireHumans to turn risky AI-generated content into a bounded review task with clear inputs, payout, and acceptance criteria.

Post this task Browse helpers

Good tasks to post

Fact-check an AI article

Have a reviewer label unsupported claims, broken sources, and facts that need correction.

Review support replies

Ask a human to check AI-drafted customer replies for tone, policy fit, and escalation risk.

Score AI research output

Get a human to compare AI summaries against source links and return issues by severity.

AI-output review proof pack

Ask for a claim/risk table with source links, unsupported-claim flags, safer rewrite suggestions, and a final ready / revise / do-not-publish recommendation.

Start from this proof-pack task See proof-pack format

What to include in the listing

Inputs

Add the exact URL, document, spreadsheet, prompt output, or source list workers should inspect.

Deliverable

Ask for a concise report with screenshots, links, notes, priority labels, or spreadsheet columns.

Acceptance criteria

State what complete work looks like, what not to do, and whether private data or off-platform contact is prohibited.

Related GoHireHumans pages

AI output reviewwebsite QAlead researchhuman verification