startup_traction · diff
git:20260902.af2a47c to git:20260906.f9cef19
33 added, 31 removed. Audit A to A.
---
name: startup_traction
- description: Extracts, analyzes, and summarizes all commercial traction and agreements (LoIs, MoUs, Pilot agreements) from a startup's data room into a structured overview table and synthesis.
+ description: Summarize commercial traction and agreements from a startup's data room. Use for LoIs, MoUs, pilots, partnerships and traction evidence.
---
- # Startup Traction & Commercial Agreements Summarizer
+ # Startup traction
- ## Description
- This skill extracts, analyzes, and summarizes all commercial agreements (LoIs, MoUs, Pilot agreements, pre-contracts, partnerships) and traction metrics from a startup's data room. It relies on the `dataset_chat` utility to semantically search for the relevant agreements and run the analysis, returning a formatted Markdown table and synthesis.
+ Summarize retrieved commercial evidence in a table and synthesis.
- ## Trigger
- Use this skill when the user asks to summarize, extract, or list traction, commercial agreements, LoIs, MoUs, or partnerships for a specific startup.
+ ## Inputs and outputs
- ## Inputs
- * `startup_name`: A string representing the startup's name (e.g., `"fabas"`). This directly corresponds to the dataset name.
+ The async `startup_traction(startup_name)` returns a one-element
+ `list[InsightFile]`, named `startup-traction-<startup>-<model>.md`.
+ The configured query and instructions define the requested categories.
- ## Workflow
+ ## Workflow and dependencies
- 1. **Dataset Preparation:**
- * Convert `startup_name` to a dataset slug with `slugify(...)`.
- * Resolve and prepare the startup dataset with `ensure_startup_dataset(...)`.
- * Run `sync_datasets([dataset_slug], raise_on_error=True)` so OCR and embeddings are current before analysis.
+ Prepare and synchronize the startup, then select a manual override or reusable
+ report. Freshness uses indexed startup revisions and the configured query and
+ instructions.
- 2. **Configuration Loading:**
- * Call `load_repository_config("startup_traction")` and extract:
- * `query = config["startup_traction"]["query"]`
- * `llm_instructions = config["startup_traction"]["llm_instructions"]`
+ Call `dataset_chat(dataset_name=..., queries=..., prompt=...)` with
+ `max_chunks=100` and `strict_insufficient_context=False`. Retrieval is bounded;
+ this does not establish exhaustive coverage of every agreement.
- 3. **Insight File & Caching:**
- * Construct the traction insight with `lib.insights.InsightFile(dataset=dataset_slug, skill="startup_traction", model=llm_model(), config_key=query + llm_instructions)`.
- * Use `insight.find(selection="reusable")` and `insight.content()` to reuse a fresh existing traction report when available.
+ The registry declares `startup-profile`, but direct traction generation neither
+ calls nor reads that profile.
- 4. **Data Retrieval, Synthesis & Output:**
- * Invoke `dataset_chat(dataset_name=dataset_slug, questions=query, llm_instructions=llm_instructions, max_chunks=100, strict_insufficient_context=False)`.
- * If there is insufficient indexed context, raise an error and do not save an insight.
- * Save the Markdown result with `insight.save(result)`, log `insight.path`,
- and return `[insight]`.
+ ## Side effects and failure behavior
- ## Architecture Constraints
- * **Entry Point:** Must have a `__main__.py` containing a Typer CLI that accepts `startup_name` as an argument. The CLI must contain zero business logic.
- * **Core Logic:** The core logic must live in `startup_traction.py` under the
- function `async def startup_traction(startup_name: str) -> InsightResult:`.
- * **Error Handling:** Use standard Python exceptions internally, caught only by the Typer CLI in `__main__.py`.
+ Preparation may import Dealum data; synchronization/retrieval may convert and
+ index documents. Generation saves the traction report and performs no outreach.
+ Technical errors propagate. Contrary to the former documentation, missing
+ context does not necessarily raise: a nonempty dataset-chat fallback is saved;
+ a falsey response is replaced with “No relevant information found.”
+ Whether missing evidence should block output remains a separate behavior decision.
+
## Usage
```bash
- conda run -n sictic-env python -m skills.harness /startup_traction "<STARTUP_NAME>"
+ conda run -n sictic-env python -m skills.harness '/startup_traction "<STARTUP>"'
```
+
+ The direct CLI uses `--startup`.
+
+ ## References
+
+ - [Implementation](startup_traction.py)
+ - [Configuration](../../config/startup_traction/)
+ - [Dataset chat](../dataset_chat/SKILL.md)