From 1e0ad29b4511bbf9f71a38b1d0ee5d217cd9ec3e Mon Sep 17 00:00:00 2001 From: moose-lab Date: Thu, 4 Jun 2026 08:47:42 +0800 Subject: [PATCH] feat: add SEO GEO evidence workbook --- .../marketing/data/seo-geo-audit-workbook.csv | 49 +++++ .../2026-06-03-seo-geo-evidence-workbook.md | 91 +++++++++ .../2026-06-03-sites-output-enablement.md | 45 +++++ ...ickfork-growth-lifecycle-prioritization.md | 110 ++++++++++ .../2026-06-03-seo-geo-evidence-workbook.md | 156 ++++++++++++++ src/App.test.tsx | 6 +- src/components/landing/HeroSection.tsx | 6 +- src/components/marketing/LeadCaptureForm.tsx | 1 + src/components/studio/ProductStudio.tsx | 1 + src/core/pipeline.ts | 10 +- src/marketing/seo-geo-audit-workbook.test.ts | 190 ++++++++++++++++++ src/marketing/seo-geo-audit-workbook.ts | 128 ++++++++++++ src/server/generation/generation.test.ts | 11 +- src/server/generation/launch-brief.ts | 40 +++- src/server/generation/types.ts | 4 +- .../marketing/launch-package-fit.test.ts | 2 +- src/server/marketing/lead-capture.test.ts | 4 +- 17 files changed, 839 insertions(+), 15 deletions(-) create mode 100644 docs/marketing/data/seo-geo-audit-workbook.csv create mode 100644 docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md create mode 100644 docs/marketing/research/2026-06-03-sites-output-enablement.md create mode 100644 docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md create mode 100644 src/marketing/seo-geo-audit-workbook.test.ts create mode 100644 src/marketing/seo-geo-audit-workbook.ts diff --git a/docs/marketing/data/seo-geo-audit-workbook.csv b/docs/marketing/data/seo-geo-audit-workbook.csv new file mode 100644 index 0000000..52040dc --- /dev/null +++ b/docs/marketing/data/seo-geo-audit-workbook.csv @@ -0,0 +1,49 @@ +audit_id,baseline_id,experiment_id,route_role,canonical_path,target_user,query,query_cluster,surface,task_kind,evidence_fields,success_criteria,forbidden_claims,status,next_action +source_backed_assets_control_google_search_console,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +source_backed_assets_control_chatgpt_search,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_control_perplexity,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_control_google_ai_overview,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_control_gemini,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_control_claude,source_backed_assets_control,2026_q2_source_backed_assets_intent_validation,control,/product/github-repo-to-launch-package,product_marketer,GitHub repo to launch package,github_repo_to_launch_package,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_variant_google_search_console,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +source_backed_assets_variant_chatgpt_search,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_variant_perplexity,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_variant_google_ai_overview,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_variant_gemini,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +source_backed_assets_variant_claude,source_backed_assets_variant,2026_q2_source_backed_assets_intent_validation,variant,/product/source-backed-launch-assets,product_marketer,source backed launch assets,source_backed_launch_assets,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_control_google_search_console,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +readme_cards_control_chatgpt_search,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_control_perplexity,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_control_google_ai_overview,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_control_gemini,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_control_claude,readme_cards_control,2026_q2_readme_cards_intent_validation,control,/product/github-repo-to-launch-package,design_lead,GitHub repo to launch package,github_repo_to_launch_package,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_variant_google_search_console,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +readme_cards_variant_chatgpt_search,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_variant_perplexity,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_variant_google_ai_overview,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_variant_gemini,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +readme_cards_variant_claude,readme_cards_variant,2026_q2_readme_cards_intent_validation,variant,/product/readme-marketing-cards,design_lead,README marketing cards,readme_marketing_cards,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_control_google_search_console,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +cold_start_materials_control_chatgpt_search,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_control_perplexity,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_control_google_ai_overview,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_control_gemini,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_control_claude,cold_start_materials_control,2026_q2_cold_start_materials_intent_validation,control,/product/github-repo-to-launch-package,ai_project_builder,GitHub repo to launch package,github_repo_to_launch_package,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_variant_google_search_console,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +cold_start_materials_variant_chatgpt_search,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_variant_perplexity,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_variant_google_ai_overview,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_variant_gemini,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +cold_start_materials_variant_claude,cold_start_materials_variant,2026_q2_cold_start_materials_intent_validation,variant,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_control_google_search_console,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +launch_materials_map_control_chatgpt_search,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_control_perplexity,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_control_google_ai_overview,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_control_gemini,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_control_claude,launch_materials_map_control,2026_q2_launch_materials_map_intent_validation,control,/product/cold-start-launch-materials,ai_project_builder,cold start launch materials,cold_start_launch_materials,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_variant_google_search_console,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,google_search_console,search_console_query_baseline,window_start|window_end|query|page|country|device|impressions|clicks|ctr|average_position,query_data_collected_and_mapped_to_canonical_page,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,export_14_day_search_console_query_page_metrics +launch_materials_map_variant_chatgpt_search,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,chatgpt_search,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_variant_perplexity,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,perplexity,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_variant_google_ai_overview,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,google_ai_overview,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_variant_gemini,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,gemini,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors +launch_materials_map_variant_claude,launch_materials_map_variant,2026_q2_launch_materials_map_intent_validation,variant,/product/github-repo-launch-materials-map,ai_project_builder,GitHub repo launch materials map,github_repo_launch_materials_map,claude,ai_answer_audit,audit_date|mentioned|cited|source_url|answer_summary|accuracy_status|competitors_cited|forbidden_claims_observed,answer_mentions_or_omits_quickfork_without_forbidden_claims,pricing|rankings|revenue|customer_count|conversion_lift|product_hunt_outcome|guaranteed_launch|validated_ai_citation,pending,run_prompt_and_record_mention_citation_accuracy_and_competitors diff --git a/docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md b/docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md new file mode 100644 index 0000000..4ceef03 --- /dev/null +++ b/docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md @@ -0,0 +1,91 @@ +# 2026-06-03 SEO/GEO Evidence Workbook Research Note + +## Summary + +The SEO/GEO evidence workbook turns QuickFork's registered Search/AI baseline prompts into a concrete audit queue. Each baseline row expands into one Google Search Console task and five AI-answer audit tasks across ChatGPT Search, Perplexity, Google AI Overview, Gemini, and Claude. + +This is a measurement slice, not SEO/GEO validation. + +## Why This Slice Matters + +- QuickFork now has multiple published product, use-case, resource, tool, and example routes, but the active experiments still have `pending_evidence`. +- Search Console exports and AI-answer audits are manual enough that evidence can drift unless the exact route, query, surface, required fields, and forbidden claims are fixed. +- A supervisor-grade workbook lets growth reviewers audit the same experiment contract across GA4, Search Console, and answer-engine surfaces before choosing the next landing page or product slice. +- This supports the current P0 priority: collect evidence before scaling more pages. + +## Target User + +- SEO/GEO supervisor reviewing whether QuickFork is indexable, extractable, and accurately summarized. +- Growth operator collecting route-level Search Console and AI-answer evidence. +- Product marketer deciding whether a page promise deserves more content, product, or paid-package investment. + +## Lifecycle Position + +- Discovery: query clusters and AI prompts are fixed by the Search/AI baseline contract. +- Validation: workbook rows specify the evidence needed before route comparisons can be decided. +- Activation: workbook decisions must be read alongside generation, artifact export, and launch materials map copy behavior. +- Monetization: paid package decisions still require lead quality and willingness-to-pay evidence. + +## Growth Contract + +Primary metric: + +- Completion of Search Console and AI-answer audit rows for each active experiment that requires search or AI evidence. + +Supporting metrics: + +- `page_view`, `cta_clicked`, `generation_started`, `generation_completed`, and `generation_failed` over the same 14-day window. +- `launch_materials_map_copied` for `2026_q2_launch_materials_map_intent_validation`. +- Lead-quality fields for full launch package requests when bottom-funnel pages are involved. + +Guardrails: + +- Do not treat workbook rows, prompt coverage, or page publication as search demand. +- Do not claim ranking wins, AI citations, revenue, customer count, conversion lift, Product Hunt results, guaranteed launches, or pricing validation. +- Keep the workbook PII-free: no raw emails, raw repo content, source notes, private launch notes, tokens, secrets, raw artifact bodies, or customer proof. + +## Implemented Surface + +- `src/marketing/seo-geo-audit-workbook.ts` +- `src/marketing/seo-geo-audit-workbook.test.ts` +- `docs/marketing/data/seo-geo-audit-workbook.csv` +- `docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md` + +## Workbook Contract + +Every Search/AI baseline row now produces six audit rows: + +- `google_search_console`: collect `window_start`, `window_end`, `query`, `page`, `country`, `device`, `impressions`, `clicks`, `ctr`, and `average_position`. +- `chatgpt_search`, `perplexity`, `google_ai_overview`, `gemini`, and `claude`: collect `audit_date`, `mentioned`, `cited`, `source_url`, `answer_summary`, `accuracy_status`, `competitors_cited`, and `forbidden_claims_observed`. + +The workbook keeps each row tied to: + +- Baseline id. +- Experiment id. +- Control or variant role. +- Canonical path. +- Target user. +- Query cluster. +- Surface. +- Expected terms. +- Forbidden claims. +- Pending status and next action. + +## Current Verification + +- RED test failed first because `src/marketing/seo-geo-audit-workbook.ts` did not exist. +- GREEN focused verification passed after adding the module and CSV mirror: `npm test -- src/marketing/seo-geo-audit-workbook.test.ts` returned 1 file passed and 5 tests passed. +- Related verification passed: `npm test -- src/marketing/seo-geo-audit-workbook.test.ts src/marketing/search-ai-baseline.test.ts src/marketing/growth-experiment-report.test.ts` returned 3 files passed and 21 tests passed. +- Initial full `npm test` attempts with the default forks pool hit Vitest worker startup timeouts in this local environment. +- Targeted reruns of the affected files passed, including `npm test -- src/App.test.tsx -t "keeps the generator studio|full launch package contact|landing architecture"` and `npm test -- src/server/marketing/launch-package-fit.test.ts`. +- Full verification passed with threads pool: `npm test -- --testTimeout=30000 --pool=threads` returned 25 files passed and 168 tests passed. +- Build verification passed: `npm run build` completed TypeScript build and Vite production build. +- Diff hygiene passed: `git diff --check` returned no whitespace errors. + +## Decision + +Treat the workbook as P0 measurement infrastructure. It makes SEO/GEO evidence collection executable, but it does not prove indexed demand, answer-engine citation, activation quality, lead quality, or willingness to pay. + +## Next Validation Step + +Use the workbook to collect 14-day Search Console and AI-answer evidence for the active validation experiments, then fill `docs/marketing/data/growth-experiment-evidence.csv` and decide whether each page should be promoted, rewritten, consolidated, or paused. diff --git a/docs/marketing/research/2026-06-03-sites-output-enablement.md b/docs/marketing/research/2026-06-03-sites-output-enablement.md new file mode 100644 index 0000000..887567f --- /dev/null +++ b/docs/marketing/research/2026-06-03-sites-output-enablement.md @@ -0,0 +1,45 @@ +# Sites Output Enablement + +Date: 2026-06-03 + +## Hypothesis + +If QuickFork exposes Sites as part of the launch package, founders, open-source maintainers, and DevRel operators can turn the same repository evidence into a reviewable site/page spine instead of treating launch output as only README, deck, social, visual, and outreach files. + +## Lifecycle Stage + +- Stage: Activation to monetization. +- Target user: AI/devtool builders, open-source maintainers, technical founders, and DevRel operators preparing a public launch. +- Product surface: generated launch brief, studio output presets, and full launch package qualification form. +- CTA: generate a similar launch package or request a reviewed full launch package. +- Primary metric: `launch_artifact_copied` or `launch_artifact_downloaded` where `artifact_type=site`; `sales_contact_requested` with package scope including `sites`. +- Guardrail metric: no raw README text, artifact body, email, token, secret, unsupported customer proof, ranking, revenue, or guaranteed-growth claim in browser analytics. + +## Change + +- Added `site` as a generated launch materials channel. +- Added a source-backed "Launch site page spine" export artifact. +- Added a Sites output preset for the studio. +- Added Sites to full launch package qualification scope. +- Kept Sites as a reviewable page spine, not automatic public publishing. + +## Evidence Observed + +- RED generation test failed first because the launch brief did not include the site channel. +- RED App tests failed first because the studio and contact scope form did not expose Sites. +- Focused GREEN verification passed after implementation: + - `npm test -- src/server/generation/generation.test.ts -t "source-backed free repo launch brief"` + - `npm test -- src/App.test.tsx -t "keeps the generator studio|full launch package contact"` + - `npm test -- src/server/marketing/launch-package-fit.test.ts src/server/marketing/lead-capture.test.ts -t "launch package fit|full launch package qualification"` +- Related focused verification passed after the final scope-count alignment: + - `npm test -- src/server/generation/generation.test.ts -t "source-backed free repo launch brief"` returned 1 file passed and 1 selected test passed. + - `npm test -- src/App.test.tsx -t "keeps the generator studio|full launch package contact|landing architecture"` returned 1 file passed and 3 selected tests passed. + - `npm test -- src/server/marketing/launch-package-fit.test.ts src/server/marketing/lead-capture.test.ts -t "launch package fit|full launch package qualification"` returned 2 files passed and 2 selected tests passed. +- Full verification with the default forks pool hit Vitest worker startup timeout in this local environment, but no Sites assertion failed after the scope-count fix. +- Full verification passed with threads pool: `npm test -- --testTimeout=30000 --pool=threads` returned 25 files passed and 168 tests passed. +- Build verification passed: `npm run build` completed TypeScript build and Vite production build. +- Diff hygiene passed: `git diff --check` returned no whitespace errors. + +## Remaining Validation Gap + +No production users have copied, downloaded, or requested the Sites scope yet. Treat the output as a monetization hypothesis until artifact interactions, full-package requests, or interviews show that launch site/page support is more valuable than the existing README, social, deck, visual, and outreach outputs. diff --git a/docs/plans/2026-06-01-quickfork-growth-lifecycle-prioritization.md b/docs/plans/2026-06-01-quickfork-growth-lifecycle-prioritization.md index 2377481..e98ca66 100644 --- a/docs/plans/2026-06-01-quickfork-growth-lifecycle-prioritization.md +++ b/docs/plans/2026-06-01-quickfork-growth-lifecycle-prioritization.md @@ -1646,3 +1646,113 @@ Decision: Next action: - Run full verification, merge, production smoke, then use `2026_q2_launch_materials_map_intent_validation` for 14 days of GA4, Search Console, and AI-answer evidence collection. + +## 2026-06-03 Sites Output Enablement Slice + +Hypothesis: + +- If QuickFork exposes Sites as part of the launch package, founders, open-source maintainers, and DevRel operators can turn repository evidence into a reviewable launch site/page spine instead of treating launch output as only README, deck, social, visual, and outreach material. + +Lifecycle stage: + +- Activation to monetization. + +Target user: + +- AI/devtool builders, open-source maintainers, technical founders, and DevRel operators preparing a public launch. + +Changed surface: + +- `src/server/generation/types.ts` +- `src/server/generation/launch-brief.ts` +- `src/server/generation/generation.test.ts` +- `src/components/landing/HeroSection.tsx` +- `src/components/studio/ProductStudio.tsx` +- `src/components/marketing/LeadCaptureForm.tsx` +- `src/core/pipeline.ts` +- `src/App.test.tsx` +- `src/server/marketing/launch-package-fit.test.ts` +- `src/server/marketing/lead-capture.test.ts` +- `docs/marketing/research/2026-06-03-sites-output-enablement.md` + +Metric: + +- `launch_artifact_copied` or `launch_artifact_downloaded` where `artifact_type=site`. +- `sales_contact_requested` with package scope including `sites`. + +Guardrail: + +- Sites output is a reviewable page spine, not automatic publishing. +- Do not send raw README text, raw artifact body, email, token, secret, unsupported customer proof, rankings, revenue, pricing, or guaranteed-growth claims to browser analytics. + +Evidence observed: + +- RED generation test failed first because the launch brief did not include the site channel. +- RED App tests failed first because the studio and full launch package form did not expose Sites. +- Focused generation verification passed: `npm test -- src/server/generation/generation.test.ts -t "source-backed free repo launch brief"` returned 1 file passed and 1 selected test passed. +- Focused App verification passed: `npm test -- src/App.test.tsx -t "keeps the generator studio|full launch package contact|landing architecture"` returned 1 file passed and 3 selected tests passed. +- Focused lead qualification verification passed: `npm test -- src/server/marketing/launch-package-fit.test.ts src/server/marketing/lead-capture.test.ts -t "launch package fit|full launch package qualification"` returned 2 files passed and 2 selected tests passed. +- Full verification passed with threads pool: `npm test -- --testTimeout=30000 --pool=threads` returned 25 files passed and 168 tests passed. +- Build verification passed: `npm run build` completed TypeScript build and Vite production build. +- Diff hygiene passed: `git diff --check` returned no whitespace errors. + +Decision: + +- Treat Sites as a product-output and monetization hypothesis. It fills a landing-page material gap in the launch package, but production users have not yet copied, downloaded, or requested this scope. + +Next action: + +- Track site artifact copy/download and full launch package requests with `sites` scope before investing in full hosted site generation, CMS export, or public landing-page automation. + +## 2026-06-03 SEO/GEO Evidence Workbook Slice + +Hypothesis: + +- If QuickFork expands each registered Search/AI baseline row into a surface-specific audit workbook, SEO/GEO reviewers can collect Search Console and AI-answer evidence without drifting from the experiment contract. + +Lifecycle stage: + +- Validation, P0 measurement and evidence. + +Target user: + +- SEO/GEO supervisor auditing whether QuickFork is indexable, extractable, and accurately summarized. +- Growth operator collecting Search Console and AI-answer evidence for active page-intent experiments. + +Changed surface: + +- `src/marketing/seo-geo-audit-workbook.ts` +- `src/marketing/seo-geo-audit-workbook.test.ts` +- `docs/marketing/data/seo-geo-audit-workbook.csv` +- `docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md` +- `docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md` + +Metric: + +- Completion of Search Console and AI-answer workbook rows for experiments that require search or AI evidence. +- Supporting route metrics remain `page_view`, `cta_clicked`, `generation_started`, `generation_completed`, and `generation_failed` over the same 14-day window. + +Guardrail: + +- Do not treat a workbook row, prompt, route, or crawler asset as validated search demand or AI visibility. +- Do not claim ranking wins, AI citations, customer traction, revenue, conversion lift, pricing validation, Product Hunt outcomes, or guaranteed launches. +- Keep workbook rows free of raw emails, raw repo text, source notes, private launch notes, tokens, secrets, raw artifacts, or unsupported proof. + +Evidence observed: + +- RED test failed first because the SEO/GEO audit workbook module did not exist. +- Focused verification passed after adding the module and CSV mirror: `npm test -- src/marketing/seo-geo-audit-workbook.test.ts` returned 1 file passed and 5 tests passed. +- Related verification passed: `npm test -- src/marketing/seo-geo-audit-workbook.test.ts src/marketing/search-ai-baseline.test.ts src/marketing/growth-experiment-report.test.ts` returned 3 files passed and 21 tests passed. +- Initial full `npm test` attempts with the default forks pool hit Vitest worker startup timeouts in this local environment. +- Targeted reruns of the affected files passed, including `npm test -- src/App.test.tsx -t "keeps the generator studio|full launch package contact|landing architecture"` and `npm test -- src/server/marketing/launch-package-fit.test.ts`. +- Full verification passed with threads pool: `npm test -- --testTimeout=30000 --pool=threads` returned 25 files passed and 168 tests passed. +- Build verification passed: `npm run build` completed TypeScript build and Vite production build. +- Diff hygiene passed: `git diff --check` returned no whitespace errors. + +Decision: + +- Treat this as P0 measurement infrastructure, not a validation result. It makes the current active experiments reviewable by a senior SEO/GEO operator before QuickFork scales more landing pages. + +Next action: + +- Run related/full verification, then use the workbook to collect 14-day Search Console and AI-answer evidence before deciding which active page-intent experiments should be promoted, rewritten, consolidated, or paused. diff --git a/docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md b/docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md new file mode 100644 index 0000000..4f6ed57 --- /dev/null +++ b/docs/superpowers/plans/2026-06-03-seo-geo-evidence-workbook.md @@ -0,0 +1,156 @@ +# SEO GEO Evidence Workbook Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a test-covered SEO/GEO evidence workbook that expands QuickFork's registered Search/AI baseline rows into human-auditable Search Console and AI-answer collection tasks. + +**Architecture:** Add a focused marketing module that derives audit rows from `search-ai-baseline.ts` rather than duplicating experiment definitions. Add an editable CSV mirror for human audit work and a research note explaining the validation boundary. + +**Tech Stack:** TypeScript, Vitest, CSV docs, Markdown docs. + +--- + +### Task 1: SEO/GEO Audit Workbook Tests + +**Files:** +- Create: `src/marketing/seo-geo-audit-workbook.test.ts` + +- [ ] **Step 1: Write the failing test** + +Create `src/marketing/seo-geo-audit-workbook.test.ts` with tests that import `searchAiBaselineRows`, `searchBaselineSurfaces`, and the future workbook helpers. The tests must assert: + +- Every baseline row expands to one workbook row per surface. +- `google_search_console` rows use task kind `search_console_query_baseline`. +- ChatGPT Search, Perplexity, Google AI Overview, Gemini, and Claude rows use task kind `ai_answer_audit`. +- Every row preserves `baselineId`, `experimentId`, `routeRole`, `canonicalPath`, `targetUser`, `query`, `queryCluster`, expected terms, forbidden claims, status `pending`, and a non-empty next action. +- The editable CSV at `docs/marketing/data/seo-geo-audit-workbook.csv` mirrors the generated workbook. +- The rendered runbook names the experiment, routes, Search Console, AI surfaces, required evidence fields, and explicitly keeps the decision as `insufficient_data`. +- The rendered runbook does not claim validated demand, ranking wins, revenue lift, customer traction, or guaranteed launch results. + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +npm test -- src/marketing/seo-geo-audit-workbook.test.ts +``` + +Expected: FAIL because `src/marketing/seo-geo-audit-workbook.ts` and the CSV do not exist yet. + +### Task 2: SEO/GEO Audit Workbook Module + +**Files:** +- Create: `src/marketing/seo-geo-audit-workbook.ts` + +- [ ] **Step 1: Implement the minimal module** + +Create `src/marketing/seo-geo-audit-workbook.ts` with: + +- `seoGeoAuditStatuses = ["pending", "collected", "needs_reaudit"]`. +- Task kinds `search_console_query_baseline` and `ai_answer_audit`. +- `buildSeoGeoAuditWorkbookRows()` that maps every `SearchAiBaselineRow` surface to a `SeoGeoAuditWorkbookRow`. +- `getSeoGeoAuditWorkbookRowsForExperiment(experimentId)`. +- `renderSeoGeoAuditWorkbook(experimentId)` that returns a Markdown runbook with route rows, evidence fields, guardrails, and the decision line `Decision: insufficient_data_until_14_day_ga4_search_console_and_ai_answer_evidence_exists`. + +- [ ] **Step 2: Run focused test** + +Run: + +```bash +npm test -- src/marketing/seo-geo-audit-workbook.test.ts +``` + +Expected: still FAIL until the editable CSV is added. + +### Task 3: Editable SEO/GEO Audit CSV + +**Files:** +- Create: `docs/marketing/data/seo-geo-audit-workbook.csv` + +- [ ] **Step 1: Add the CSV mirror** + +Create a CSV with this header: + +```text +audit_id,baseline_id,experiment_id,route_role,canonical_path,target_user,query,query_cluster,surface,task_kind,evidence_fields,success_criteria,forbidden_claims,status,next_action +``` + +Add one row per baseline/surface pair. Use pipe-delimited lists inside fields. Keep all values PII-free and claim-safe. + +- [ ] **Step 2: Run focused test** + +Run: + +```bash +npm test -- src/marketing/seo-geo-audit-workbook.test.ts +``` + +Expected: PASS. + +### Task 4: Research Note And Lifecycle Plan Update + +**Files:** +- Create: `docs/marketing/research/2026-06-03-seo-geo-evidence-workbook.md` +- Modify: `docs/plans/2026-06-01-quickfork-growth-lifecycle-prioritization.md` + +- [ ] **Step 1: Add research note** + +Document: + +- Hypothesis: a generated audit workbook will reduce evidence drift across GA4, Search Console, and AI-answer audits. +- Lifecycle stage: Validation. +- Target user: SEO/GEO supervisor and growth operator. +- Changed surface: TypeScript workbook, CSV mirror, runbook renderer. +- Metric: completion of Search Console and AI-answer evidence rows for active experiments. +- Guardrail: no SEO/GEO, pricing, revenue, customer, or AI-citation claims until evidence is collected. +- Next action: run the workbook for each active experiment and fill the evidence CSV after the 14-day window. + +- [ ] **Step 2: Update lifecycle plan** + +Append a short dated section that records the SEO/GEO evidence workbook as a P0 measurement slice and states that it is instrumentation, not validation. + +### Task 5: Verification + +**Files:** +- Verify only. + +- [ ] **Step 1: Run focused related tests** + +Run: + +```bash +npm test -- src/marketing/seo-geo-audit-workbook.test.ts src/marketing/search-ai-baseline.test.ts src/marketing/growth-experiment-report.test.ts +``` + +Expected: PASS. + +- [ ] **Step 2: Run full verification** + +Run: + +```bash +npm test +npm run build +git diff --check +``` + +Expected: PASS. If the full suite fails for unrelated pre-existing reasons, record the exact failure and keep the focused verification result. + +### Task 6: Obsidian Mirror + +**Files:** +- Modify: `/Users/moose/Documents/Moose's Birth ID/QuickFork/SEO Growth/2026-06-01 QuickFork Cold Start Launch Growth Iteration.md` + +- [ ] **Step 1: Append dated entry** + +Append a dated entry with repo refs, hypothesis, lifecycle stage, target user, changed surface, metric, guardrail, evidence observed, decision, and next action. + +- [ ] **Step 2: Verify entry exists** + +Run: + +```bash +tail -n 120 "/Users/moose/Documents/Moose's Birth ID/QuickFork/SEO Growth/2026-06-01 QuickFork Cold Start Launch Growth Iteration.md" +``` + +Expected: The new SEO/GEO evidence workbook entry is visible and states that the workbook is not validation evidence by itself. diff --git a/src/App.test.tsx b/src/App.test.tsx index 20d433f..3f8b97e 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -106,6 +106,7 @@ describe("App", () => { expect(screen.getAllByText(/README/i).length).toBeGreaterThan(0); expect(screen.getAllByText(/PPT/i).length).toBeGreaterThan(0); expect(screen.getAllByText(/Social/i).length).toBeGreaterThan(0); + expect(screen.getAllByText(/Sites/i).length).toBeGreaterThan(0); }); it("tracks route-level page views with funnel intent metadata", () => { @@ -1057,6 +1058,7 @@ describe("App", () => { fireEvent.click(screen.getByLabelText(/^Social$/i)); fireEvent.click(screen.getByLabelText(/^Deck$/i)); fireEvent.click(screen.getByLabelText(/^Outreach$/i)); + fireEvent.click(screen.getByLabelText(/^Sites$/i)); fireEvent.click(screen.getByLabelText(/^Visual explainer$/i)); fireEvent.click(screen.getByLabelText(/human review needed/i)); fireEvent.change(screen.getByLabelText(/launch notes/i), { @@ -1080,7 +1082,7 @@ describe("App", () => { launchTimeline: "within_30_days", packageModel: "single_launch", buyingTrigger: "launch_deadline", - packageScope: ["readme", "social", "deck", "outreach", "visual_explainer"], + packageScope: ["readme", "social", "deck", "outreach", "sites", "visual_explainer"], humanReviewNeeded: true, notes: "Launching an AI repo and need source-backed README, deck, and outreach review.", }, @@ -1101,7 +1103,7 @@ describe("App", () => { launch_timeline: "within_30_days", package_model: "single_launch", buying_trigger: "launch_deadline", - package_scope_count: 5, + package_scope_count: 6, human_review_needed: true, }), ]), diff --git a/src/components/landing/HeroSection.tsx b/src/components/landing/HeroSection.tsx index 905d33b..297ee44 100644 --- a/src/components/landing/HeroSection.tsx +++ b/src/components/landing/HeroSection.tsx @@ -142,7 +142,7 @@ interface RepoLaunchMaterialsMapSummary { } interface RepoLaunchMaterialChannelSummary { - type: "readme" | "social" | "deck" | "visual" | "outreach"; + type: "readme" | "social" | "deck" | "site" | "visual" | "outreach"; label: string; primaryUser: string; jobToBeDone: string; @@ -154,7 +154,7 @@ interface RepoLaunchMaterialChannelSummary { } interface RepoLaunchBriefArtifactSummary { - type: "audience" | "story_map" | "materials_map" | "readme" | "social" | "deck" | "outreach" | "visual"; + type: "audience" | "story_map" | "materials_map" | "readme" | "social" | "deck" | "site" | "outreach" | "visual"; label: string; fileName: string; body: string; @@ -706,7 +706,7 @@ function LaunchBriefPanel({
Need a complete launch package? - Request reviewed README, social, deck, outreach, and visual assets before publishing. + Request reviewed README, social, deck, site, outreach, and visual assets before publishing.
Request full launch package diff --git a/src/components/marketing/LeadCaptureForm.tsx b/src/components/marketing/LeadCaptureForm.tsx index c3a7da1..9638c24 100644 --- a/src/components/marketing/LeadCaptureForm.tsx +++ b/src/components/marketing/LeadCaptureForm.tsx @@ -302,6 +302,7 @@ const launchPackageScopeOptions = [ { value: "social", label: "Social" }, { value: "deck", label: "Deck" }, { value: "outreach", label: "Outreach" }, + { value: "sites", label: "Sites" }, { value: "visual_explainer", label: "Visual explainer" }, ] as const; diff --git a/src/components/studio/ProductStudio.tsx b/src/components/studio/ProductStudio.tsx index 47ed40c..1568a39 100644 --- a/src/components/studio/ProductStudio.tsx +++ b/src/components/studio/ProductStudio.tsx @@ -152,6 +152,7 @@ export function ProductStudio() { README PPT Social + Sites
diff --git a/src/core/pipeline.ts b/src/core/pipeline.ts index 9f9fd9a..6f8704f 100644 --- a/src/core/pipeline.ts +++ b/src/core/pipeline.ts @@ -19,7 +19,7 @@ export interface ModelSettings { export interface AssetPreset { id: string; label: string; - useCase: "README" | "PPT" | "Social"; + useCase: "README" | "PPT" | "Social" | "Sites"; size: string; aspect: string; note: string; @@ -87,6 +87,14 @@ export const ASSET_PRESETS: AssetPreset[] = [ aspect: "16:9", note: "Fits widescreen decks and product updates without manual cropping.", }, + { + id: "site-hero", + label: "Launch site hero", + useCase: "Sites", + size: "1600x900", + aspect: "16:9", + note: "Fits a product launch site hero, showcase page, or campaign landing page preview.", + }, { id: "x-linkedin-landscape", label: "X / LinkedIn landscape", diff --git a/src/marketing/seo-geo-audit-workbook.test.ts b/src/marketing/seo-geo-audit-workbook.test.ts new file mode 100644 index 0000000..151c611 --- /dev/null +++ b/src/marketing/seo-geo-audit-workbook.test.ts @@ -0,0 +1,190 @@ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +import { describe, expect, it } from "vitest"; + +import { + aiSearchAuditSurfaces, + searchAiBaselineRows, + searchBaselineSurfaces, + type SearchBaselineSurface, +} from "./search-ai-baseline"; +import { + buildSeoGeoAuditWorkbookRows, + getSeoGeoAuditWorkbookRowsForExperiment, + renderSeoGeoAuditWorkbook, +} from "./seo-geo-audit-workbook"; + +const csvPath = "docs/marketing/data/seo-geo-audit-workbook.csv"; +const requiredHeaders = [ + "audit_id", + "baseline_id", + "experiment_id", + "route_role", + "canonical_path", + "target_user", + "query", + "query_cluster", + "surface", + "task_kind", + "evidence_fields", + "success_criteria", + "forbidden_claims", + "status", + "next_action", +] as const; + +function parseRows() { + const source = readFileSync(join(process.cwd(), csvPath), "utf8").trim(); + const [headerLine, ...lines] = source.split(/\r?\n/); + const headers = headerLine.split(","); + const rows = lines.map((line) => { + const values = line.split(","); + return Object.fromEntries(headers.map((header, index) => [header, values[index] ?? ""])); + }); + + return { headers, rows }; +} + +describe("SEO/GEO audit workbook", () => { + it("expands every Search/AI baseline row into one audit task per surface", () => { + const rows = buildSeoGeoAuditWorkbookRows(); + const expectedCount = searchAiBaselineRows.reduce((count, row) => count + row.surfaces.length, 0); + + expect(rows).toHaveLength(expectedCount); + + for (const baseline of searchAiBaselineRows) { + for (const surface of baseline.surfaces) { + const row = rows.find((candidate) => candidate.auditId === `${baseline.id}_${surface}`); + + expect(row).toEqual( + expect.objectContaining({ + baselineId: baseline.id, + experimentId: baseline.experimentId, + routeRole: baseline.routeRole, + canonicalPath: baseline.canonicalPath, + targetUser: baseline.targetUser, + query: baseline.query, + queryCluster: baseline.queryCluster, + surface, + expectedTerms: baseline.expectedTerms, + forbiddenClaims: baseline.forbiddenClaims, + status: "pending", + }), + ); + expect(row?.evidenceFields.length).toBeGreaterThan(4); + expect(row?.successCriteria).not.toContain("validated"); + expect(row?.nextAction).not.toHaveLength(0); + } + } + }); + + it("uses Search Console and AI answer task kinds with surface-specific evidence fields", () => { + const rows = buildSeoGeoAuditWorkbookRows(); + const searchConsoleRows = rows.filter((row) => row.surface === "google_search_console"); + const aiRows = rows.filter((row) => row.taskKind === "ai_answer_audit"); + + expect(searchConsoleRows).toHaveLength(searchAiBaselineRows.length); + expect(aiRows).toHaveLength(searchAiBaselineRows.length * aiSearchAuditSurfaces.length); + + for (const row of searchConsoleRows) { + expect(row.taskKind).toBe("search_console_query_baseline"); + expect(row.evidenceFields).toEqual( + expect.arrayContaining([ + "window_start", + "window_end", + "query", + "page", + "impressions", + "clicks", + "ctr", + "average_position", + ]), + ); + expect(row.successCriteria).toBe("query_data_collected_and_mapped_to_canonical_page"); + } + + for (const surface of aiSearchAuditSurfaces) { + const surfaceRows = rows.filter((row) => row.surface === surface); + + expect(surfaceRows).toHaveLength(searchAiBaselineRows.length); + for (const row of surfaceRows) { + expect(row.taskKind).toBe("ai_answer_audit"); + expect(row.evidenceFields).toEqual( + expect.arrayContaining([ + "audit_date", + "mentioned", + "cited", + "source_url", + "accuracy_status", + "competitors_cited", + "forbidden_claims_observed", + ]), + ); + expect(row.successCriteria).toBe("answer_mentions_or_omits_quickfork_without_forbidden_claims"); + } + } + }); + + it("mirrors the editable CSV workbook", () => { + const { headers, rows } = parseRows(); + const workbookRows = buildSeoGeoAuditWorkbookRows(); + + expect(headers).toEqual([...requiredHeaders]); + expect(rows).toHaveLength(workbookRows.length); + + for (const row of rows) { + const workbook = workbookRows.find((candidate) => candidate.auditId === row.audit_id); + + expect(workbook).toEqual( + expect.objectContaining({ + baselineId: row.baseline_id, + experimentId: row.experiment_id, + routeRole: row.route_role, + canonicalPath: row.canonical_path, + targetUser: row.target_user, + query: row.query, + queryCluster: row.query_cluster, + surface: row.surface as SearchBaselineSurface, + taskKind: row.task_kind, + status: row.status, + nextAction: row.next_action, + }), + ); + expect(workbook?.evidenceFields.join("|")).toBe(row.evidence_fields); + expect(workbook?.successCriteria).toBe(row.success_criteria); + expect(workbook?.forbiddenClaims.join("|")).toBe(row.forbidden_claims); + } + }); + + it("renders an experiment workbook for supervisor audit without claiming validation", () => { + const runbook = renderSeoGeoAuditWorkbook("2026_q2_launch_materials_map_intent_validation"); + + expect(runbook).toContain("# SEO/GEO Evidence Workbook"); + expect(runbook).toContain("Experiment: 2026_q2_launch_materials_map_intent_validation"); + expect(runbook).toContain("/product/cold-start-launch-materials"); + expect(runbook).toContain("/product/github-repo-launch-materials-map"); + expect(runbook).toContain("google_search_console"); + expect(runbook).toContain("chatgpt_search"); + expect(runbook).toContain("perplexity"); + expect(runbook).toContain("google_ai_overview"); + expect(runbook).toContain("gemini"); + expect(runbook).toContain("claude"); + expect(runbook).toContain("impressions"); + expect(runbook).toContain("mentioned"); + expect(runbook).toContain("forbidden_claims_observed"); + expect(runbook).toContain( + "Decision: insufficient_data_until_14_day_ga4_search_console_and_ai_answer_evidence_exists", + ); + expect(runbook).not.toMatch(/validated demand|ranking win|revenue lift|customer traction|guaranteed launch/i); + }); + + it("keeps experiment workbooks scoped to registered baseline surfaces", () => { + const rows = getSeoGeoAuditWorkbookRowsForExperiment("2026_q2_source_backed_assets_intent_validation"); + + expect(rows).toHaveLength(2 * searchBaselineSurfaces.length); + expect(new Set(rows.map((row) => row.surface))).toEqual(new Set(searchBaselineSurfaces)); + expect(rows.every((row) => row.experimentId === "2026_q2_source_backed_assets_intent_validation")).toBe(true); + expect(JSON.stringify(rows)).not.toMatch(/email|token|secret|password|api_key|revenue_amount|customer_logo/i); + }); +}); diff --git a/src/marketing/seo-geo-audit-workbook.ts b/src/marketing/seo-geo-audit-workbook.ts new file mode 100644 index 0000000..d85e847 --- /dev/null +++ b/src/marketing/seo-geo-audit-workbook.ts @@ -0,0 +1,128 @@ +import { getGrowthExperimentById } from "./growth-experiments"; +import { + searchAiBaselineRows, + type ForbiddenAiSearchClaim, + type SearchAiBaselineRow, + type SearchBaselineSurface, +} from "./search-ai-baseline"; + +export const seoGeoAuditStatuses = ["pending", "collected", "needs_reaudit"] as const; +export const seoGeoAuditTaskKinds = ["search_console_query_baseline", "ai_answer_audit"] as const; + +export type SeoGeoAuditStatus = (typeof seoGeoAuditStatuses)[number]; +export type SeoGeoAuditTaskKind = (typeof seoGeoAuditTaskKinds)[number]; + +export interface SeoGeoAuditWorkbookRow { + auditId: string; + baselineId: string; + experimentId: string; + routeRole: SearchAiBaselineRow["routeRole"]; + canonicalPath: string; + targetUser: string; + query: string; + queryCluster: string; + surface: SearchBaselineSurface; + taskKind: SeoGeoAuditTaskKind; + evidenceFields: readonly string[]; + successCriteria: string; + expectedTerms: readonly string[]; + forbiddenClaims: readonly ForbiddenAiSearchClaim[]; + status: SeoGeoAuditStatus; + nextAction: string; +} + +const searchConsoleEvidenceFields = [ + "window_start", + "window_end", + "query", + "page", + "country", + "device", + "impressions", + "clicks", + "ctr", + "average_position", +] as const; + +const aiAnswerEvidenceFields = [ + "audit_date", + "mentioned", + "cited", + "source_url", + "answer_summary", + "accuracy_status", + "competitors_cited", + "forbidden_claims_observed", +] as const; + +export function buildSeoGeoAuditWorkbookRows() { + return searchAiBaselineRows.flatMap((baseline) => + baseline.surfaces.map((surface): SeoGeoAuditWorkbookRow => { + const isSearchConsole = surface === "google_search_console"; + + return { + auditId: `${baseline.id}_${surface}`, + baselineId: baseline.id, + experimentId: baseline.experimentId, + routeRole: baseline.routeRole, + canonicalPath: baseline.canonicalPath, + targetUser: baseline.targetUser, + query: baseline.query, + queryCluster: baseline.queryCluster, + surface, + taskKind: isSearchConsole ? "search_console_query_baseline" : "ai_answer_audit", + evidenceFields: isSearchConsole ? searchConsoleEvidenceFields : aiAnswerEvidenceFields, + successCriteria: isSearchConsole + ? "query_data_collected_and_mapped_to_canonical_page" + : "answer_mentions_or_omits_quickfork_without_forbidden_claims", + expectedTerms: baseline.expectedTerms, + forbiddenClaims: baseline.forbiddenClaims, + status: "pending", + nextAction: isSearchConsole + ? "export_14_day_search_console_query_page_metrics" + : "run_prompt_and_record_mention_citation_accuracy_and_competitors", + }; + }), + ); +} + +export function getSeoGeoAuditWorkbookRowsForExperiment(experimentId: string) { + return buildSeoGeoAuditWorkbookRows().filter((row) => row.experimentId === experimentId); +} + +export function renderSeoGeoAuditWorkbook(experimentId: string) { + const experiment = getGrowthExperimentById(experimentId); + const rows = getSeoGeoAuditWorkbookRowsForExperiment(experimentId); + + if (!experiment || rows.length === 0) { + throw new Error(`Unknown SEO/GEO audit workbook experiment: ${experimentId}`); + } + + return [ + "# SEO/GEO Evidence Workbook", + "", + `Experiment: ${experiment.id}`, + `Lifecycle stage: ${experiment.lifecycleStage}`, + `Target user: ${experiment.targetUser}`, + `Minimum window: ${experiment.minimumWindow}`, + `Primary CTA: ${experiment.primaryCta}`, + `Primary metric: ${experiment.primaryMetric}`, + `Guardrail metric: ${experiment.guardrailMetric}`, + "Decision: insufficient_data_until_14_day_ga4_search_console_and_ai_answer_evidence_exists", + "", + "| Role | Route | Surface | Query | Task kind | Evidence fields | Success criteria | Next action |", + "| --- | --- | --- | --- | --- | --- | --- | --- |", + ...rows.map( + (row) => + `| ${row.routeRole} | ${row.canonicalPath} | ${row.surface} | ${row.query} | ${row.taskKind} | ${row.evidenceFields.join( + "; ", + )} | ${row.successCriteria} | ${row.nextAction} |`, + ), + "", + "Guardrails:", + "", + "- Keep GA4, Search Console, and AI-answer evidence separate from the decision until the minimum window is complete.", + "- Record omissions as evidence; do not convert prompt coverage into visibility claims.", + `- Forbidden claims to flag: ${Array.from(new Set(rows.flatMap((row) => row.forbiddenClaims))).join("; ")}.`, + ].join("\n"); +} diff --git a/src/server/generation/generation.test.ts b/src/server/generation/generation.test.ts index 29bd247..6d55a37 100644 --- a/src/server/generation/generation.test.ts +++ b/src/server/generation/generation.test.ts @@ -547,6 +547,7 @@ describe("project launch generation backend", () => { "readme", "social", "deck", + "site", "visual", "outreach", ]); @@ -561,7 +562,7 @@ describe("project launch generation backend", () => { source: expect.stringContaining("README or repo metadata includes"), }), ); - expect(result.launchBrief.launchMaterialsMap.channels[3]).toEqual( + expect(result.launchBrief.launchMaterialsMap.channels[4]).toEqual( expect.objectContaining({ type: "visual", artifactLabel: "Visual explainer prompt", @@ -575,6 +576,7 @@ describe("project launch generation backend", () => { "readme", "social", "deck", + "site", "outreach", "visual", ]); @@ -613,6 +615,13 @@ describe("project launch generation backend", () => { label: "Pitch deck outline", body: expect.stringContaining("Problem:"), }), + expect.objectContaining({ + type: "site", + label: "Launch site page spine", + fileName: "nexu-io-open-design-launch-site-page-spine.md", + body: expect.stringContaining("## Launch site page spine"), + sourceReferences: expect.arrayContaining([expect.stringContaining("README or repo metadata includes")]), + }), ]), ); expect(JSON.stringify(result.launchBrief)).not.toMatch(/best|guaranteed|customers|revenue/i); diff --git a/src/server/generation/launch-brief.ts b/src/server/generation/launch-brief.ts index 220b9e7..e22deba 100644 --- a/src/server/generation/launch-brief.ts +++ b/src/server/generation/launch-brief.ts @@ -25,7 +25,7 @@ export function buildRepoLaunchBrief(input: { const insights = padItems(input.brief.keyInsights, [ "Repository evidence is compressed into a clear launch story.", "Source-backed assets help reviewers separate facts from hypotheses.", - "The launch package can be reused across README, social, deck, and outreach surfaces.", + "The launch package can be reused across README, social, deck, site, and outreach surfaces.", ]).slice(0, 3); const workflow = padItems(input.brief.workflowSteps, ["Brief", "Generate", "Review"]).slice(0, 3); const audience = audienceHypothesis(input.metadata); @@ -191,6 +191,29 @@ function buildLaunchBriefArtifacts(input: { ].join("\n"), sourceReferences: input.sourceReferences, }, + { + type: "site", + label: "Launch site page spine", + fileName: `${slug}-launch-site-page-spine.md`, + body: [ + `# Launch site page spine for ${input.repoFullName}`, + "", + "## Launch site page spine", + "", + `Summary: ${input.summary}`, + `Audience hypothesis: ${input.audienceHypothesis}`, + "", + "## Page outline", + `- Hero: Explain ${input.repoFullName} with the strongest source-backed launch angle.`, + `- Proof: Use "${input.launchAngles[0]?.body ?? input.summary}" only if the cited source supports it.`, + "- Workflow: Show how a visitor moves from repository context to README, social, deck, visual, and outreach artifacts.", + "- CTA: Ask visitors to generate a similar launch package or request a reviewed full package.", + "- Guardrail: Do not publish unsupported traction, adoption, commercial, pricing, or benchmark claims.", + "", + sourceBlock, + ].join("\n"), + sourceReferences: input.sourceReferences, + }, { type: "outreach", label: "Product outreach draft", @@ -284,7 +307,7 @@ function buildLaunchMaterialsMap(input: { return { title: `${input.repoFullName} launch materials map`, - summary: `Channel plan for README, social, deck, visual, and outreach launch materials from ${input.summary}`, + summary: `Channel plan for README, social, deck, site, visual, and outreach launch materials from ${input.summary}`, channels: [ { type: "readme", @@ -319,6 +342,17 @@ function buildLaunchMaterialsMap(input: { reviewQuestion: "Which deck slide needs the strongest source citation before sharing outside the team?", successSignal: "Deck artifact copied or downloaded; full launch package CTA clicked after artifact review.", }, + { + type: "site", + label: "Launch site page spine", + primaryUser: "Technical founders, DevRel operators, and visitors comparing the project before opening GitHub", + jobToBeDone: "Understand the project story, source proof, and launch package path before diving into the repository.", + artifactLabel: "Launch site page spine", + channelFit: `Turn the story map into a crawlable page outline: hero proof from "${topAngle}", workflow, artifacts, and review guardrails.`, + source: primarySource, + reviewQuestion: "Which source-backed proof belongs above the fold before publishing a public site page?", + successSignal: "Site spine copied or downloaded; full launch package request or generation_started follows the site CTA.", + }, { type: "visual", label: "Visual project explainer", @@ -394,7 +428,7 @@ function buildStoryMap(input: { id: "launch", label: "Launch", title: "Channel package", - detail: `Package README, social, deck, outreach, and visual assets using the ${input.visualCategory} direction.`, + detail: `Package README, social, deck, site, outreach, and visual assets using the ${input.visualCategory} direction.`, source: "Launch package channels from the QuickFork generation workflow.", }, ], diff --git a/src/server/generation/types.ts b/src/server/generation/types.ts index 1c6eefb..834c7de 100644 --- a/src/server/generation/types.ts +++ b/src/server/generation/types.ts @@ -228,7 +228,7 @@ export interface RepoLaunchStoryMap { nodes: RepoLaunchStoryMapNode[]; } -export type RepoLaunchMaterialChannelType = "readme" | "social" | "deck" | "visual" | "outreach"; +export type RepoLaunchMaterialChannelType = "readme" | "social" | "deck" | "site" | "visual" | "outreach"; export interface RepoLaunchMaterialChannel { type: RepoLaunchMaterialChannelType; @@ -248,7 +248,7 @@ export interface RepoLaunchMaterialsMap { channels: RepoLaunchMaterialChannel[]; } -export type RepoLaunchBriefArtifactType = "audience" | "story_map" | "materials_map" | "readme" | "social" | "deck" | "outreach" | "visual"; +export type RepoLaunchBriefArtifactType = "audience" | "story_map" | "materials_map" | "readme" | "social" | "deck" | "site" | "outreach" | "visual"; export interface RepoLaunchBriefArtifact { type: RepoLaunchBriefArtifactType; diff --git a/src/server/marketing/launch-package-fit.test.ts b/src/server/marketing/launch-package-fit.test.ts index 838475e..bff21fa 100644 --- a/src/server/marketing/launch-package-fit.test.ts +++ b/src/server/marketing/launch-package-fit.test.ts @@ -11,7 +11,7 @@ describe("launch package fit scoring", () => { launchTimeline: "within_30_days", packageModel: "single_launch", buyingTrigger: "launch_deadline", - packageScope: ["readme", "social", "deck", "outreach", "visual_explainer"], + packageScope: ["readme", "social", "deck", "outreach", "sites", "visual_explainer"], humanReviewNeeded: true, notes: "Launching an AI repo and need source-backed README, deck, and outreach review.", }), diff --git a/src/server/marketing/lead-capture.test.ts b/src/server/marketing/lead-capture.test.ts index 28dbbaa..9d3b36c 100644 --- a/src/server/marketing/lead-capture.test.ts +++ b/src/server/marketing/lead-capture.test.ts @@ -114,7 +114,7 @@ describe("lead capture", () => { launchTimeline: "within_30_days", packageModel: "single_launch", buyingTrigger: "launch_deadline", - packageScope: ["readme", "social", "deck", "outreach", "visual_explainer"], + packageScope: ["readme", "social", "deck", "outreach", "sites", "visual_explainer"], humanReviewNeeded: true, notes: "Launching an AI repo and need source-backed README, deck, and outreach review.", }, @@ -159,7 +159,7 @@ describe("lead capture", () => { launchTimeline: "within_30_days", packageModel: "single_launch", buyingTrigger: "launch_deadline", - packageScope: ["readme", "social", "deck", "outreach", "visual_explainer"], + packageScope: ["readme", "social", "deck", "outreach", "sites", "visual_explainer"], humanReviewNeeded: true, notes: "Launching an AI repo and need source-backed README, deck, and outreach review.", },