diff --git a/agents/venture_discovery.py b/agents/venture_discovery.py index 5f33592..f6ec6c4 100644 --- a/agents/venture_discovery.py +++ b/agents/venture_discovery.py @@ -19,9 +19,10 @@ from model_router.router import ModelCapability, ModelRequestContract, ModelRout PITCH_SECTIONS = ["Company name", "One-line thesis", "Problem", "ICP", "Why now", "Product / service", "Business model", "Pricing", "Route to first customer", "Validation plan", "$50 capital allocation proposal", "Time to first dollar", "Path to $500 net cash", "Competition", "Differentiation", "Build requirements", "Distribution requirements", "Risks", "What would falsify the thesis", "Confidence"] -SCORE_DIMENSIONS = ["Demand Evidence", "Time-to-First-Dollar Attractiveness", "Capital Efficiency", "Validation Affordability", "Gross Margin Potential", "Distribution Feasibility", "Build Simplicity", "Defensibility", "Market Opportunity", "Competitive Position", "Risk Manageability", "Probability of Reaching $500"] +SCORE_DIMENSIONS = ["Demand Evidence", "Time-to-First-Dollar Attractiveness", "Capital Efficiency", "Validation Affordability", "Gross Margin Potential", "Distribution Feasibility", "Build Simplicity", "Defensibility", "Market Opportunity", "Competitive Position", "Risk Manageability", "AI Leverage", "Platformization Potential", "Probability of Reaching $500"] SCORE_DEFINITIONS = {dimension: "100 = highly attractive; 0 = highly unattractive" for dimension in SCORE_DIMENSIONS} EVIDENCE_CEILINGS = {EvidenceTier.TIER_0_THESIS: 35, EvidenceTier.TIER_1_PUBLIC_EVIDENCE: 55, EvidenceTier.TIER_2_CUSTOMER_SIGNAL: 70, EvidenceTier.TIER_3_WILLINGNESS_TO_PAY: 85, EvidenceTier.TIER_4_PAID_CUSTOMER: 95, EvidenceTier.TIER_5_REPEATABLE_TRACTION: 100} +AI_NATIVE_POLICY = {"preference": "Prefer AI-native opportunities where Artifex can build or deliver most value with existing agents, local inference, and owned workflow capabilities.", "preferred_classes": ["AI wrapper platforms", "AI-enabled services", "AI infrastructure / developer tools", "AI research / intelligence products", "AI automation for SMB / enterprise workflows"], "soft_portfolio_targets": {"ai_wrapper_platforms": "40-50%", "ai_enabled_services": "20-30%", "developer_infrastructure_intelligence": "10-20%", "non_ai_economic_outliers": "10-20%"}, "penalize_concentration": ["Shopify/ecommerce", "generic audits", "emergency fix services", "one-off consulting", "identical outbound-led service models"], "do_not": "Do not let AI novelty outweigh customer demand."} class VentureDiscoveryService: @@ -35,8 +36,8 @@ class VentureDiscoveryService: mandate = CompanyMandate.objects.create( objective="Design a business that could plausibly turn at most $50 of external validation capital into $500 net new cash.", constraints={"external_validation_capital_max": 50, "target_net_new_cash": 500, "target_window_days": 30, "no_equity_raise": True, "no_debt": True, "no_illegal_or_deceptive_activity": True, "no_spam": True, "no_fake_traction": True, "no_fabricated_customer_evidence": True, "no_real_spend_in_v0": True, "no_real_customer_outreach_in_v0": True, "existing_artifex_compute_sunk_available": True}, - optimization_targets=["time to first dollar", "capital efficiency", "real demand evidence", "high gross margin", "realistic execution", "low external dependency", "ability to validate cheaply"], - metadata={"milestone": "VENTURE_DISCOVERY_V0", "spend_authorized": False, "customer_outreach_authorized": False}, + optimization_targets=["time to first dollar", "capital efficiency", "real demand evidence", "high gross margin", "realistic execution", "low external dependency", "ability to validate cheaply", "AI leverage where economically justified", "service-to-platform evolution potential"], + metadata={"milestone": "VENTURE_DISCOVERY_V0", "spend_authorized": False, "customer_outreach_authorized": False, "ai_native_policy": AI_NATIVE_POLICY}, ) self._artifact(None, mandate, "VENTURE_MANDATE", "Venture Discovery V0 Mandate", {"objective": mandate.objective, "constraints": mandate.constraints, "optimization_targets": mandate.optimization_targets}, self._readable_mandate(mandate), "venture_discovery") return mandate @@ -211,7 +212,7 @@ class VentureDiscoveryService: def produce_investment_memo(self, diligence: ICDiligence, gap: PortfolioCapabilityGap, *, graph_run=None) -> VentureArtifact: decision = diligence.decision proposal = diligence.proposal - memo = {"Company": proposal.title, "Thesis": proposal.pitch["One-line thesis"], "Mandate": proposal.mandate.objective, "Requested capital": str(proposal.capital_requested), "Recommended allocation": decision.recommended_allocation, "IC decision": decision.decision, "Key metrics": {"P($500 within 30 days)": decision.probability_500_within_30_days, "raw P($500 within 30 days)": decision.raw_probability_500_within_30_days, "evidence ceiling": decision.evidence_ceiling, "evidence tier": decision.evidence_tier, "estimated time to first dollar": proposal.time_to_first_dollar_estimate, "expected gross margin": proposal.expected_margin, "validation cost": "$10-$20 initial tranche; $50 maximum after approval", "build effort": proposal.build_complexity, "distribution feasibility": decision.component_scores["Distribution Feasibility"]}, "Research evidence": proposal.pitch.get("Research evidence", {}), "Why it may work": ["Revenue path starts with a paid diagnostic, not a full SaaS build.", "Artifex has planning, engineering, frontend, review, graph, and agent-control capabilities already.", "Validation budget can be gated behind evidence."], "Why it may fail": diligence.red_team_challenge.get("concerns", []), "Diligence questions": [q.question for q in diligence.questions.all()], "Company responses": [r.answer for r in ICResponse.objects.filter(question__diligence=diligence)], "Red-team concerns": diligence.red_team_challenge.get("concerns", []), "IC scoring": decision.component_scores, "Score definitions": decision.score_definitions, "Capital recommendation": decision.recommended_allocation, "Validation gates": [decision.validation_condition], "Kill criteria": decision.kill_criteria, "Next decision point": decision.next_decision_point, "Capability gap": {"available": gap.available, "partial": gap.partial, "missing": gap.missing}} + memo = {"Company": proposal.title, "Thesis": proposal.pitch["One-line thesis"], "Mandate": proposal.mandate.objective, "Requested capital": str(proposal.capital_requested), "Recommended allocation": decision.recommended_allocation, "IC decision": decision.decision, "Key metrics": {"P($500 within 30 days)": decision.probability_500_within_30_days, "raw P($500 within 30 days)": decision.raw_probability_500_within_30_days, "evidence ceiling": decision.evidence_ceiling, "evidence tier": decision.evidence_tier, "AI leverage": decision.component_scores.get("AI Leverage"), "platformization potential": decision.component_scores.get("Platformization Potential"), "estimated time to first dollar": proposal.time_to_first_dollar_estimate, "expected gross margin": proposal.expected_margin, "validation cost": "$10-$20 initial tranche; $50 maximum after approval", "build effort": proposal.build_complexity, "distribution feasibility": decision.component_scores["Distribution Feasibility"]}, "Research evidence": proposal.pitch.get("Research evidence", {}), "Why it may work": ["Revenue path starts with a paid diagnostic, not a full SaaS build.", "Artifex has planning, engineering, frontend, review, graph, and agent-control capabilities already.", "Validation budget can be gated behind evidence."], "Why it may fail": diligence.red_team_challenge.get("concerns", []), "Diligence questions": [q.question for q in diligence.questions.all()], "Company responses": [r.answer for r in ICResponse.objects.filter(question__diligence=diligence)], "Red-team concerns": diligence.red_team_challenge.get("concerns", []), "IC scoring": decision.component_scores, "Score definitions": decision.score_definitions, "Capital recommendation": decision.recommended_allocation, "Validation gates": [decision.validation_condition], "Kill criteria": decision.kill_criteria, "Next decision point": decision.next_decision_point, "Capability gap": {"available": gap.available, "partial": gap.partial, "missing": gap.missing}} identity = self.validate_identity_content(proposal, memo) memo["Identity validation"] = identity return self._artifact(proposal, proposal.mandate, "FINAL_INVESTMENT_MEMO", "Final IC Investment Memo", memo, self._readable_memo(memo), "Independent IC", graph_run=graph_run) @@ -290,8 +291,10 @@ class VentureDiscoveryService: proposal = member.proposal decision = proposal.ic_diligence.order_by("-created_at").first().decision capability_burden = proposal.capability_requirements.filter(status=CapabilityStatus.MISSING).count() - score = round(decision.composite_score + decision.probability_500_within_30_days * 0.2 - capability_burden * 1.5 - collision_risk[str(proposal.id)] * 2, 1) - rows.append({"proposal_id": str(proposal.id), "company": proposal.title, "thesis": proposal.pitch.get("One-line thesis", proposal.description), "ic_score": decision.composite_score, "probability": decision.probability_500_within_30_days, "decision": decision.decision, "evidence_tier": decision.evidence_tier, "initial_tranche": str(decision.initial_tranche or "0"), "portfolio_score": score, "capability_burden": capability_burden, "collision_risk": collision_risk[str(proposal.id)]}) + concentration_penalty = self._generic_concentration_penalty(proposal) + ai_bonus = (decision.component_scores.get("AI Leverage", 0) * 0.08) + (decision.component_scores.get("Platformization Potential", 0) * 0.06) + score = round(decision.composite_score + decision.probability_500_within_30_days * 0.2 + ai_bonus - capability_burden * 1.5 - collision_risk[str(proposal.id)] * 2 - concentration_penalty, 1) + rows.append({"proposal_id": str(proposal.id), "company": proposal.title, "thesis": proposal.pitch.get("One-line thesis", proposal.description), "ic_score": decision.composite_score, "probability": decision.probability_500_within_30_days, "decision": decision.decision, "evidence_tier": decision.evidence_tier, "initial_tranche": str(decision.initial_tranche or "0"), "ai_leverage": decision.component_scores.get("AI Leverage", 0), "platformization_potential": decision.component_scores.get("Platformization Potential", 0), "portfolio_score": score, "capability_burden": capability_burden, "collision_risk": collision_risk[str(proposal.id)], "concentration_penalty": concentration_penalty}) rows.sort(key=lambda item: item["portfolio_score"], reverse=True) for rank, row in enumerate(rows, start=1): member = cohort.members.get(proposal_id=row["proposal_id"]) @@ -397,7 +400,7 @@ class VentureDiscoveryService: if self.router is not None: try: slot = f" Independent cohort slot: {ideation_index}. Do not use or imitate other cohort ideas; no other ideas are visible." if ideation_index else "" - response = self.router.complete(ModelRequestContract(purpose=ModelCapability.PLANNING, model_hint="sol", prompt="Generate exactly ONE startup idea for Venture Discovery V0. Return a single JSON object, not a list. Respect no spend and no outreach in V0. Include title, one_line_thesis, description, problem, target_customer, proposed_solution, business_model, pricing_hypothesis, acquisition_strategy, validation_plan, capital_requested, time_to_first_dollar_estimate, expected_margin, build_complexity, market_evidence, differentiation, major_risks, confidence." + slot + " Mandate: " + json.dumps({"objective": mandate.objective, "constraints": mandate.constraints, "optimization_targets": mandate.optimization_targets}))) + response = self.router.complete(ModelRequestContract(purpose=ModelCapability.PLANNING, model_hint="sol", prompt="Generate exactly ONE startup idea for Venture Discovery V0. Return a single JSON object, not a list. Respect no spend and no outreach in V0. Keep the $50 to $500 in 30 days mandate. Prefer, but do not require, AI-native businesses where Artifex can deliver most value using agents/local inference: AI wrapper platforms, AI-enabled services, AI infrastructure/developer tools, AI intelligence products, or SMB/enterprise workflow automation. Do not let AI novelty outweigh customer demand. Penalize generic audits, emergency fix services, one-off consulting, Shopify/ecommerce concentration, and identical outbound-led service models unless exceptional. Include title, one_line_thesis, description, problem, target_customer, proposed_solution, business_model, pricing_hypothesis, acquisition_strategy, validation_plan, capital_requested, time_to_first_dollar_estimate, expected_margin, build_complexity, market_evidence, differentiation, major_risks, confidence." + slot + " Mandate: " + json.dumps({"objective": mandate.objective, "constraints": mandate.constraints, "optimization_targets": mandate.optimization_targets, "ai_native_policy": AI_NATIVE_POLICY}))) parsed = extract_json_object(response.content) if isinstance(parsed, dict) and parsed.get("title"): return self._normalize_payload(parsed), "sol" @@ -496,8 +499,38 @@ class VentureDiscoveryService: validation = 78 if "5 credible" in proposal.validation_plan or "willingness" in proposal.validation_plan.lower() else 42 market_size = 62 if coverage_ratio >= 0.6 else 44 defensibility = 42 + (10 if service_model else 0) + (8 if coverage_ratio >= 0.8 else 0) + ai_leverage = self.ai_leverage_score(proposal) + platformization = self.platformization_potential(proposal) probability = round((demand * 0.22 + pricing * 0.12 + pain * 0.16 + distribution * 0.14 + build * 0.1 + capital * 0.1 + risk * 0.16), 0) - return {"Demand Evidence": demand, "Time-to-First-Dollar Attractiveness": 76 if service_model else 50, "Capital Efficiency": capital, "Validation Affordability": validation, "Gross Margin Potential": gross_margin, "Distribution Feasibility": distribution, "Build Simplicity": build, "Defensibility": min(75, defensibility), "Market Opportunity": market_size, "Competitive Position": competition, "Risk Manageability": risk, "Probability of Reaching $500": int(max(20, min(80, probability)))} + return {"Demand Evidence": demand, "Time-to-First-Dollar Attractiveness": 76 if service_model else 50, "Capital Efficiency": capital, "Validation Affordability": validation, "Gross Margin Potential": gross_margin, "Distribution Feasibility": distribution, "Build Simplicity": build, "Defensibility": min(75, defensibility), "Market Opportunity": market_size, "Competitive Position": competition, "Risk Manageability": risk, "AI Leverage": ai_leverage, "Platformization Potential": platformization, "Probability of Reaching $500": int(max(20, min(80, probability)))} + + def ai_leverage_score(self, proposal: CompanyProposal) -> int: + text = " ".join([proposal.title, proposal.description, proposal.problem, proposal.proposed_solution, proposal.business_model, proposal.differentiation]).lower() + score = 20 + if any(term in text for term in ["ai", "agent", "model", "copilot", "automation", "inference", "llm"]): + score += 25 + if any(term in text for term in ["monitor", "synthesis", "alerts", "intelligence", "workflow", "document", "evaluation", "deployment", "security", "data transformation"]): + score += 18 + if any(term in text for term in ["recurring", "monthly", "subscription", "platform", "software", "api"]): + score += 15 + if "manual" in text and not any(term in text for term in ["agent", "automation", "software", "platform"]): + score -= 15 + if any(term in text for term in ["generic audit", "emergency fix", "one-time consulting"]): + score -= 12 + return max(0, min(100, score)) + + def platformization_potential(self, proposal: CompanyProposal) -> int: + text = " ".join([proposal.title, proposal.description, proposal.proposed_solution, proposal.business_model, proposal.acquisition_strategy, proposal.validation_plan]).lower() + score = 25 + if any(term in text for term in ["platform", "software", "saas", "api", "dashboard", "monitor", "alerts", "workflow"]): + score += 25 + if any(term in text for term in ["repeatable", "template", "standardized", "recurring", "monthly", "subscription"]): + score += 20 + if any(term in text for term in ["data", "history", "knowledge", "benchmark", "evaluation", "repository"]): + score += 12 + if any(term in text for term in ["one-time", "emergency", "manual only", "concierge"]): + score -= 12 + return max(0, min(100, score)) def _pitch(self, payload: dict[str, Any], *, fallback: bool) -> dict[str, Any]: pitch = {"Company name": payload["title"], "One-line thesis": payload["one_line_thesis"], "Problem": payload["problem"], "ICP": payload["target_customer"], "Why now": "AI tooling lowers build cost, increasing the risk that founders overbuild before validating demand.", "Product / service": payload["proposed_solution"], "Business model": payload["business_model"], "Pricing": payload["pricing_hypothesis"], "Route to first customer": payload["acquisition_strategy"], "Validation plan": payload["validation_plan"], "$50 capital allocation proposal": {"initial": "$10 only after approval", "reserved": "$40 held until evidence gate", "v0_spend": "$0"}, "Time to first dollar": payload["time_to_first_dollar_estimate"], "Path to $500 net cash": "Sell 6-10 fixed-scope audits at $49-$99 while keeping delivery manual and using sunk Artifex compute.", "Competition": "Generic startup consultants, founder communities, AI business idea tools, and DIY validation templates. Public competitor research is unverified unless web research is configured.", "Differentiation": payload["differentiation"], "Build requirements": ["report template", "intake form", "manual analysis workflow", "optional landing page after validation approval"], "Distribution requirements": ["compliant outreach plan", "community/content channels", "CRM-lite tracking before first customers"], "Risks": payload["major_risks"], "What would falsify the thesis": "No willingness-to-pay signal at $49-$99 or fewer than 5 credible target-customer responses after approved compliant validation.", "Confidence": payload["confidence"], "Evidence caveat": "Deterministic fallback evidence only; not equivalent to Sol or public web research." if fallback else "Generated by Sol; public web research still only included if sources are present."} @@ -549,6 +582,21 @@ class VentureDiscoveryService: data["flags"] = flags return data + def _generic_concentration_penalty(self, proposal: CompanyProposal) -> int: + text = " ".join([proposal.title, proposal.description, proposal.proposed_solution, proposal.business_model, proposal.acquisition_strategy]).lower() + penalty = 0 + if "shopify" in text or "ecommerce" in text: + penalty += 3 + if "audit" in text and not any(term in text for term in ["ai", "agent", "platform", "monitor", "automation"]): + penalty += 4 + if "emergency" in text or "fix" in text: + penalty += 4 + if "consulting" in text or "one-time" in text: + penalty += 3 + if "outbound" in text or "community" in text: + penalty += 2 + return penalty + def _collision_summary(self, cohort: VentureCohort) -> dict[str, int]: counts = Counter(cohort.collisions.values_list("classification", flat=True)) return {choice: counts.get(choice, 0) for choice in OverlapClassification.values} diff --git a/docs/venture_discovery_cohort_v02_report.md b/docs/venture_discovery_cohort_v02_report.md new file mode 100644 index 0000000..a578968 --- /dev/null +++ b/docs/venture_discovery_cohort_v02_report.md @@ -0,0 +1,164 @@ +# Venture Discovery Cohort V0.2 Report + +This is the 10-company cohort report. The earlier `docs/venture_discovery_v0_company_proposal.md` is the single-company V0 memo. + +## Cohort + +- Cohort ID: `VDV02-20260815142550-1fcf1933` +- GraphRun: `1` +- Companies: `10` +- Total spend: `$0` +- Customer outreach: `none` +- Evidence tier ceiling in this cohort: `TIER_1_PUBLIC_EVIDENCE` +- Peak concurrency: `2` +- Total public research queries: `10` +- Total source-linked public evidence sources: `84` +- Total model requests: `20` +- Total cohort runtime: `1000.98s` + +## Ranking + +| Rank | Company | IC Score | Evidence-Adjusted P($500/30d) | Decision | Evidence Tier | Initial Tranche | +| ---: | --- | ---: | ---: | --- | --- | ---: | +| 1 | Compliance Changelog Briefs for Shopify App Developers | 61.2 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 2 | Local Permit Deadline Monitor | 68.8 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 3 | Emergency Spreadsheet Fix Desk | 68.8 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 4 | Emergency Client Portal Cleanup Sprint | 68.1 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 5 | RFP Deadline Radar | 65.8 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 6 | Revenue Leak Snapshot for Local Service Businesses | 65.8 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 7 | Local Permit Packet Concierge | 65.8 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 8 | Emergency Spreadsheet Fix Kit | 65.1 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 9 | Emergency Founder Metrics Cleanup | 64.2 | 55% | CONDITIONAL_FUND | TIER_1_PUBLIC_EVIDENCE | $10 | +| 10 | Emergency Screenshot-to-SOP Service | 60.6 | 55% | REVISE_AND_RESUBMIT | TIER_1_PUBLIC_EVIDENCE | $0 | + +## Top 3 Finalists + +### 1. Compliance Changelog Briefs for Shopify App Developers + +**Thesis:** Sell fast, human-edited weekly compliance-change briefs to small Shopify app developers who cannot afford legal monitoring but need to avoid platform or privacy-policy surprises. + +**Why ranked highly:** Best portfolio score after balancing IC score, capped probability, capability burden, and lower collision risk. + +**Biggest risk:** Requires a reliable ongoing source-monitoring and compliance interpretation workflow; legal/compliance positioning must avoid legal advice. + +**Initial tranche:** `$10` + +**Validation condition:** Obtain 5 credible target-customer responses or 1 explicit willingness-to-pay signal before any build or further spend. + +### 2. Local Permit Deadline Monitor + +**Thesis:** Sell small landlords a `$49` same-day audit that identifies upcoming rental registration, inspection, and permit deadlines using only public municipal data. + +**Why ranked highly:** Strong IC score and clear urgency around deadlines, despite higher collision risk with other local/permit ideas. + +**Biggest risk:** Local regulatory variation and legal/compliance boundaries. + +**Initial tranche:** `$10` + +**Validation condition:** Obtain 5 credible target-customer responses or 1 explicit willingness-to-pay signal before any build or further spend. + +### 3. Emergency Spreadsheet Fix Desk + +**Thesis:** A same-day service that fixes broken, slow, or confusing business spreadsheets for solo operators and small teams at a premium urgent-support price. + +**Why ranked highly:** Clear route to first cash, low build requirement, and broadly understandable pain. + +**Biggest risk:** Crowded freelancer/service alternatives and trust-building for urgent work. + +**Initial tranche:** `$10` + +**Validation condition:** Obtain 5 credible target-customer responses or 1 explicit willingness-to-pay signal before any build or further spend. + +## Collision Analysis + +| Classification | Count | +| --- | ---: | +| NONE | 7 | +| ADJACENT | 38 | +| COMPETITIVE | 0 | +| NEAR_DUPLICATE | 0 | +| DUPLICATE | 0 | + +No companies were automatically killed or merged. + +## Portfolio Concentration + +Concentration flags surfaced by Portfolio IC: + +- `6/10` companies classified as general business. +- `9/10` companies use a productized-service business model. +- `7/10` companies rely primarily on outbound/community distribution. +- `10/10` companies depend on the same core Company Mode infrastructure categories. + +Industry distribution: + +- shopify/ecommerce: `3` +- general business: `6` +- developer tools: `1` + +Business model distribution: + +- productized service: `9` +- hybrid: `1` + +Primary channel distribution: + +- outbound/community: `7` +- direct: `1` +- content/SEO: `1` +- marketplace: `1` + +## Capability Demand + +| Capability | Needed By | Earliest Stage | Status Distribution | Top 3 Count | +| --- | ---: | --- | --- | ---: | +| outbound sales | 10/10 | BEFORE_VALIDATION | MISSING: 10 | 3 | +| CRM | 10/10 | BEFORE_VALIDATION | MISSING: 10 | 3 | +| company budget management | 10/10 | BEFORE_VALIDATION | MISSING: 10 | 3 | +| payments | 10/10 | BEFORE_FIRST_CUSTOMER | MISSING: 10 | 3 | +| invoicing | 10/10 | BEFORE_FIRST_CUSTOMER | MISSING: 10 | 3 | +| legal/compliance | 10/10 | BEFORE_FIRST_CUSTOMER | MISSING: 10 | 3 | +| customer support | 10/10 | BEFORE_SCALING | MISSING: 10 | 3 | +| Board | 10/10 | BEFORE_VALIDATION | AVAILABLE: 10 | 3 | +| IC | 10/10 | BEFORE_VALIDATION | AVAILABLE: 10 | 3 | +| WEB_MARKET_RESEARCH | 10/10 | BEFORE_VALIDATION | AVAILABLE: 6, PARTIAL: 4 | 3 | +| software build | 10/10 | BEFORE_FIRST_CUSTOMER | AVAILABLE: 10 | 3 | +| frontend design | 10/10 | BEFORE_FIRST_CUSTOMER | AVAILABLE: 10 | 3 | +| deployment | 10/10 | BEFORE_FIRST_CUSTOMER | PARTIAL: 10 | 3 | +| Company Brain | 10/10 | BEFORE_SCALING | PARTIAL: 10 | 3 | + +## Top 3 Critical Capability Gaps + +1. outbound sales +2. CRM +3. company budget management + +Additional Top 3 gaps: + +- payments +- invoicing +- legal/compliance +- customer support + +## Recommended Next Artifex Builds + +1. outbound sales +2. CRM +3. company budget management +4. payments +5. invoicing + +## System Metrics + +- Total model requests: `20` +- Total tokens: `0` reported by provider metadata +- Total public research queries: `10` +- Total sources: `84` +- Total cohort runtime: `1000.98s` +- Peak concurrency: `2` +- Real spend: `$0` +- Customer outreach: `none` + +## Notes + +The evidence-adjusted probability is capped at `55%` because every company reached only `TIER_1_PUBLIC_EVIDENCE`. No direct customer signal, willingness-to-pay, paid customer, or repeatable traction was collected in V0.2. diff --git a/tests/test_venture_discovery_cohort_v02.py b/tests/test_venture_discovery_cohort_v02.py index 7b78cdb..bf70089 100644 --- a/tests/test_venture_discovery_cohort_v02.py +++ b/tests/test_venture_discovery_cohort_v02.py @@ -53,11 +53,36 @@ def test_evidence_tiers_probability_ceiling_and_score_orientation() -> None: svc.final_company_response(diligence) decision = svc.score_and_decide(diligence) assert set(decision.component_scores) == set(SCORE_DIMENSIONS) + assert "AI Leverage" in decision.component_scores + assert "Platformization Potential" in decision.component_scores assert all("100 = highly attractive" in definition for definition in decision.score_definitions.values()) assert decision.probability_500_within_30_days <= decision.evidence_ceiling assert decision.raw_probability_500_within_30_days >= decision.probability_500_within_30_days +def test_ai_native_platform_opportunities_receive_portfolio_preference() -> None: + svc = service() + mandate = svc.create_v0_mandate() + ai = svc.generate_single_company(mandate) + ai.title = "AI Support Knowledge Copilot" + ai.description = "AI agent platform that monitors support tickets, synthesizes answers, and builds a reusable knowledge workflow." + ai.proposed_solution = "Agent-assisted operational software with recurring automation and data accumulation." + ai.business_model = "Monthly SaaS platform plus AI-enabled service onboarding." + ai.differentiation = "Local inference and agent workflows automate most delivery with low marginal labor." + ai.save(update_fields=["title", "description", "proposed_solution", "business_model", "differentiation", "updated_at"]) + generic = svc.generate_single_company(mandate) + generic.title = "Emergency Shopify Audit Fix" + generic.description = "One-time manual Shopify audit and emergency fix service." + generic.proposed_solution = "Manual one-time consulting audit." + generic.business_model = "One-time consulting service." + generic.differentiation = "Fast human review." + generic.save(update_fields=["title", "description", "proposed_solution", "business_model", "differentiation", "updated_at"]) + + assert svc.ai_leverage_score(ai) > svc.ai_leverage_score(generic) + assert svc.platformization_potential(ai) > svc.platformization_potential(generic) + assert svc._generic_concentration_penalty(generic) > svc._generic_concentration_penalty(ai) + + def test_identity_contamination_detection_and_fingerprint_collision() -> None: svc = service() proposal = svc.generate_single_company(svc.create_v0_mandate())