Prefer AI-native venture ideas
This commit is contained in:
parent
dc7e21d77c
commit
86c52c6f6b
3 changed files with 245 additions and 8 deletions
|
|
@ -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}
|
||||
|
|
|
|||
164
docs/venture_discovery_cohort_v02_report.md
Normal file
164
docs/venture_discovery_cohort_v02_report.md
Normal file
|
|
@ -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.
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue