[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JPTWNNV19ZSPD9VPDWTMB":3,"skill-same:01M71JPTWNNV19ZSPD9VPDWTMB":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M71JPTWNNV19ZSPD9VPDWTMB","idea-capture",null,"Keep a per-repo register of notional product ideas — ideas not yet decided, kept as food for future development instead of being forgotten, and kept out of the backlog. Captures napkin notes as structured idea entries (one per idea, duplicate-checked, with typed edges to related ideas and backlog items), promotes an idea to an ordinary backlog item, rejects an idea with a reason, and reads the register as a graph. Use when the operator says \"capture this idea\", \"napkin note\", \"notional feature\", \"food for future development\", \"add to ideas\", \"park this idea\", \"not a backlog item yet\", \"promote IDEA-NNN to the backlog\", \"reject that idea\", or \"what's in the ideas register\". Do not use for work that is already decided — that is a backlog item.","eposforge\u002Feposforge","eposforge","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F279313312?v=4","01M71JPA7XV61GQ0CRFCHTMZY9","01M71JPA8JK1V7CF8DG5RHSGZN",1,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fidea-capture\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"idea capture","capture","idea","ideas","when","promote idea","for","nnn","food","register","as","feature","development","entries","backlog","do","use","repo","napkin","promote","2026-11-10 10:12:30",false,"---\nname: idea-capture\ndescription: >-\n  Keep a per-repo register of notional product ideas — ideas not yet decided,\n  kept as food for future development instead of being forgotten, and kept out\n  of the backlog. Captures napkin notes as structured idea entries (one per\n  idea, duplicate-checked, with typed edges to related ideas and backlog\n  items), promotes an idea to an ordinary backlog item, rejects an idea with a\n  reason, and reads the register as a graph. Use when the operator says\n  \"capture this idea\", \"napkin note\", \"notional feature\", \"food for future\n  development\", \"add to ideas\", \"park this idea\", \"not a backlog item yet\",\n  \"promote IDEA-NNN to the backlog\", \"reject that idea\", or \"what's in the\n  ideas register\". Do not use for work that is already decided — that is a\n  backlog item.\n---\n\nThe backlog's undecided sibling. The backlog holds decided work (active,\nslated, archived); the ideas register holds what might be worth deciding one\nday. An idea in the register carries no effort, no priority and no\ndependency links in the backlog sense, and nothing in it is a commitment.\n\nCapture stays low-friction: a sparse entry is fine and is refined later. What\nthe register must not lose is the idea itself, where it came from, and its\nrelationships to the other ideas and to the backlog.\n\nDesignation (Standard 03, requirement 4): **skill**. Splitting a note into\nideas, judging duplicates and proposing edges are judgment steps; there is no\nstore verb to wrap.\n\n## Where the register lives\n\n- One file per repo: `.eposforge\u002Fideas\u002Fideas.md`, beside\n  `.eposforge\u002Fbacklog\u002F`.\n- IDs are `\u003CPREFIX>-IDEA-NNN`, where `\u003CPREFIX>` is the `prefix` value in that\n  repo's `.eposforge\u002Fbacklog\u002Fconfig.toml`. Three digits, zero-padded,\n  sequential, never reused.\n- If the repo has no `.eposforge\u002Fbacklog\u002Fconfig.toml`, ask the operator for a\n  prefix and offer to create only `.eposforge\u002Fideas\u002Fideas.md`. Do not\n  scaffold a backlog as a side effect.\n\n## Rules\n\n- **Not a backlog.** No effort, no priority, no `Depends on:` \u002F `Blocks:`.\n  Phase is labelled a guess.\n- **Status values only:** `idea` (default), `refining`, `promoted → \u003CID>`,\n  `rejected — \u003Cone-line reason>`. Rejected and promoted entries stay in the\n  file forever — they are what stops the same idea being rediscovered.\n- **Promotion bar.** An idea becomes a backlog item only when the repo's own\n  backlog rules allow it (for example, a live decision is blocked on it, or\n  there is measured, repeated pain). Ask; do not promote on your own\n  judgment.\n- **One entry per distinct idea** in a note.\n- **Duplicates refine, not repeat.** If a new idea overlaps an existing entry\n  (including a rejected one), refine the existing entry instead of adding a\n  new one.\n- **Privacy.** Entries describe product ideas only. No account numbers,\n  balances, names of private persons, or other private facts. Raw source\n  material stays in the repo's private area or scratchpad; the entry's\n  Source line points at it.\n- **Review cadence.** Review the register with the repo's slated-backlog\n  re-evaluate dates, or when a new batch of ideas arrives. No weekly review.\n\n## Edges\n\nEach entry has an **Edges** field: one typed edge per line, so agents can read\nthe register as a graph.\n\nFormat: `- \u003Ctype>: \u003CTARGET-ID> — \u003Cshort reason>`. The reason is optional but\nexpected for `conflicts-with` and `alternative-to`. A target is an IDEA ID in\nthe same file, a backlog ID in the same repo (`\u003CPREFIX>-NNN`), or a\ncross-repo ID written `\u003Crepo>:\u003CID>`. Write `- none yet` when there are none.\n\nClosed vocabulary — use no other types:\n\n| Type | Direction | Meaning |\n|---|---|---|\n| `depends-on` | directed | This idea needs the target to exist first. |\n| `part-of` | directed | This idea is a component or refinement of the larger target idea. |\n| `enables` | directed | This idea makes the target easier or possible (soft, not required). |\n| `overlaps` | symmetric | Substantially the same ground; a merge candidate. Also used toward a backlog item that would serve this idea. |\n| `conflicts-with` | symmetric | Assumptions or outcomes are in tension; give the reason. |\n| `alternative-to` | symmetric | A different way to meet the same need; pick one. |\n| `supersedes` | directed | This idea replaces the target (the target is usually then rejected). |\n| `promoted-to` | directed | Written on promotion, pointing at the backlog item. |\n\n- **Symmetric edges are written on both nodes.** When you add\n  `overlaps: X` to entry A, add `overlaps: A` to entry X in the same edit.\n  An edge toward a backlog item is written on the idea only — backlog items\n  are never edited to point back at ideas.\n- **Directed edges are written on the source node only.** Never write an\n  inverse (`required-by`, `has-part`, `superseded-by`); agents derive\n  inverses when analyzing.\n- **No dangling edges.** Every target must exist: an IDEA ID in this file, a\n  backlog ID in this repo's backlog files (active, slated or archive index),\n  or an ID in a named repo you can read. Check this whenever you add or edit\n  an entry.\n\n## Entry template\n\n```markdown\n## \u003CPREFIX>-IDEA-001: Short descriptive title (5–8 words)\n\n**Story**\nAs a [user type], I want [capability] so that [outcome].\n\n**Area**\n\u003Cone value from this file's Area vocabulary; secondary in parentheses if relevant>\n\n**Phase** (a guess, not a priority)\ncore | next | later | explore\n\n**Status**\nidea | refining | promoted → \u003CBACKLOG-ID> | rejected — \u003Cone-line reason>\n\n**Source**\n\u003Cwhere it came from, e.g. \"chat transcript: \u003Ctopic>, \u003CYYYY-MM-DD>\">\n\n**Serves**\n\u003Cwhich goal in the repo's intent\u002Fvision it moves>\n\n**Acceptance criteria** (optional until clearer)\n- [ ] ... (or TBD)\n\n**Notes \u002F context**\n...\n\n**Open questions**\n- ...\n\n**Edges**\n- depends-on: \u003CPREFIX>-IDEA-003 — needs the canonical data model first\n- part-of: \u003CPREFIX>-IDEA-001\n- conflicts-with: \u003CPREFIX>-IDEA-009 — assumes a daily cadence; the workflow is monthly\n- overlaps: \u003CPREFIX>-011\n```\n\nKeep the field order. Omit nothing; a field with no content yet gets `TBD`\n(or `- none yet` for Edges).\n\n**Format rules — the file is machine-read.** Graph viewers that read\nEposForge file backlogs can read this file too, so keep it strictly\nparseable:\n\n- Entry heading exactly `## \u003CPREFIX>-IDEA-NNN: Title` — colon straight after\n  the ID, one space.\n- Each field label on its own line as `**Label**`, optionally followed by a\n  parenthetical on the same line (`**Phase** (a guess, not a priority)`). The\n  value runs on the following lines until the next `**Label**` line or the\n  next `## ` heading.\n- The Status value starts with `idea`, `refining`, `promoted` or `rejected`.\n- Edges are list items `- \u003Ctype>: \u003CTARGET> — \u003Creason>` (em dash, or ` - `,\n  before the reason), or `- none yet`.\n- Text before the first entry heading is the header, not an entry. The header\n  uses no `## ` heading that matches the entry pattern.\n- Fenced code blocks are ignored by readers, so templates and examples inside\n  fences are never entries.\n\n## File header template\n\nA new `ideas.md` starts with this header. Fill the Area vocabulary with the\noperator — it is repo-specific and it is the only list Area values may come\nfrom.\n\n```markdown\n# Ideas register — \u003Crepo name>\n\nNotional product ideas for this repo: not yet decided, kept as food for future\ndevelopment. **This is not the backlog.** Nothing here has effort, priority or\na commitment. An idea becomes work only by promotion, which writes an ordinary\nbacklog item and marks the idea `promoted → \u003CID>`. Rejected and promoted\nentries stay in this file.\n\n- **ID prefix:** `\u003CPREFIX>-IDEA-NNN` (from `.eposforge\u002Fbacklog\u002Fconfig.toml`)\n- **Area vocabulary:** `\u003Carea-one>` | `\u003Carea-two>` | `\u003Carea-three>` | `other`\n- **Serves:** goals in `\u003Cpath to this repo's intent or vision doc>`\n- **Edge vocabulary:** depends-on, part-of, enables, overlaps (symmetric),\n  conflicts-with (symmetric), alternative-to (symmetric), supersedes,\n  promoted-to\n- **Review:** with the slated backlog's re-evaluate dates, or when a new batch\n  of ideas arrives.\n\nEntries follow, newest at the end.\n\n---\n```\n\n## Workflow — capture\n\n1. **Locate the repo.** Use the repo the operator names, else the current\n   working repo (`git rev-parse --show-toplevel`). Say which repo you are\n   writing to before you write.\n2. **Locate the ideas file** at `.eposforge\u002Fideas\u002Fideas.md`.\n   - Missing: say so and offer to create it with the header above. Ask the\n     operator for the Area vocabulary (offer a short draft drawn from the\n     repo's intent or vision doc, but let them decide) and for the path that\n     **Serves** points at. Do not create it without a yes.\n   - Present: read the header for the Area vocabulary and Serves target.\n3. **Read the prefix** from `.eposforge\u002Fbacklog\u002Fconfig.toml` (`prefix = \"...\"`).\n   If there is no config, ask for a prefix (see above).\n4. **Split the note.** One entry per distinct idea. If a note mixes an idea\n   with already-decided work, say which part looks like backlog material\n   rather than filing it as an idea.\n5. **Duplicate and edge check.** For each idea, scan every existing entry —\n   including `rejected` and `promoted` ones — and the repo's backlog files.\n   - Substantially the same as an existing entry: **refine that entry**\n     instead of adding one. Add a Source line, merge notes and open\n     questions, keep its ID. If the existing entry is rejected, show the\n     operator the rejection reason and ask whether anything has changed\n     before reopening it.\n   - Related but distinct: propose typed edges from the closed vocabulary,\n     with a one-line reason for each. Show the proposals; write only the\n     ones the operator accepts (or all of them, if the operator asked you\n     not to check in).\n   - Already covered by a backlog item: propose `overlaps: \u003CPREFIX>-NNN` and\n     tell the operator the idea may already be decided work.\n6. **Assign the next ID.** Highest `\u003CPREFIX>-IDEA-NNN` in the file plus one.\n   Entries are never deleted, so this never reuses an ID; if the file looks\n   edited by hand and numbers are missing, still go above the highest.\n7. **Fill only what the input supports.** Story, Area (from the header's\n   vocabulary only), Phase (a guess), Status `idea`, Source. Leave\n   Acceptance criteria and Open questions sparse or `TBD`. Do not invent\n   requirements. If the note is too vague for a coherent story, still write\n   the entry, put the raw note (minus anything private) in Notes \u002F context\n   and mark the Story as needing refinement.\n8. **Append** the entry at the end of the file. In the same edit, back-fill\n   every accepted symmetric edge on the other node.\n9. **Check edges.** Every edge you wrote or touched resolves to an ID that\n   exists, and every symmetric edge appears on both nodes. Report any\n   dangling target instead of writing it; if the target is in another repo\n   you cannot read, say the edge is unverified.\n10. **Report** the IDs written or refined, the edges added (and back-filled),\n    and anything you chose not to file.\n\n## Workflow — promote\n\n1. Confirm the promotion bar with the operator: what decision is blocked, or\n   what repeated pain was measured. If neither, say so and stop unless they\n   still want it promoted.\n2. Write an **ordinary backlog item** in that repo's backlog format. For a\n   repo on the file-based backlog adapter, use its `new-issue.sh` through the\n   framework home (`\"${EPOSFORGE_HOME:?set EPOSFORGE_HOME}\"\u002F.eposforge\u002Fbacklog\u002Ffile-based-backlog\u002Fscripts\u002Fnew-issue.sh`)\n   and fill the item to that repo's schema; carry the Story, Acceptance\n   criteria and Notes across, and cite the idea ID in the item's notes. Run\n   that repo's backlog lint afterwards.\n3. On the idea entry, set **Status** to `promoted → \u003CBACKLOG-ID>` and add the\n   edge `- promoted-to: \u003CBACKLOG-ID>`. Leave the entry in place.\n4. Check the idea's other edges still resolve, and report the new backlog ID.\n\n## Workflow — reject\n\n1. Ask for (or confirm) a one-line reason. A rejection without a reason is\n   not recorded.\n2. Set **Status** to `rejected — \u003Creason>`. Leave the entry and its edges in\n   place — they explain the rejection later.\n3. If another idea replaces it, add `supersedes: \u003Cthis ID>` on the replacing\n   entry (directed: source only).\n\n## Editing an entry\n\nWhen refining, renaming or re-linking an entry: keep its ID, re-run the edge\ncheck (step 9 above), keep symmetric edges on both nodes, and fix any edge\nthat pointed at an ID that no longer resolves (for example a backlog item\nthat was renumbered or superseded) — say what you changed.\n\n## Analyzing the register\n\nRead the Edges fields as a directed graph whose nodes are ideas and backlog\nitems. Derive inverses yourself; they are never written.\n\n- **Clusters.** Follow `part-of` (toward the larger idea) and `overlaps`. A\n  connected group is one theme; several `overlaps` inside it are merge\n  candidates to put to the operator.\n- **Prerequisite chains.** Follow `depends-on` to its roots. An idea whose\n  prerequisites are all promoted or already built is closer to ready; an idea\n  that many others depend on is a likely next promotion.\n- **Conflicts to resolve.** Every `conflicts-with` and `alternative-to` pair\n  is an open choice. List them with their reasons; do not resolve them\n  yourself.\n- **What a backlog item would serve.** For a backlog ID, collect the ideas\n  with `overlaps: \u003CID>`, `depends-on: \u003CID>` or `enables` chains reaching it —\n  that is the undecided value the item would unlock.\n- **Hygiene.** Report dangling targets, symmetric edges present on only one\n  node, edge types outside the closed vocabulary, and written inverses.\n\nReport findings; change entries only when the operator asks.\n\n## Example\n\nThe repo is a reading-list app with backlog prefix `APP`. Its ideas file\nalready holds `APP-IDEA-002: Import highlights from e-reader exports`. Its\nArea vocabulary is `capture | organize | share | other`.\n\n**Input:** \"Napkin note — when I finish a book I'd like the app to pull my\nhighlights in automatically and show me the three I marked most, so I\nactually revisit them.\"\n\nThe highlight import overlaps `APP-IDEA-002`, so that part refines the\nexisting entry (new Source line, merged note). The \"show the top three to\nrevisit\" part is a distinct idea that needs the import first. One new entry:\n\n```markdown\n## APP-IDEA-007: Resurface top highlights after finishing\n\n**Story**\nAs a reader, I want the app to show my most-marked highlights when I finish a\nbook so that I actually revisit them.\n\n**Area**\norganize (capture)\n\n**Phase** (a guess, not a priority)\nnext\n\n**Status**\nidea\n\n**Source**\nnapkin note in chat, \u003CYYYY-MM-DD>\n\n**Serves**\n\"Turn reading into something I remember\" (intent doc, goal 2)\n\n**Acceptance criteria** (optional until clearer)\n- [ ] TBD\n\n**Notes \u002F context**\n\"Most marked\" is undefined — could mean most-revisited or explicitly starred.\n\n**Open questions**\n- What counts as most marked?\n- In-app prompt, or a later reminder?\n\n**Edges**\n- depends-on: APP-IDEA-002 — needs imported highlights to rank\n```\n\n`depends-on` is directed, so nothing is written on `APP-IDEA-002` for it. Had\nthe operator accepted `overlaps: APP-IDEA-002` instead, the same edit would\nalso add `- overlaps: APP-IDEA-007` to `APP-IDEA-002`.\n","The backlog's undecided sibling. The backlog holds decided work (active,\nslated, archived); the ideas register holds what might be worth deciding one\nday. An idea in the register carries no effort, no priority and no\ndependency links in the backlog sense, and nothing in it is a commitment.\n\nCapture stays low-friction: a sparse entry is fine and is refined later. What\nthe register must not lose is the idea itself, where it came from, and its\nrelationships to the other ideas and to the backlog.\n\nDesignation (Standard 03, requirement 4): **skill**. Splitting a note into\nideas, judging duplicates and proposing edges are judgment steps; there is no\nstore verb to wrap.\n\n## Where the register lives\n\n- One file per repo: `.eposforge\u002Fideas\u002Fideas.md`, beside\n  `.eposforge\u002Fbacklog\u002F`.\n- IDs are `\u003CPREFIX>-IDEA-NNN`, where `\u003CPREFIX>` is the `prefix` value in that\n  repo's `.eposforge\u002Fbacklog\u002Fconfig.toml`. Three digits, zero-padded,\n  sequential, never reused.\n- If the repo has no `.eposforge\u002Fbacklog\u002Fconfig.toml`, ask the operator for a\n  prefix and offer to create only `.eposforge\u002Fideas\u002Fideas.md`. Do not\n  scaffold a backlog as a side effect.\n\n## Rules\n\n- **Not a backlog.** No effort, no priority, no `Depends on:` \u002F `Blocks:`.\n  Phase is labelled a guess.\n- **Status values only:** `idea` (default), `refining`, `promoted → \u003CID>`,\n  `rejected — \u003Cone-line reason>`. Rejected and promoted entries stay in the\n  file forever — they are what stops the same idea being rediscovered.\n- **Promotion bar.** An idea becomes a backlog item only when the repo's own\n  backlog rules allow it (for example, a live decision is blocked on it, or\n  there is measured, repeated pain). Ask; do not promote on your own\n  judgment.\n- **One entry per distinct idea** in a note.\n- **Duplicates refine, not repeat.** If a new idea overlaps an existing entry\n  (including a rejected one), refine the existing entry instead of adding a\n  new one.\n- **Privacy.** Entries describe product ideas only. No account numbers,\n  balances, names of private persons, or other private facts. Raw source\n  material stays in the repo's private area or scratchpad; the entry's\n  Source line points at it.\n- **Review cadence.** Review the register with the repo's slated-backlog\n  re-evaluate dates, or when a new batch of ideas arrives. No weekly review.\n\n## Edges\n\nEach entry has an **Edges** field: one typed edge per line, so agents can read\nthe register as a graph.\n\nFormat: `- \u003Ctype>: \u003CTARGET-ID> — \u003Cshort reason>`. The reason is optional but\nexpected for `conflicts-with` and `alternative-to`. A target is an IDEA ID in\nthe same file, a backlog ID in the same repo (`\u003CPREFIX>-NNN`), or a\ncross-repo ID written `\u003Crepo>:\u003CID>`. Write `- none yet` when there are none.\n\nClosed vocabulary — use no other types:\n\n| Type | Direction | Meaning |\n|---|---|---|\n| `depends-on` | directed | This idea needs the target to exist first. |\n| `part-of` | directed | This idea is a component or refinement of the larger target idea. |\n| `enables` | directed | This idea makes the target easier or possible (soft, not required). |\n| `overlaps` | symmetric | Substantially the same ground; a merge candidate. Also used toward a backlog item that would serve this idea. |\n| `conflicts-with` | symmetric | Assumptions or outcomes are in tension; give the reason. |\n| `alternative-to` | symmetric | A different way to meet the same need; pick one. |\n| `supersedes` | directed | This idea replaces the target (the target is usually then rejected). |\n| `promoted-to` | directed | Written on promotion, pointing at the backlog item. |\n\n- **Symmetric edges are written on both nodes.** When you add\n  `overlaps: X` to entry A, add `overlaps: A` to entry X in the same edit.\n  An edge toward a backlog item is written on the idea only — backlog items\n  are never edited to point back at ideas.\n- **Directed edges are written on the source node only.** Never write an\n  inverse (`required-by`, `has-part`, `superseded-by`); agents derive\n  inverses when analyzing.\n- **No dangling edges.** Every target must exist: an IDEA ID in this file, a\n  backlog ID in this repo's backlog files (active, slated or archive index),\n  or an ID in a named repo you can read. Check this whenever you add or edit\n  an entry.\n\n## Entry template\n\n```markdown\n## \u003CPREFIX>-IDEA-001: Short descriptive title (5–8 words)\n\n**Story**\nAs a [user type], I want [capability] so that [outcome].\n\n**Area**\n\u003Cone value from this file's Area vocabulary; secondary in parentheses if relevant>\n\n**Phase** (a guess, not a priority)\ncore | next | later | explore\n\n**Status**\nidea | refining | promoted → \u003CBACKLOG-ID> | rejected — \u003Cone-line reason>\n\n**Source**\n\u003Cwhere it came from, e.g. \"chat transcript: \u003Ctopic>, \u003CYYYY-MM-DD>\">\n\n**Serves**\n\u003Cwhich goal in the repo's intent\u002Fvision it moves>\n\n**Acceptance criteria** (optional until clearer)\n- [ ] ... (or TBD)\n\n**Notes \u002F context**\n...\n\n**Open questions**\n- ...\n\n**Edges**\n- depends-on: \u003CPREFIX>-IDEA-003 — needs the canonical data model first\n- part-of: \u003CPREFIX>-IDEA-001\n- conflicts-with: \u003CPREFIX>-IDEA-009 — assumes a daily cadence; the workflow is monthly\n- overlaps: \u003CPREFIX>-011\n```\n\nKeep the field order. Omit nothing; a field with no content yet gets `TBD`\n(or `- none yet` for Edges).\n\n**Format rules — the file is machine-read.** Graph viewers that read\nEposForge file backlogs can read this file too, so keep it strictly\nparseable:\n\n- Entry heading exactly `## \u003CPREFIX>-IDEA-NNN: Title` — colon straight after\n  the ID, one space.\n- Each field label on its own line as `**Label**`, optionally followed by a\n  parenthetical on the same line (`**Phase** (a guess, not a priority)`). The\n  value runs on the following lines until the next `**Label**` line or the\n  next `## ` heading.\n- The Status value starts with `idea`, `refining`, `promoted` or `rejected`.\n- Edges are list items `- \u003Ctype>: \u003CTARGET> — \u003Creason>` (em dash, or ` - `,\n  before the reason), or `- none yet`.\n- Text before the first entry heading is the header, not an entry. The header\n  uses no `## ` heading that matches the entry pattern.\n- Fenced code blocks are ignored by readers, so templates and examples inside\n  fences are never entries.\n\n## File header template\n\nA new `ideas.md` starts with this header. Fill the Area vocabulary with the\noperator — it is repo-specific and it is the only list Area values may come\nfrom.\n\n```markdown\n# Ideas register — \u003Crepo name>\n\nNotional product ideas for this repo: not yet decided, kept as food for future\ndevelopment. **This is not the backlog.** Nothing here has effort, priority or\na commitment. An idea becomes work only by promotion, which writes an ordinary\nbacklog item and marks the idea `promoted → \u003CID>`. Rejected and promoted\nentries stay in this file.\n\n- **ID prefix:** `\u003CPREFIX>-IDEA-NNN` (from `.eposforge\u002Fbacklog\u002Fconfig.toml`)\n- **Area vocabulary:** `\u003Carea-one>` | `\u003Carea-two>` | `\u003Carea-three>` | `other`\n- **Serves:** goals in `\u003Cpath to this repo's intent or vision doc>`\n- **Edge vocabulary:** depends-on, part-of, enables, overlaps (symmetric),\n  conflicts-with (symmetric), alternative-to (symmetric), supersedes,\n  promoted-to\n- **Review:** with the slated backlog's re-evaluate dates, or when a new batch\n  of ideas arrives.\n\nEntries follow, newest at the end.\n\n---\n```\n\n## Workflow — capture\n\n1. **Locate the repo.** Use the repo the operator names, else the current\n   working repo (`git rev-parse --show-toplevel`). Say which repo you are\n   writing to before you write.\n2. **Locate the ideas file** at `.eposforge\u002Fideas\u002Fideas.md`.\n   - Missing: say so and offer to create it with the header above. Ask the\n     operator for the Area vocabulary (offer a short draft drawn from the\n     repo's intent or vision doc, but let them decide) and for the path that\n     **Serves** points at. Do not create it without a yes.\n   - Present: read the header for the Area vocabulary and Serves target.\n3. **Read the prefix** from `.eposforge\u002Fbacklog\u002Fconfig.toml` (`prefix = \"...\"`).\n   If there is no config, ask for a prefix (see above).\n4. **Split the note.** One entry per distinct idea. If a note mixes an idea\n   with already-decided work, say which part looks like backlog material\n   rather than filing it as an idea.\n5. **Duplicate and edge check.** For each idea, scan every existing entry —\n   including `rejected` and `promoted` ones — and the repo's backlog files.\n   - Substantially the same as an existing entry: **refine that entry**\n     instead of adding one. Add a Source line, merge notes and open\n     questions, keep its ID. If the existing entry is rejected, show the\n     operator the rejection reason and ask whether anything has changed\n     before reopening it.\n   - Related but distinct: propose typed edges from the closed vocabulary,\n     with a one-line reason for each. Show the proposals; write only the\n     ones the operator accepts (or all of them, if the operator asked you\n     not to check in).\n   - Already covered by a backlog item: propose `overlaps: \u003CPREFIX>-NNN` and\n     tell the operator the idea may already be decided work.\n6. **Assign the next ID.** Highest `\u003CPREFIX>-IDEA-NNN` in the file plus one.\n   Entries are never deleted, so this never reuses an ID; if the file looks\n   edited by hand and numbers are missing, still go above the highest.\n7. **Fill only what the input supports.** Story, Area (from the header's\n   vocabulary only), Phase (a guess), Status `idea`, Source. Leave\n   Acceptance criteria and Open questions sparse or `TBD`. Do not invent\n   requirements. If the note is too vague for a coherent story, still write\n   the entry, put the raw note (minus anything private) in Notes \u002F context\n   and mark the Story as needing refinement.\n8. **Append** the entry at the end of the file. In the same edit, back-fill\n   every accepted symmetric edge on the other node.\n9. **Check edges.** Every edge you wrote or touched resolves to an ID that\n   exists, and every symmetric edge appears on both nodes. Report any\n   dangling target instead of writing it; if the target is in another repo\n   you cannot read, say the edge is unverified.\n10. **Report** the IDs written or refined, the edges added (and back-filled),\n    and anything you chose not to file.\n\n## Workflow — promote\n\n1. Confirm the promotion bar with the operator: what decision is blocked, or\n   what repeated pain was measured. If neither, say so and stop unless they\n   still want it promoted.\n2. Write an **ordinary backlog item** in that repo's backlog format. For a\n   repo on the file-based backlog adapter, use its `new-issue.sh` through the\n   framework home (`\"${EPOSFORGE_HOME:?set EPOSFORGE_HOME}\"\u002F.eposforge\u002Fbacklog\u002Ffile-based-backlog\u002Fscripts\u002Fnew-issue.sh`)\n   and fill the item to that repo's schema; carry the Story, Acceptance\n   criteria and Notes across, and cite the idea ID in the item's notes. Run\n   that repo's backlog lint afterwards.\n3. On the idea entry, set **Status** to `promoted → \u003CBACKLOG-ID>` and add the\n   edge `- promoted-to: \u003CBACKLOG-ID>`. Leave the entry in place.\n4. Check the idea's other edges still resolve, and report the new backlog ID.\n\n## Workflow — reject\n\n1. Ask for (or confirm) a one-line reason. A rejection without a reason is\n   not recorded.\n2. Set **Status** to `rejected — \u003Creason>`. Leave the entry and its edges in\n   place — they explain the rejection later.\n3. If another idea replaces it, add `supersedes: \u003Cthis ID>` on the replacing\n   entry (directed: source only).\n\n## Editing an entry\n\nWhen refining, renaming or re-linking an entry: keep its ID, re-run the edge\ncheck (step 9 above), keep symmetric edges on both nodes, and fix any edge\nthat pointed at an ID that no longer resolves (for example a backlog item\nthat was renumbered or superseded) — say what you changed.\n\n## Analyzing the register\n\nRead the Edges fields as a directed graph whose nodes are ideas and backlog\nitems. Derive inverses yourself; they are never written.\n\n- **Clusters.** Follow `part-of` (toward the larger idea) and `overlaps`. A\n  connected group is one theme; several `overlaps` inside it are merge\n  candidates to put to the operator.\n- **Prerequisite chains.** Follow `depends-on` to its roots. An idea whose\n  prerequisites are all promoted or already built is closer to ready; an idea\n  that many others depend on is a likely next promotion.\n- **Conflicts to resolve.** Every `conflicts-with` and `alternative-to` pair\n  is an open choice. List them with their reasons; do not resolve them\n  yourself.\n- **What a backlog item would serve.** For a backlog ID, collect the ideas\n  with `overlaps: \u003CID>`, `depends-on: \u003CID>` or `enables` chains reaching it —\n  that is the undecided value the item would unlock.\n- **Hygiene.** Report dangling targets, symmetric edges present on only one\n  node, edge types outside the closed vocabulary, and written inverses.\n\nReport findings; change entries only when the operator asks.\n\n## Example\n\nThe repo is a reading-list app with backlog prefix `APP`. Its ideas file\nalready holds `APP-IDEA-002: Import highlights from e-reader exports`. Its\nArea vocabulary is `capture | organize | share | other`.\n\n**Input:** \"Napkin note — when I finish a book I'd like the app to pull my\nhighlights in automatically and show me the three I marked most, so I\nactually revisit them.\"\n\nThe highlight import overlaps `APP-IDEA-002`, so that part refines the\nexisting entry (new Source line, merged note). The \"show the top three to\nrevisit\" part is a distinct idea that needs the import first. One new entry:\n\n```markdown\n## APP-IDEA-007: Resurface top highlights after finishing\n\n**Story**\nAs a reader, I want the app to show my most-marked highlights when I finish a\nbook so that I actually revisit them.\n\n**Area**\norganize (capture)\n\n**Phase** (a guess, not a priority)\nnext\n\n**Status**\nidea\n\n**Source**\nnapkin note in chat, \u003CYYYY-MM-DD>\n\n**Serves**\n\"Turn reading into something I remember\" (intent doc, goal 2)\n\n**Acceptance criteria** (optional until clearer)\n- [ ] TBD\n\n**Notes \u002F context**\n\"Most marked\" is undefined — could mean most-revisited or explicitly starred.\n\n**Open questions**\n- What counts as most marked?\n- In-app prompt, or a later reminder?\n\n**Edges**\n- depends-on: APP-IDEA-002 — needs imported highlights to rank\n```\n\n`depends-on` is directed, so nothing is written on `APP-IDEA-002` for it. Had\nthe operator accepted `overlaps: APP-IDEA-002` instead, the same edit would\nalso add `- overlaps: APP-IDEA-007` to `APP-IDEA-002`.\n",{"name":5,"description":7},"main","ecf0afdd9413ab02342e811f43178dddbae1fa4c","skills\u002Fidea-capture",0,"https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge","https:\u002F\u002Fgithub.com\u002Feposforge","2026-10-12 06:39:48",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add eposforge\u002Feposforge --skill idea-capture",{"tool":56,"command":57},"bunx","bunx skills add eposforge\u002Feposforge --skill idea-capture",{"tool":59,"command":60},"pnpm","pnpm dlx skills add eposforge\u002Feposforge --skill idea-capture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fidea-capture\u002FSKILL.md",true,[64,70,74],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"CHANGELOG.md","REFERENCE","参考文档",892,"https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fidea-capture\u002FCHANGELOG.md",{"path":71,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":72,"sourceHtmlUrl":73},"evals\u002Fevals.json",6207,"https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fidea-capture\u002Fevals\u002Fevals.json",{"path":75,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":76,"sourceHtmlUrl":77},"evals\u002Ftriggers.json",1195,"https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fidea-capture\u002Fevals\u002Ftriggers.json",[79,108,131,159,168,189],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":90,"publishedAt":38},"01M71JQ9FR8PKMT1JMV3FV910A","upstream-bug-report","File a well-formed bug report against an upstream open-source dependency (GitHub issue). Use when EposForge or one of its adapter dependencies exhibits a reproducible defect that must be fixed upstream, particularly for silent failures, incorrect defaults, or API contract violations that affect ontology grounding, graph correctness, or agent reliability.","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fupstream-bug-report\u002FSKILL.md",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[91,92,93,94,95,96,97,98,99,100,101,102,22,34,103,104,105,24,106,107],"upstream","upstream bug report","report","bug","bug report","grounding","ontology","open","api","one","file","correctness","adapter","contract","reliability","Reproducible","api contract",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":38},"01M71JQ7C3ANN9JFA3YJWVB7Z2","update-spec-graph","Keeps the Cognee Spec Graph (Component 6) knowledge graph in sync with the repo. Use to update the KG after doc changes (incremental), rebuild it from scratch or after editing the ontology (full), or when recall is stale, the graph looks wrong, or entities are not ontology-anchored.","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fupdate-spec-graph\u002FSKILL.md",[],[115,116,117,118,119,120,97,121,122,22,123,34,124,125,126,127,35,128,129,130],"spec","update","update spec graph","graph","knowledge","knowledge graph","From Scratch","rebuild","entities","cognee","component","scratch","editing","with","changes","recall",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":142,"publishedAt":38},"01M71JQ5H57DT8J7VSBNE9HB4X","refine-prompt","Technique-driven prompt transformation for under-specified asks. Discovers techniques from data files, elicits missing required slots in one batch, rewrites with strict traceability, and gates submission behind explicit yes\u002Fno confirmation.","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Frefine-prompt\u002FSKILL.md",[137],{"categoryNo":138,"categoryName":139,"taxonomyType":140,"taxonomyTypeDesc":141},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[143,144,145,146,147,148,128,149,150,100,151,152,153,154,155,156,157,24,158],"refine prompt","refine","prompt","yes","data","slots","batch","gates","confirmation","files","driven","techniques","missing","submission","traceability","transformation",{"skillNo":160,"name":161,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":38},"01M71JQ36VW2ZH2E2R3JE4PXY4","portfolio-review","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fportfolio-review\u002FSKILL.md",[],[165,166,167],"portfolio review","portfolio","review",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":38},"01M71JQ0AD94NHJ39GB0V0N9SB","milestone-elicitation","Guided interview for discovering milestones and value-harvest points. Writes confirmed anchors back as ordinary backlog items and keeps durable elicitation records. Re-runnable — subsequent runs diff against existing anchors and prior records so the milestone map evolves without replaying history.","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fmilestone-elicitation\u002FSKILL.md",[],[175,176,177,178,179,180,32,181,24,182,183,184,28,185,186,187,188],"milestone","milestone elicitation","elicitation","interview","milestones","records","re","diff","value","history","map","back","harvest","Existing",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":38},"01M71JPYGQWYVFTZ82E1R7P8PH","maintain-ontology","Keeps 00-vision\u002F01-ontology.ttl well-formed, internally consistent, and aligned with adapter cards under .eposforge\u002F so Cognee extraction remains ontology-grounded.","https:\u002F\u002Fgithub.com\u002Feposforge\u002Feposforge\u002Fblob\u002Fmain\u002Fskills\u002Fmaintain-ontology\u002FSKILL.md",[],[196,97,197,198,199,200,128,201,124,103],"maintain","maintain ontology","extraction","vision","cards","ttl"]