Bizidea:基于 GitHub Copilot 的自动化创业研究工厂
vibewatch/bizidea
Bizidea 是一个每日全自动创业研究工厂,通过 GitHub Actions 定时触发 Bizidea Copilot 编排器,由八个专家智能体依次完成新闻筛选、创意生成去重、市场调研、商业计划、3 年财务模型与报告产出,每个选题生成 YAML 工件及简体中文版本。
Bizidea is a daily, fully-automated startup-research factory. A scheduled GitHub Actions workflow invokes the Bizidea Copilot orchestrator: one News Triage scan, idea generation + dedupe, then per-idea report production. Each surviving topic becomes a folder of YAML artifacts (idea, market research, business plan, 3-year financial model, machine-readable index) plus Simplified Chinese siblings. The companion Astro site renders those YAMLs as an FT-style editorial reading experience and ships to GitHub Pages on every push.
Live site: https://bizidea.genisisiq.com
How it works
A run is one orchestrator (Bizidea) delegating to eight specialists through GitHub Copilot's native custom-agent mechanism. Each specialist owns one stage and validates it; the orchestrator verifies files and validator exit codes instead of parsing a home-grown response protocol.
End-to-end flow
flowchart TD
cron([GitHub cron / manual dispatch]) --> wf[".github/workflows/bizidea.yml"]
wf -->|"copilot --agent Bizidea"| orch{{"Bizidea<br/>orchestrator"}}
orch -->|"once per run"| triage["News Triage<br/>web fetch · cluster · score · dedupe"]
triage -->|"writes"| triageFile[("ideas/_triage/<ts>/triage.yaml<br/>selected: cluster c1..cN")]
triageFile --> fanout{{"for each selected cluster"}}
fanout --> idea["Idea Generator<br/>one cluster → one idea"]
idea -->|"writes"| ideaFile[("idea.yaml<br/>+ embedded sourceContext")]
ideaFile --> dedup{{"scripts/deduplicate-idea.mjs<br/>vs ideas/_index.yaml"}}
dedup -->|"duplicate"| drop["delete partial folder"]
dedup -->|"new"| pipeline
subgraph pipeline ["Per-idea pipeline (English stages ordered, translations overlapped)"]
direction TB
mr["Market Researcher<br/>adaptive 24–36 page budget, TAM/SAM/SOM, competitors"] -->|"research.yaml"| bp["Business Plan Writer<br/>GTM, milestones, investor memo"]
bp -->|"business-plan.yaml"| fm["Financial Modeler<br/>3-year P&L, unit economics, funding ask"]
fm -->|"financial-model.yaml"| rep["Reporter<br/>extract + rate → website sidecar"]
zh["ZH Translator × 5<br/>GPT-6 Luna validated drafts"]
zhEdit["ZH Editor × 5<br/>source-anchored edit + rollback"]
ideaFile -.->|"idea.zh.yaml"| zh
mr -.->|"research.zh.yaml"| zh
bp -.->|"business-plan.zh.yaml"| zh
fm -.->|"financial-model.zh.yaml"| zh
rep -.->|"index.zh.yaml"| zh
zh --> zhEdit
zhEdit --> zhFiles[("*.zh.yaml × 5")]
end
zhFiles --> finalize{{"Bizidea finalize"}}
finalize -->|"node scripts/build-ideas-index.mjs --strict"| indexFile[("ideas/_index.yaml<br/>aggregated history")]
finalize -->|"npm run validate:all"| validate["validate everything"]
indexFile --> push["git commit & push"]
push --> deploy[".github/workflows/deploy.yml<br/>Astro build → GitHub Pages"]
Loading
Agents
| # | Agent | Writes | Job |
|---|---|---|---|
| 1 | News Triage | _triage/<ts>/triage.yaml |
Runs parallel search lanes with AnySearch when available, otherwise native web search. Selects only non-dominated cohort champions scoring 5 in creativity, venture potential, or white space, with hard source-diversity floors. |
| 2 | Idea Generator | <folder>/idea.yaml |
Privately explores ≥6 concepts across ≥4 venture archetypes, chooses a single champion rather than an average, records nearest-history differences, and rejects OS/copilot/control-plane naming. |
| 2.5 | gate | (deletes folder on dup) | scripts/deduplicate-idea.mjs runs after every idea.yaml. Duplicates removed before any research starts. |
| 3 | Market Researcher | <folder>/research.yaml |
Adaptive 24–36 page budget with parallel evidence lanes and saturation stopping; enforces publisher, source-type, primary, independent, and geographic diversity. |
| 4 | Business Plan Writer | <folder>/business-plan.yaml |
Investor-ready plan: ICP, product sequencing, GTM, milestones, hiring, risks, funding ask, investor memo. No web; gaps surfaced as null. |
| 5 | Financial Modeler | <folder>/financial-model.yaml |
3-year model: monthly Y1 + quarterly Y2/Y3 P&L, headcount, CAC/LTV/payback, runway-based funding ask, sanityChecks.flags, modelSanity summary. Every number ties to assumptions[]. |
| 6 | Reporter | <folder>/index.yaml |
Extracts and rates into the compact website sidecar and exposes the idea's champion selectionLens. Preserves units (K, M); missing values → null. |
| 7 | ZH Translator | One requested <folder>/*.zh.yaml |
GPT-6 Luna creates a publishable first pass and runs strict schema, identifier, number, terminology, qualifier, protected-term, undertranslation, and translationese checks. |
| 8 | ZH Editor | Edits one validated <folder>/*.zh.yaml |
GPT-6 Luna compares the complete English source with the valid Chinese draft, rewrites it as native investor-memo prose, and rolls back deterministically if the edited output damages fidelity. |
| ∞ | Bizidea finalize | ideas/_index.yaml |
After all five *.zh.yaml exist, sweeps partial <runTimestamp>-* folders, rebuilds the history index with --strict, then runs npm run validate:all (the same superset CI uses). |
Orchestration rules
- One triage per run. No second scout/news agent.
- Native delegation. Parent/child completion is provided by GitHub Copilot. Artifact existence and deterministic validators are authoritative.
- Champion selection. Every selected cluster must lead the cohort in at least one exceptional dimension and sit on the Pareto frontier; weighted-average mediocrity cannot pass.
- Generate-then-research barrier. All selected ideas are generated and deduped before any
Market Researcherinvocation, so the dedupe gate is authoritative across the batch. - Ordered English, overlapped two-pass translation. English stages remain dependency-ordered, while each validated artifact runs through GPT-6 Luna translation and source-anchored editing concurrently with the next English stage.
- Gate-and-retry. A failed gate triggers exactly one retry of the same specialist. A second failure marks only that idea as failed and deletes its partial folder.
- Stable folder names. scripts/create-report-dir.mjs creates
ideas/<runTimestamp>-<slug>/once; the name never changes if the slug evolves. - Hard stops. Triage failure or final index-rebuild failure aborts the whole run; per-idea failures only abort that idea.
- Localization is part of "done". A report is not generated until its five
*.zh.yamlfiles exist and parse.
Artifact gates
Stage contracts are enforced deterministically by scripts/validate-stage.mjs. Each specialist runs its validator before returning; the orchestrator re-runs the same gate before advancing.
Repository layout
| Path | Purpose |
|---|---|
ideas/ |
Report folders (English + *.zh.yaml). _index.yaml = aggregated history. _triage/<ts>/ = daily triage. _-prefixed paths ignored by Astro. |
website/ |
Astro 6 site that renders reports. |
cloudflare/ |
Retired Cloudflare workflow-dispatch helper retained for reference. |
.github/agents/ |
Copilot agents: Bizidea orchestrator, the eight specialists above, and shared references (sector-vocabulary.md, yaml-syntax.md). |
.github/workflows/ |
bizidea.yml (scheduled pipeline run) and deploy.yml (publishes the site on main pushes touching website/** or ideas/**). |
scripts/ |
Deterministic Node helpers for indexing, semantic dedupe, champion/source-quality gates, Chinese quality checks, measurement, and full validation. |
.cache/ |
Local-only digest manifests for incremental builds (gitignored; restored in CI via actions/cache). |
| AGENTS.md | Coding-agent quick reference (commands, layout, YAML conventions). |
YAML conventions (camelCase field names, units in numeric names like revenueK/marginPct, indentation/quoting/multi-line rules) live in .github/agents/yaml-syntax.md.
Local development
cd website npm ci npm run dev # http://localhost:4321/ npm run build # static output → website/dist/ (runs check-ideas first)
The website build is read-only with respect to ideas/. YAML repair (npm --prefix website run repair:yaml) runs in the daily workflow before commits, not during rendering.
Common checks from the repo root:
| Command | Purpose |
|---|---|
npm run build:ideas-index |
Rebuild ideas/_index.yaml from completed folders. |
npm run check:agents |
Validate orchestrator/specialist agent frontmatter names. |
npm run check:triage |
Validate historical ideas/_triage/**/triage.yaml artifacts. |
npm run check:ideas-index |
Validate _index.yaml without rewriting. |
npm run check:duplicates |
Report legacy similarity candidates and block current-policy concept duplicates or repeated title frames. |
npm run check:content-quality |
Enforce current champion, originality, research, and index policies. |
npm run check:ideas |
Validate report artifacts through the website schema. |
npm run check:zh-translations |
Validate Simplified Chinese report translations. |
npm run check:types |
Type-check the website. |
npm run test |
Vitest. |
npm run measure:quality |
Print corpus quality and speed-proxy metrics. |
npm run validate:all |
Full local validation gate. |
Incremental builds
Both the website loader and check:ideas are digest-keyed, so unchanged report folders are skipped on rebuild:
- website/src/content/ideas-loader.ts hashes each
index.yaml(plusLOADER_VERSION) and reuses Astro's persistent content store atwebsite/.astro/data-store.json. BumpLOADER_VERSIONwhen the schema orparseDatainputs change. - website/scripts/check-ideas.mjs hashes every YAML in each
ideas/<run>/folder (plusCHECK_VERSION) and persists.cache/check-ideas.json. Failures are never cached. BumpCHECK_VERSIONwhen validation rules change. SetCHECK_IDEAS_NO_CACHE=1to bypass.
In CI, deploy.yml restores website/.astro and .cache/ via actions/cache@v4, keyed by the hash of website/src/** and ideas/**/*.yaml so any source/idea change re-keys the cache automatically.
Running the pipeline
In CI, GitHub Actions schedules the workflow once daily at 07:00 UTC. Scheduled broad scans use a rolling seven-day window so promising events can accumulate enough primary and independent evidence; manual runs retain their explicit input. Triage may shortlist a non-dominated cohort champion scoring 4 or 5, but the generated idea must still score an absolute 5 before research and publication. Every custom agent is explicitly pinned to GPT-6 Luna, and pipeline runs use xhigh reasoning. Local role benchmarks found that the strongest alternative improved blind-judge quality by less than 0.5/10 while using 13–21× more AI credits.
The Action separates AI generation from publishing. The read-only generate job records stage attempts in an atomic run manifest, validates the complete repository, and uploads an immutable bundle. The write-enabled publish job downloads and revalidates that bundle before committing. A failed publish job can therefore be rerun without repeating any model calls. Generation and final manifests are retained as workflow artifacts for 30 days.
Manual triggers:
-
GitHub UI: Actions → Bizidea — triage, generate, and publish reports → Run workflow. Inputs:
cap(1–5),timeWindow(e.g.yesterday,last 7 days), and optionaltopic. Chinese localization uses separate GPT-6 Luna draft and source-anchored editorial agents. Strict validators, a saved valid draft, and deterministic rollback provide the quality safety net. -
Local Copilot CLI (requires a Copilot license):
npm install -g @github/copilot copilot --yolo --autopilot --reasoning-effort xhigh --agent Bizidea \ -p "Scan yesterday's startup news and generate up to 5 non-duplicate startup reports."
Deployment
deploy.yml builds the Astro site and publishes to GitHub Pages on main pushes touching website/**, ideas/**, or the workflow itself. The custom domain bizidea.genisisiq.com is set via website/public/CNAME.
Scheduling
.github/workflows/bizidea.yml is the authoritative scheduler and runs once daily at 07:00 UTC. Manual workflow_dispatch runs remain available.
The former Cloudflare dispatcher remains under cloudflare/ for reference, but its Wrangler configuration declares no cron trigger. Redeploy that configuration if retiring an older deployed Worker trigger.
Required secrets
| Secret | Used by | Purpose |
|---|---|---|
COPILOT_PAT |
bizidea.yml |
Copilot-licensed PAT, passed as COPILOT_GITHUB_TOKEN to the Copilot CLI. |
BIZIDEA_PAT |
bizidea.yml |
Repo-write PAT used only by the isolated publish job for checkout and commit, so downstream deploy workflows trigger reliably. |
Optional repository variables
| Variable | Used by | Purpose |
|---|---|---|
PUBLIC_GA_ID |
deploy.yml |
Google Analytics measurement ID (G-XXXXXXX). When set and matching the G-... shape, the production build injects gtag.js from website/src/layouts/BaseLayout.astro. Unset → no analytics; dev builds never inject. |
License
MIT.
来源:GitHub · github.com