[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J4EZJCFNE1SNWAT04P9MWZ":3,"skill-same:01M6J4EZJCFNE1SNWAT04P9MWZ":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6J4EZJCFNE1SNWAT04P9MWZ","idea-pipeline",null,"Execution-gap audit - cross-references the startup idea backlog against shipped skills, prototypes, and cross-repo PRs, surfacing the top 3 ideas to build next by narrative and operator fit.","MiroShark\u002Fmiroshark-aeon","MiroShark","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F304594232?v=4","01M6J466B8NNAZ4H6NNK3N3TT5","01M6J466FXNNWH622S3B9PC496",20,"MIT","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fidea-pipeline\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"idea","idea pipeline","pipeline","prs","startup","creative","build","productivity","gap","execution","backlog","fit","repo","ideas","operator","audit","next","top","references","narrative","Meta","2026-11-10 10:12:30",false,"---\nname: idea-pipeline\ndescription: Execution-gap audit - cross-references the startup idea backlog against shipped skills, prototypes, and cross-repo PRs, surfacing the top 3 ideas to build next by narrative and operator fit.\nmetadata:\n  category: productivity\n  var: \"\"\n  tags:\n    - meta\n    - creative\n---\n> **${var}** — Optional theme filter (e.g. \"crypto\", \"AI agents\", \"consumer\"). If empty, scans all ideas. A `pick:\u003Cid|name>` value (from the \"build next?\" force-reply — e.g. `pick:2` or `pick:Onchain reputation`) instead marks that idea as chosen-to-build in the backlog and ends, skipping the audit — see step 0. `offer:\u003Cowner\u002Frepo or issue-url>` directly offers a confirmed owned target through the same Telegram reply boundary, also ending before the audit.\n\nToday is ${today}. Read `memory\u002FMEMORY.md` before starting. If `soul\u002FSOUL.md` + `soul\u002FSTYLE.md` exist and are populated, read them to ground \"operator fit\" scoring; otherwise score on the idea's general buildability and timing alone.\n\n## Why this skill exists\n\n`idea-forge validate` evaluates ideas. Nothing tracks execution. Backlogs of dozens of ideas accumulate — some validated, most unscreened — with zero visibility into which ones have been acted on vs which are rotting. This skill gives that view: pipeline size, execution rate, and the 3 ideas closest to being buildable right now.\n\n## Steps\n\n### 0. Force-reply interception — `pick:\u003Cidea>` \u002F `offer:\u003Ctarget>` (run FIRST, before anything else)\n\nIf `${var}` starts with `offer:`, strip and trim the remainder. Accept only `owner\u002Frepo` or `https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002FN`, normalize it to `owner\u002Frepo`, and require `gh api \"repos\u002F$repo\" --jq '.permissions.push \u002F\u002F false'` to return `true`. Invalid, inaccessible, or API-failed targets get a plain rejection notification and end without a force reply. For a confirmed target, execute this exact command with Bash. Describing or printing the command is not delivery:\n\n```bash\n.\u002Fnotify \"Which owned repository or issue should Aeon Engineer use? Reply with ${target}.\" \\\n  --force-reply --placeholder \"${target}\" \\\n  --context \"dev-loop::ship\"\n```\n\nAfter the command exits zero, require at least one non-empty JSON payload under `${AEON_PENDING_DIR}\u002Fnotify-queue\u002F` **and** that payload's `.reply_markup.force_reply == true`. A queued payload alone isn't enough — `notify.sh` queues one even when the inbound Messages workflow is disabled, but in that case sends the prompt as plain text (`reply_markup:null`) with no reply routing, so the operator's answer would never come back to this skill. If the command fails, the payload is absent, or `force_reply` isn't `true`, end with `FORCE_REPLY_MISSING: dev-loop::ship target=\u003Ctarget>` and do not claim the prompt was offered. Only after both checks pass, log `FORCE_REPLY_OFFERED: dev-loop::ship target=\u003Ctarget>` under `### idea-pipeline`, then end. This is an explicit operator-invoked producer path and still does not dispatch the chain until the operator replies.\n\nOtherwise, if `${var}` starts with `pick:`, this run is the operator answering the \"which idea to build next?\" force-reply — do **not** run the normal audit. Handle it and end:\n\n1. Strip the prefix: `sel=\"${var#pick:}\"`, then trim surrounding whitespace. The remainder may contain colons\u002Fspaces — keep them.\n2. If `sel` is empty, send a plain re-ask (no force-reply) and end: `.\u002Fnotify \"Which idea should I mark as next to build? Reply with its name or backlog number.\"`\n3. Read the shared backlog `memory\u002Ftopics\u002Fstartup-ideas.md`. If it's missing or has no idea rows, `.\u002Fnotify \"No idea backlog yet — nothing to mark. Run idea-forge generate to fill it first.\"` and end.\n4. Resolve `sel` to exactly one idea row in the table (columns `| date | name | one-liner | fit | T+F+E |`):\n   - **By name (preferred):** case-insensitive exact match on the `name` cell; else fuzzy — the row whose name shares the most significant words with `sel`, or where `sel` is a substring of the name (or vice-versa). Require one clear best match.\n   - **By number:** if `sel` is a bare integer N and no name matches, take the Nth data row (1-based, in file order).\n   - If nothing matches, or two rows tie with no clear winner, send a plain re-ask listing 3–5 candidate names and end: `.\u002Fnotify \"Couldn't find an idea matching \\\"\u003Csel>\\\". Reply with the exact name or backlog number. Candidates: \u003Cname1>, \u003Cname2>, \u003Cname3>.\"`\n5. **Mark it chosen-to-build** — the shared marking convention (identical in idea-forge): append ` ✓ selected ${today}` to the end of that row's `name` cell, keeping the table pipes intact. If the cell already carries a `✓ selected` marker, leave it (idempotent) — it's already queued.\n6. **Do not try to infer a GitHub target from the row.** The backlog's row schema (columns `| date | name | one-liner | fit | T+F+E |`) never carries a repo or issue reference, so a per-row target lookup here would never match a real row. `offer:` (step 0) is the only path from a marked idea to a dev-loop dispatch — explicit and push-permission-gated on purpose.\n7. Confirm with a short `.\u002Fnotify` (keep it clean — no `test`\u002F`trace`\u002F`ping`\u002F`debug` substrings): `.\u002Fnotify \"Marked \\\"\u003Cidea name>\\\" as next to build — flagged in the backlog. Run \u002Ffeature or \u002Fdeploy-prototype on it when you're ready, or reply with: offer:\u003Cowner\u002Frepo> to have Aeon Engineer start on it directly.\"` Do not auto-dispatch any skill — marking chosen is the safe action.\n8. Log to `memory\u002Flogs\u002F${today}.md` under a `### idea-pipeline` heading: `- IDEA_PIPELINE_PICK: marked \"\u003Cidea name>\" as chosen-to-build (from a pick: reply)`.\n9. **End the run.** Do not proceed to step 1 or run the audit.\n\n### 1. Load the idea backlog\n\nRead `memory\u002Ftopics\u002Fstartup-ideas.md`. If it doesn't exist, log `IDEA_PIPELINE_SKIP: no backlog at memory\u002Ftopics\u002Fstartup-ideas.md` and stop — there's nothing to audit.\n\nParse the ideas table: extract name, one-liner, category\u002Fvertical, and date added for each idea. Total = N_total.\n\n### 2. Load screening results\n\nRead `memory\u002Ftopics\u002Fstartup-ideas-screened.md` (create if missing — empty table header only).\n\nExtract ideas that have been screened. N_screened = count of rows.\n\nFrom screened ideas, note those with `viability >= 9` (high-potential). These are the priority pipeline.\n\n### 3. Check execution — what's been built\n\n**Scan skills directory:**\n```bash\nls skills\u002F\n```\nCollect the list of skill directory names. These are \"executed ideas\" in the agent space.\n\n**Scan cross-repo PRs by the operator and their bot accounts.** Read `memory\u002Ftopics\u002Fgit-identities.md` if present (operator-defined list of GitHub usernames to scan). Fall back to the workflow's `GITHUB_ACTOR` if no list is configured.\n\n```bash\ngh pr list --author ${USERNAME} --state merged --limit 30 --json title,url,mergedAt\n```\n\n**Scan deployed prototypes:** read `memory\u002Ftopics\u002Fprototypes.md` (or `memory\u002Ftopics\u002Fvercel.md`) if either exists. Treat any project flagged as a prototype\u002FMVP as a shipped idea.\n\n**Scan recent builds:** read the last 14 days of `memory\u002Flogs\u002F` and collect any `BUILD_SKILL_OK`, `CREATE_SKILL_OK`, or `DEPLOY_PROTOTYPE_OK` entries.\n\n### 4. Cross-reference: idea vs execution\n\nFor each idea in the full backlog:\n- Check if any skill name or PR title contains keywords from the idea name\u002Fone-liner (fuzzy keyword match — at least 2 significant words overlap, or the core concept is clearly represented)\n- Classify as: `executed` (clear match found) or `unexecuted`\n\nN_executed = count of ideas with a clear match.\nN_gap = N_total − N_executed.\n\n### 5. Load narrative context\n\nRead `memory\u002Ftopics\u002Fmarket-context.md` if present for current narrative keywords (tokens trending, tech themes, regulatory signals).\n\nRead recent logs for any narrative signals (last 3 days).\n\nCompile a list of 8–12 active narrative keywords (e.g. \"agent payments\", \"RWA\", \"prediction markets\", \"privacy coins\"). If no market-context source exists, derive keywords from recent `digest`, `narrative-tracker`, or `github-trending` outputs.\n\n### 5b. Load builder-ecosystem signal\n\nRead `memory\u002Ftopics\u002Fecosystem.md` if it exists (written by the retired `builder-map` skill, so usually absent; skip this step when it is). This is the second-stream feed — \"who's adopting the watched stack\" becomes idea fodder.\n\nExtract two things:\n\n- **Underserved categories** — Builder Categories with 0 or 1 known builders in the ecosystem map. Example: \"social-sim\" with no entries = an opening for a sim-prototype.\n- **Adjacent verticals** — non-obvious verticals with active builders. Verticals that already crossed over tell you which directions the stack travels well.\n\nCompile:\n- `underserved_categories` — list of 2–5 categories with thin builder coverage\n- `adjacent_verticals` — list of 2–4 non-obvious verticals with active builders\n\nIf `memory\u002Ftopics\u002Fecosystem.md` doesn't exist yet, skip this step and log `idea_pipeline: ecosystem_feed=unavailable` in step 10. Do not block the run.\n\n### 6. Score unexecuted ideas for \"build this week\"\n\nFor each UNEXECUTED idea, compute a priority score:\n\n```\npriority = narrative_fit + operator_fit_estimated + recency_bonus + ecosystem_gap_bonus\n\nnarrative_fit:          0-4 (count of active narrative keywords that appear in idea name\u002Fone-liner\u002Fcategory; cap at 4)\noperator_fit_estimated: 0-2 - read `soul\u002FSOUL.md` if present; +2 if the idea matches the operator's stated themes, +1 if it's solo-buildable AND adjacent to current work, 0 otherwise. If no soul file, score 0 here and let other factors decide.\nrecency_bonus:          2 if added in last 14 days; 1 if last 30 days; 0 otherwise\necosystem_gap_bonus:    3 if idea's category matches an `underserved_category` from step 5b; 2 if it matches an `adjacent_vertical`; 0 otherwise\n```\n\nTie-break preference when scores match: ideas that fill an underserved-category gap > ideas that hit a hot narrative. The ecosystem signal is structural (where the stack is going); narratives rotate.\n\nIf `${var}` is set, additionally filter to ideas whose category\u002Ftext matches `${var}`.\n\nSort descending. Pick top 3. For each pick, in step 7's `Why now:` line, name the ecosystem signal explicitly if `ecosystem_gap_bonus > 0` (e.g. \"no builders on the stack in this category yet\" or \"adjacent-vertical adoption arc\").\n\n### 7. Format and write the report\n\nWrite to `output\u002Farticles\u002Fidea-pipeline-${today}.md`:\n\n```markdown\n# Idea Pipeline - ${today}\n\n**Total ideas:** N_total | **Screened:** N_screened | **Executed:** N_executed | **Gap:** N_gap\n\n## Build This Week\n\n### 1. [Idea Name]\n**One-liner:** [one-liner from backlog]\n**Why now:** [1-2 sentences connecting to active narratives or ecosystem signal]\n**Operator fit:** [why this fits the operator's stack\u002Fworldview - derived from soul\u002FSOUL.md if present, otherwise the idea's general buildability]\n**Execution path:** [one sentence on fastest way to build - skill, prototype, or external PR]\n\n### 2. [Idea Name]\n...\n\n### 3. [Idea Name]\n...\n\n## Execution Log\nIdeas already shipped (skill\u002Fprototype\u002FPR match found):\n- [executed idea] → [matching skill name or PR URL]\n- ...\n\n## High-Potential Unscreened\nTop 3 ideas not yet screened by `idea-forge validate` that look most promising by keyword signal alone:\n- [idea] - [one-liner]\n- ...\n\n---\n*Source: memory\u002Ftopics\u002Fstartup-ideas.md | Generated by idea-pipeline*\n```\n\n### 8. Decide whether to notify\n\nAlways notify.\n\n### 9. Format and send notification\n\nWrite to `.pending-notify-temp\u002Fidea-pipeline-${today}.md` (create dir if needed), then:\n\n```bash\nmkdir -p .pending-notify-temp\n.\u002Fnotify -f .pending-notify-temp\u002Fidea-pipeline-${today}.md\n```\n\n**Notification format** — match the operator's voice if soul files are populated, otherwise direct and neutral:\n\n```\nidea pipeline - ${today}\n\n${N_total} ideas. ${N_screened} screened. ${N_executed} executed. ${N_gap} waiting.\n\nbuild this week:\n\n1. [Idea Name] - [one-liner]\n   why now: [1 sentence on timing\u002Fnarrative fit]\n   path: [skill \u002F prototype \u002F external-PR in ~N days]\n\n2. [Idea Name] - [one-liner]\n   why now: [1 sentence]\n   path: [...]\n\n3. [Idea Name] - [one-liner]\n   why now: [1 sentence]\n   path: [...]\n```\n\nKeep under 3000 chars.\n\n### 9b. Offer a \"build next?\" follow-up (force-reply)\n\nIf **at least one** idea was surfaced under \"Build This Week\", offer the operator a one-tap way to pick which to build — as a **separate** `.\u002Fnotify` after the digest (a digest and a force-reply prompt can't share one Telegram message). Skip the offer entirely on a run that surfaced no picks.\n\nDedup to once per day: scan the last ~2 days of `memory\u002Flogs\u002F` for `FORCE_REPLY_OFFERED: idea-pipeline::pick`; if present, skip this offer. Otherwise send:\n\n```bash\n.\u002Fnotify \"Which of these should I mark as next to build? Reply with the idea's number or name.\" \\\n  --force-reply --placeholder \"idea # or name\" \\\n  --context \"idea-pipeline::pick\"\n```\n\nThen record the `FORCE_REPLY_OFFERED: idea-pipeline::pick` marker in step 10. A `pick:` reply routes back to this skill and is handled by step 0.\n\n### 10. Log to memory\n\nAppend to `memory\u002Flogs\u002F${today}.md`:\n\n```markdown\n### idea-pipeline\n- **Total ideas:** N_total\n- **Screened:** N_screened (by `idea-forge validate`)\n- **Executed:** N_executed (skill\u002Fprototype\u002FPR match)\n- **Gap:** N_gap unexecuted ideas\n- **Top pick:** [idea name] - [priority score]\n- **Ecosystem feed:** [available \u002F unavailable] - [N underserved categories, M adjacent verticals] (from ecosystem.md, last written [date])\n- **Filter:** [var value or \"none\"]\n- **Notification:** sent\n- **Force-reply offer:** [offered \u002F skipped - already offered in last 2 days \u002F skipped - no picks]\n- FORCE_REPLY_OFFERED: idea-pipeline::pick   ← include this exact line ONLY when the offer was actually sent (it's the once\u002Fday dedup marker)\n- IDEA_PIPELINE_OK\n```\n\n## Required Env Vars\n\nNone. Uses local file reads and `gh` CLI (authenticated via GITHUB_TOKEN in workflow).\n\n## Network Note\n\nNo external network calls in the main logic. `gh pr list` uses the `gh` CLI which handles auth internally (no curl + token pattern needed). WebSearch not required — narrative context comes from `memory\u002Ftopics\u002Fmarket-context.md` if present (no shipped skill writes it any more; it is operator-maintained).\n","> **${var}** — Optional theme filter (e.g. \"crypto\", \"AI agents\", \"consumer\"). If empty, scans all ideas. A `pick:\u003Cid|name>` value (from the \"build next?\" force-reply — e.g. `pick:2` or `pick:Onchain reputation`) instead marks that idea as chosen-to-build in the backlog and ends, skipping the audit — see step 0. `offer:\u003Cowner\u002Frepo or issue-url>` directly offers a confirmed owned target through the same Telegram reply boundary, also ending before the audit.\n\nToday is ${today}. Read `memory\u002FMEMORY.md` before starting. If `soul\u002FSOUL.md` + `soul\u002FSTYLE.md` exist and are populated, read them to ground \"operator fit\" scoring; otherwise score on the idea's general buildability and timing alone.\n\n## Why this skill exists\n\n`idea-forge validate` evaluates ideas. Nothing tracks execution. Backlogs of dozens of ideas accumulate — some validated, most unscreened — with zero visibility into which ones have been acted on vs which are rotting. This skill gives that view: pipeline size, execution rate, and the 3 ideas closest to being buildable right now.\n\n## Steps\n\n### 0. Force-reply interception — `pick:\u003Cidea>` \u002F `offer:\u003Ctarget>` (run FIRST, before anything else)\n\nIf `${var}` starts with `offer:`, strip and trim the remainder. Accept only `owner\u002Frepo` or `https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002FN`, normalize it to `owner\u002Frepo`, and require `gh api \"repos\u002F$repo\" --jq '.permissions.push \u002F\u002F false'` to return `true`. Invalid, inaccessible, or API-failed targets get a plain rejection notification and end without a force reply. For a confirmed target, execute this exact command with Bash. Describing or printing the command is not delivery:\n\n```bash\n.\u002Fnotify \"Which owned repository or issue should Aeon Engineer use? Reply with ${target}.\" \\\n  --force-reply --placeholder \"${target}\" \\\n  --context \"dev-loop::ship\"\n```\n\nAfter the command exits zero, require at least one non-empty JSON payload under `${AEON_PENDING_DIR}\u002Fnotify-queue\u002F` **and** that payload's `.reply_markup.force_reply == true`. A queued payload alone isn't enough — `notify.sh` queues one even when the inbound Messages workflow is disabled, but in that case sends the prompt as plain text (`reply_markup:null`) with no reply routing, so the operator's answer would never come back to this skill. If the command fails, the payload is absent, or `force_reply` isn't `true`, end with `FORCE_REPLY_MISSING: dev-loop::ship target=\u003Ctarget>` and do not claim the prompt was offered. Only after both checks pass, log `FORCE_REPLY_OFFERED: dev-loop::ship target=\u003Ctarget>` under `### idea-pipeline`, then end. This is an explicit operator-invoked producer path and still does not dispatch the chain until the operator replies.\n\nOtherwise, if `${var}` starts with `pick:`, this run is the operator answering the \"which idea to build next?\" force-reply — do **not** run the normal audit. Handle it and end:\n\n1. Strip the prefix: `sel=\"${var#pick:}\"`, then trim surrounding whitespace. The remainder may contain colons\u002Fspaces — keep them.\n2. If `sel` is empty, send a plain re-ask (no force-reply) and end: `.\u002Fnotify \"Which idea should I mark as next to build? Reply with its name or backlog number.\"`\n3. Read the shared backlog `memory\u002Ftopics\u002Fstartup-ideas.md`. If it's missing or has no idea rows, `.\u002Fnotify \"No idea backlog yet — nothing to mark. Run idea-forge generate to fill it first.\"` and end.\n4. Resolve `sel` to exactly one idea row in the table (columns `| date | name | one-liner | fit | T+F+E |`):\n   - **By name (preferred):** case-insensitive exact match on the `name` cell; else fuzzy — the row whose name shares the most significant words with `sel`, or where `sel` is a substring of the name (or vice-versa). Require one clear best match.\n   - **By number:** if `sel` is a bare integer N and no name matches, take the Nth data row (1-based, in file order).\n   - If nothing matches, or two rows tie with no clear winner, send a plain re-ask listing 3–5 candidate names and end: `.\u002Fnotify \"Couldn't find an idea matching \\\"\u003Csel>\\\". Reply with the exact name or backlog number. Candidates: \u003Cname1>, \u003Cname2>, \u003Cname3>.\"`\n5. **Mark it chosen-to-build** — the shared marking convention (identical in idea-forge): append ` ✓ selected ${today}` to the end of that row's `name` cell, keeping the table pipes intact. If the cell already carries a `✓ selected` marker, leave it (idempotent) — it's already queued.\n6. **Do not try to infer a GitHub target from the row.** The backlog's row schema (columns `| date | name | one-liner | fit | T+F+E |`) never carries a repo or issue reference, so a per-row target lookup here would never match a real row. `offer:` (step 0) is the only path from a marked idea to a dev-loop dispatch — explicit and push-permission-gated on purpose.\n7. Confirm with a short `.\u002Fnotify` (keep it clean — no `test`\u002F`trace`\u002F`ping`\u002F`debug` substrings): `.\u002Fnotify \"Marked \\\"\u003Cidea name>\\\" as next to build — flagged in the backlog. Run \u002Ffeature or \u002Fdeploy-prototype on it when you're ready, or reply with: offer:\u003Cowner\u002Frepo> to have Aeon Engineer start on it directly.\"` Do not auto-dispatch any skill — marking chosen is the safe action.\n8. Log to `memory\u002Flogs\u002F${today}.md` under a `### idea-pipeline` heading: `- IDEA_PIPELINE_PICK: marked \"\u003Cidea name>\" as chosen-to-build (from a pick: reply)`.\n9. **End the run.** Do not proceed to step 1 or run the audit.\n\n### 1. Load the idea backlog\n\nRead `memory\u002Ftopics\u002Fstartup-ideas.md`. If it doesn't exist, log `IDEA_PIPELINE_SKIP: no backlog at memory\u002Ftopics\u002Fstartup-ideas.md` and stop — there's nothing to audit.\n\nParse the ideas table: extract name, one-liner, category\u002Fvertical, and date added for each idea. Total = N_total.\n\n### 2. Load screening results\n\nRead `memory\u002Ftopics\u002Fstartup-ideas-screened.md` (create if missing — empty table header only).\n\nExtract ideas that have been screened. N_screened = count of rows.\n\nFrom screened ideas, note those with `viability >= 9` (high-potential). These are the priority pipeline.\n\n### 3. Check execution — what's been built\n\n**Scan skills directory:**\n```bash\nls skills\u002F\n```\nCollect the list of skill directory names. These are \"executed ideas\" in the agent space.\n\n**Scan cross-repo PRs by the operator and their bot accounts.** Read `memory\u002Ftopics\u002Fgit-identities.md` if present (operator-defined list of GitHub usernames to scan). Fall back to the workflow's `GITHUB_ACTOR` if no list is configured.\n\n```bash\ngh pr list --author ${USERNAME} --state merged --limit 30 --json title,url,mergedAt\n```\n\n**Scan deployed prototypes:** read `memory\u002Ftopics\u002Fprototypes.md` (or `memory\u002Ftopics\u002Fvercel.md`) if either exists. Treat any project flagged as a prototype\u002FMVP as a shipped idea.\n\n**Scan recent builds:** read the last 14 days of `memory\u002Flogs\u002F` and collect any `BUILD_SKILL_OK`, `CREATE_SKILL_OK`, or `DEPLOY_PROTOTYPE_OK` entries.\n\n### 4. Cross-reference: idea vs execution\n\nFor each idea in the full backlog:\n- Check if any skill name or PR title contains keywords from the idea name\u002Fone-liner (fuzzy keyword match — at least 2 significant words overlap, or the core concept is clearly represented)\n- Classify as: `executed` (clear match found) or `unexecuted`\n\nN_executed = count of ideas with a clear match.\nN_gap = N_total − N_executed.\n\n### 5. Load narrative context\n\nRead `memory\u002Ftopics\u002Fmarket-context.md` if present for current narrative keywords (tokens trending, tech themes, regulatory signals).\n\nRead recent logs for any narrative signals (last 3 days).\n\nCompile a list of 8–12 active narrative keywords (e.g. \"agent payments\", \"RWA\", \"prediction markets\", \"privacy coins\"). If no market-context source exists, derive keywords from recent `digest`, `narrative-tracker`, or `github-trending` outputs.\n\n### 5b. Load builder-ecosystem signal\n\nRead `memory\u002Ftopics\u002Fecosystem.md` if it exists (written by the retired `builder-map` skill, so usually absent; skip this step when it is). This is the second-stream feed — \"who's adopting the watched stack\" becomes idea fodder.\n\nExtract two things:\n\n- **Underserved categories** — Builder Categories with 0 or 1 known builders in the ecosystem map. Example: \"social-sim\" with no entries = an opening for a sim-prototype.\n- **Adjacent verticals** — non-obvious verticals with active builders. Verticals that already crossed over tell you which directions the stack travels well.\n\nCompile:\n- `underserved_categories` — list of 2–5 categories with thin builder coverage\n- `adjacent_verticals` — list of 2–4 non-obvious verticals with active builders\n\nIf `memory\u002Ftopics\u002Fecosystem.md` doesn't exist yet, skip this step and log `idea_pipeline: ecosystem_feed=unavailable` in step 10. Do not block the run.\n\n### 6. Score unexecuted ideas for \"build this week\"\n\nFor each UNEXECUTED idea, compute a priority score:\n\n```\npriority = narrative_fit + operator_fit_estimated + recency_bonus + ecosystem_gap_bonus\n\nnarrative_fit:          0-4 (count of active narrative keywords that appear in idea name\u002Fone-liner\u002Fcategory; cap at 4)\noperator_fit_estimated: 0-2 - read `soul\u002FSOUL.md` if present; +2 if the idea matches the operator's stated themes, +1 if it's solo-buildable AND adjacent to current work, 0 otherwise. If no soul file, score 0 here and let other factors decide.\nrecency_bonus:          2 if added in last 14 days; 1 if last 30 days; 0 otherwise\necosystem_gap_bonus:    3 if idea's category matches an `underserved_category` from step 5b; 2 if it matches an `adjacent_vertical`; 0 otherwise\n```\n\nTie-break preference when scores match: ideas that fill an underserved-category gap > ideas that hit a hot narrative. The ecosystem signal is structural (where the stack is going); narratives rotate.\n\nIf `${var}` is set, additionally filter to ideas whose category\u002Ftext matches `${var}`.\n\nSort descending. Pick top 3. For each pick, in step 7's `Why now:` line, name the ecosystem signal explicitly if `ecosystem_gap_bonus > 0` (e.g. \"no builders on the stack in this category yet\" or \"adjacent-vertical adoption arc\").\n\n### 7. Format and write the report\n\nWrite to `output\u002Farticles\u002Fidea-pipeline-${today}.md`:\n\n```markdown\n# Idea Pipeline - ${today}\n\n**Total ideas:** N_total | **Screened:** N_screened | **Executed:** N_executed | **Gap:** N_gap\n\n## Build This Week\n\n### 1. [Idea Name]\n**One-liner:** [one-liner from backlog]\n**Why now:** [1-2 sentences connecting to active narratives or ecosystem signal]\n**Operator fit:** [why this fits the operator's stack\u002Fworldview - derived from soul\u002FSOUL.md if present, otherwise the idea's general buildability]\n**Execution path:** [one sentence on fastest way to build - skill, prototype, or external PR]\n\n### 2. [Idea Name]\n...\n\n### 3. [Idea Name]\n...\n\n## Execution Log\nIdeas already shipped (skill\u002Fprototype\u002FPR match found):\n- [executed idea] → [matching skill name or PR URL]\n- ...\n\n## High-Potential Unscreened\nTop 3 ideas not yet screened by `idea-forge validate` that look most promising by keyword signal alone:\n- [idea] - [one-liner]\n- ...\n\n---\n*Source: memory\u002Ftopics\u002Fstartup-ideas.md | Generated by idea-pipeline*\n```\n\n### 8. Decide whether to notify\n\nAlways notify.\n\n### 9. Format and send notification\n\nWrite to `.pending-notify-temp\u002Fidea-pipeline-${today}.md` (create dir if needed), then:\n\n```bash\nmkdir -p .pending-notify-temp\n.\u002Fnotify -f .pending-notify-temp\u002Fidea-pipeline-${today}.md\n```\n\n**Notification format** — match the operator's voice if soul files are populated, otherwise direct and neutral:\n\n```\nidea pipeline - ${today}\n\n${N_total} ideas. ${N_screened} screened. ${N_executed} executed. ${N_gap} waiting.\n\nbuild this week:\n\n1. [Idea Name] - [one-liner]\n   why now: [1 sentence on timing\u002Fnarrative fit]\n   path: [skill \u002F prototype \u002F external-PR in ~N days]\n\n2. [Idea Name] - [one-liner]\n   why now: [1 sentence]\n   path: [...]\n\n3. [Idea Name] - [one-liner]\n   why now: [1 sentence]\n   path: [...]\n```\n\nKeep under 3000 chars.\n\n### 9b. Offer a \"build next?\" follow-up (force-reply)\n\nIf **at least one** idea was surfaced under \"Build This Week\", offer the operator a one-tap way to pick which to build — as a **separate** `.\u002Fnotify` after the digest (a digest and a force-reply prompt can't share one Telegram message). Skip the offer entirely on a run that surfaced no picks.\n\nDedup to once per day: scan the last ~2 days of `memory\u002Flogs\u002F` for `FORCE_REPLY_OFFERED: idea-pipeline::pick`; if present, skip this offer. Otherwise send:\n\n```bash\n.\u002Fnotify \"Which of these should I mark as next to build? Reply with the idea's number or name.\" \\\n  --force-reply --placeholder \"idea # or name\" \\\n  --context \"idea-pipeline::pick\"\n```\n\nThen record the `FORCE_REPLY_OFFERED: idea-pipeline::pick` marker in step 10. A `pick:` reply routes back to this skill and is handled by step 0.\n\n### 10. Log to memory\n\nAppend to `memory\u002Flogs\u002F${today}.md`:\n\n```markdown\n### idea-pipeline\n- **Total ideas:** N_total\n- **Screened:** N_screened (by `idea-forge validate`)\n- **Executed:** N_executed (skill\u002Fprototype\u002FPR match)\n- **Gap:** N_gap unexecuted ideas\n- **Top pick:** [idea name] - [priority score]\n- **Ecosystem feed:** [available \u002F unavailable] - [N underserved categories, M adjacent verticals] (from ecosystem.md, last written [date])\n- **Filter:** [var value or \"none\"]\n- **Notification:** sent\n- **Force-reply offer:** [offered \u002F skipped - already offered in last 2 days \u002F skipped - no picks]\n- FORCE_REPLY_OFFERED: idea-pipeline::pick   ← include this exact line ONLY when the offer was actually sent (it's the once\u002Fday dedup marker)\n- IDEA_PIPELINE_OK\n```\n\n## Required Env Vars\n\nNone. Uses local file reads and `gh` CLI (authenticated via GITHUB_TOKEN in workflow).\n\n## Network Note\n\nNo external network calls in the main logic. `gh pr list` uses the `gh` CLI which handles auth internally (no curl + token pattern needed). WebSearch not required — narrative context comes from `memory\u002Ftopics\u002Fmarket-context.md` if present (no shipped skill writes it any more; it is operator-maintained).\n",{"name":5,"metadata":44,"description":7},{"var":45,"tags":46,"category":25},"",[47,23],"meta","main","9c042aa1b6d79fd49679637374e88c5874cc3aae","skills\u002Fidea-pipeline",2,"https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon","https:\u002F\u002Ft.me\u002Fmiroshark_aeon","https:\u002F\u002Fgithub.com\u002FMiroShark","https:\u002F\u002Fwww.miroshark.xyz\u002F","Simulate anything, for $1 & less than 10 min.","2026-11-14 00:33:09",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add MiroShark\u002Fmiroshark-aeon --skill idea-pipeline",{"tool":64,"command":65},"bunx","bunx skills add MiroShark\u002Fmiroshark-aeon --skill idea-pipeline",{"tool":67,"command":68},"pnpm","pnpm dlx skills add MiroShark\u002Fmiroshark-aeon --skill idea-pipeline","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fidea-pipeline\u002FSKILL.md",true,[],[73,111,134,158,183,205],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":89,"publishedAt":39},"01M6J4P8XKB8RJ7PCYMZPZ0F6S","you-web-search","Web search using You.com Search API with high-quality, cited results — runs keyless out of the box; YDC_API_KEY unlocks higher limits and real-time web crawling","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fyou-web-search\u002FSKILL.md",[79,84],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"web search","search","you","you web search","web","time","only","api","web crawling","read","read-only","real-time","basics","keyless","with","research","results","high","quality","box","limits",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":39},"01M6J4P4H35WQG6RHGTTACSMVW","write-tweet","Multi-format tweet studio - standalone drafts (10 across 5 size tiers), a 5-10 tweet thread, or 10 remixes of past tweets, selected via ${var}","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-tweet\u002FSKILL.md",[],[118,119,120,121,122,97,123,124,125,126,102,127,128,129,130,131,132,133],"write","write tweet","standalone","social","studio","across","xai","past","drafts","twitter","thread","multi","size","via","format","content",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":39},"01M6J4P11K7ZJ2PJDHDTTFZ1HY","weekly-aeoncard","Build a weekly token-consumption recap image from memory\u002Ftoken-usage.csv - this week + all-time totals, top skills, rendered as a shareable SVG card.","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fweekly-aeoncard\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000016","图像与多媒体",[144,145,146,147,148,149,150,95,38,151,152,153,154,155,25,35,24,118,156,157],"weekly","weekly aeoncard","as","usage","SVG","memory","card","image","recap","csv","monitoring","notifications","token","aeon",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":39},"01M6J4NVJYQP5DNKSGXAXQW06B","vuln-tracker","One lifecycle poll over everything vuln-scanner produces - PR and advisory status, PVR triage transitions, and pending-disclosure aging, with a stars-secured impact headline and one action queue.","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvuln-tracker\u002FSKILL.md",[],[165,166,38,167,168,118,156,169,170,171,172,173,174,175,176,177,178,104,179,180,181,182],"tracker","vuln tracker","impact","scanner","status","action","security","pr","stars","lifecycle","dev","gh","aging","advisory","github","transitions","triage","global",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":192,"publishedAt":39},"01M6J4NNQCHTKNGENAPJQ8KYHR","vuln-scanner","Audit trending repos for real security vulnerabilities and disclose responsibly - scan and route findings (PVR \u002F dependency PR), re-submit queued advisories, and send armed email disclosures","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvuln-scanner\u002FSKILL.md",[189],{"categoryNo":190,"categoryName":191,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000005","邮件与沟通",[168,193,194,195,196,38,197,171,198,199,200,175,179,201,182,202,97,203,33,204],"vuln scanner","resend","re","trending","repos","email","for","scan","vulnerabilities","submit","route","send",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":212,"publishedAt":39},"01M6J4NFBXTGG0R4M484T0KNYW","video-script","Turn a repo, product page, or update into a recording-ready video script in a receipts-first format - verifies every claim against live sources, then writes timestamped VO + on-screen direction with a plain-language glossary, assets checklist, anti-tells, and a verify-before-recording list","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvideo-script\u002FSKILL.md",[211],{"categoryNo":141,"categoryName":142,"taxonomyType":82,"taxonomyTypeDesc":83},[213,214,215,216,217,218,219,220,30,102,221,222,223,104,224,225,226,227,228,132,229,230,231],"Video","video script","script","recording","sources","ready","direction","page","claim","plain-language","glossary","first","verify","product","screen","update","list","live","receipts"]