misakanet 2.44.1 → 2.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,13 +8,18 @@
8
8
 
9
9
  mcp-name: io.github.Ikalus1988/misakanet
10
10
 
11
- > **Stop debugging the same error twice.** MisakaNet searches its indexed failure lessons so an agent skips
12
- > the bugs someone already paid for, instead of rediscovering them one session at a time — the **Lessons**
13
- > badge above is the live corpus size.
11
+ > **The same failure, paid for twice.**
14
12
  >
15
- > Agent-native interfaces: [MCP server](https://misakanet.org/mcp) (8 tools), WebMCP (browser
16
- > `navigator.modelContext`), `llms.txt` / `llms-full.txt`, and A2A discovery through
17
- > `.well-known/agent-card.json`.
13
+ > A `pip install` times out behind a corporate proxy. An agent finds the fix. Days later the same
14
+ > timeout appears on another machine, under another model — and is debugged from scratch, because the
15
+ > fix was never written down anywhere the next agent looks.
16
+ >
17
+ > MisakaNet is that place: a git-backed **failure memory**. Every lesson is a Markdown file in this
18
+ > repository — graded by evidence, reviewed like code, retrieved by an agent instead of guessed at.
19
+ > You fail once; the next agent does not.
20
+
21
+ Agent-native interfaces: [MCP server](https://misakanet.org/mcp) (8 tools), WebMCP, `llms.txt`,
22
+ A2A discovery via `.well-known/agent-card.json`.
18
23
 
19
24
  <p align="center">
20
25
  <img src="promotional/misaka-compare.jpg" width="720" alt="MisakaNet — Before: 30+ min manual debugging vs After: 0.02s with MCP"/>
@@ -23,7 +28,7 @@ mcp-name: io.github.Ikalus1988/misakanet
23
28
  <p align="center">
24
29
  <em>Core</em>
25
30
  &nbsp;&nbsp;
26
- <a href="https://github.com/Ikalus1988/MisakaNet/actions/workflows/pr-quality-gate.yml"><img src="https://github.com/Ikalus1988/MisakaNet/actions/workflows/pr-quality-gate.yml/badge.svg" alt="CI"></a>
31
+ <a href="https://github.com/Ikalus1988/MisakaNet/actions/workflows/pr-checks.yml"><img src="https://github.com/Ikalus1988/MisakaNet/actions/workflows/pr-checks.yml/badge.svg" alt="CI"></a>
27
32
  <a href="https://github.com/Ikalus1988/MisakaNet/tree/main/lessons"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Ikalus1988/MisakaNet/data/badges/lessons.json" alt="Lessons"></a>
28
33
  <a href="https://github.com/Ikalus1988/MisakaNet/blob/main/scripts/mcp_server.py"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Ikalus1988/MisakaNet/data/badges/tools.json" alt="MCP Tools"></a>
29
34
  <a href="https://misakanet.org/api/search-index"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Ikalus1988/MisakaNet/data/badges/retrieval.json" alt="Retrieval backend (today)"></a>
@@ -38,161 +43,118 @@ mcp-name: io.github.Ikalus1988/misakanet
38
43
  <a href="https://pypi.org/project/misakanet/"><img src="https://img.shields.io/pypi/v/misakanet" alt="PyPI"></a>
39
44
  <a href="https://www.npmjs.com/package/misakanet"><img src="https://img.shields.io/npm/v/misakanet" alt="npm"></a>
40
45
  <a href="https://github.com/marketplace/actions/misakanet-intake-bot"><img src="https://img.shields.io/badge/Marketplace-MisakaNet%20Intake%20Bot-blue?logo=github" alt="GitHub Marketplace"></a>
41
- <a href="https://dsh-plugin.org/plugins/ikalus1988/misakanet"><img src="https://dsh-plugin.org/badges/listed.svg" alt="Listed on dsh-plugin.org"></a>
42
- <a href="https://dsh.directory/plugins/ikalus1988/misakanet"><img src="https://dsh.directory/badges/listed.svg" alt="Listed on DSH Directory"></a>
43
- <a href="https://www.dsh.so/artifact/misakanet/"><img src="https://www.dsh.so/badge/install/misakanet.svg" alt="dsh.so install"></a>
44
46
  </p>
45
47
 
46
48
  <p align="center">
47
49
  <em>Ecosystem</em>
48
50
  &nbsp;&nbsp;
49
- <a href="https://glama.ai/mcp/servers/Ikalus1988/MisakaNet/score"><img src="https://glama.ai/mcp/servers/Ikalus1988/MisakaNet/badges/score.svg" alt="Glama score"></a>
50
- <a href="https://glama.ai/mcp/connectors/org.misakanet/misaka-net"><img src="https://glama.ai/mcp/connectors/org.misakanet/misaka-net/badges/score.svg" alt="MisakaNet MCP connector – tool definition quality and endpoint health on Glama"></a>
51
- <a href="https://mcptoplist.com/server/io.github.Ikalus1988%2Fmisakanet"><img src="https://mcptoplist.com/badge/io.github.Ikalus1988%2Fmisakanet.svg" alt="MCP Toplist"></a>
52
- <!-- Smithery badge uses a shields.io 'endpoint' badge that dynamically reads the Kin
53
- score from data/badges/smithery.json -- updated daily by the update-smithery-badge
54
- workflow, so it stays in sync without manual PRs. -->
55
- <a href="https://smithery.ai/servers/misakanet/misakanet"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Ikalus1988/MisakaNet/refs/heads/data/badges/smithery.json" alt="Smithery"></a>
56
- <!-- HOL badge: the link still points at hol.org (its listing detector looks for the badge
57
- in the README, worth +2% trust), but the image is a static flat shield — the live
58
- hol.org/api/... endpoint is slow/unstable through shields.io and rendered as
59
- "inaccessible" / a mismatched for-the-badge style. -->
60
- <a href="https://hol.org/registry/plugins/Ikalus1988%2FMisakaNet"><img src="https://img.shields.io/badge/HOL%20Registry-listed-5599FE?style=flat" alt="MisakaNet on HOL Registry"></a>
61
- <a href="https://github.com/Ikalus1988/MisakaNet/tree/main/docs/benchmarks"><img src="https://img.shields.io/badge/Benchmark-Weekly%20Workers%20AI-blue" alt="Benchmark"></a>
51
+ <a href="https://glama.ai/mcp/connectors/org.misakanet/misaka-net"><img src="https://glama.ai/mcp/connectors/org.misakanet/misaka-net/badges/score.svg" alt="MisakaNet MCP connector on Glama"></a>
52
+ <a href="https://mcptoplist.com/server/io.github.Ikalus1988%2Fmisakanet"><img src="https://img.shields.io/badge/MCP-Toplist-blue" alt="MCP Toplist"></a>
62
53
  </p>
63
54
 
64
55
  ---
65
56
 
66
57
  ## Install (30 seconds)
67
58
 
59
+ The point of an install is a first **successful search**, not the install. None of these needs an
60
+ account or a token.
61
+
68
62
  | Your host | Command |
69
63
  |---|---|
70
- | **DeepSeek Harness** | `dsh plugin --profile web add misakanet` — or type `misakanet` in the host's **Add plugin** dialog |
64
+ | **DeepSeek Harness** | `dsh plugin --profile web add misakanet` — or type `misakanet` in **Add plugin** |
71
65
  | **Claude Code** | `/plugin marketplace add Ikalus1988/MisakaNet` then `/plugin install misakanet@misakanet` |
72
- | **Codex, Cursor, Gemini CLI, Copilot CLI, OpenCode, …** | `npx @misaka-net/misakanet-setup` — writes the MCP row into each host's own config |
73
- | **Any other MCP client** | point it at `https://misakanet.org/mcp` — the endpoint is public and reads are anonymous |
66
+ | Installer-managed | Claude Code · Codex · Hermes · OpenClaw · codewhale · Cursor · Gemini CLI · Copilot CLI · OpenCode · Kiro |
67
+ | **Any other MCP client** | point it at `https://misakanet.org/mcp` — public endpoint, anonymous reads |
74
68
  | **Your own code** | `pip install misakanet-core` (library) · `pip install misakanet` (stdio server) |
75
69
 
76
- <p align="center">
77
- <img src="docs/assets/dsh-plugin-add.png" width="760" alt="DeepSeek Harness plugin page: (1) the plugin icon in the sidebar, (2) the 添加插件 (Add plugin) button, (3) the Add-plugin dialog with the package name misakanet typed in"/>
78
- </p>
79
-
80
- <p align="center"><em>DeepSeek Harness: sidebar <b>插件</b> (1) → <b>添加插件</b> (2) → type <code>misakanet</code> (3) → <b>安装</b>.<br/>The dialog takes the same package name the CLI command above uses (its own hint: a package name, a GitHub URL, or a local path).</em></p>
70
+ The installer-managed row is what `npx @misaka-net/misakanet-setup` writes into each host's config.
81
71
 
82
72
  Updates: `dsh plugin --profile web update misakanet@latest`.
83
- Update the installer: `npx @misaka-net/misakanet-setup@latest` (its own command, its own flags).
84
-
85
- No account, no token, no Python needed for the plugin path: the npm bundle mounts the hosted endpoint.
86
- Declared hosts and what was measured: [compatibility](docs/compatibility.md). Every channel, the
87
- prerequisites, and the two-package trap that costs people an install: [How to use it](#how-to-use-it).
88
-
89
- ## What the DeepSeek Harness plugin adds
73
+ Installer updates: `npx @misaka-net/misakanet-setup@latest`.
74
+ Full prerequisites and the two-package trap: [How to use it](#how-to-use-it).
90
75
 
91
- Version 2.40.0 ships the browser half, and 2.41.0 adds the rest of it: the surfaces below did not all land in
92
- the same release, so this section lists them by the version that carries them. It is not a dialog: it puts
93
- MisakaNet where the session already is.
76
+ ## Your first five minutes
94
77
 
95
- **In 2.40.0 — published.** These six seats are what `npm view misakanet version` gives you today.
78
+ **1. Ask it something you have actually broken.** No client installed? This `curl` is the whole interface:
96
79
 
97
- | Where | What you get |
98
- | --- | --- |
99
- | **Left column** | A permanent `MisakaNet` entry directly under `Plugins`. It is a shortcut, not the panel: clicking it opens a full page in the main column. Root scope — it does not come and go with a session. |
100
- | **Conversation tab** | A `MisakaNet` tab beside Chat and Trajectory: what this session asked, what came back, and what you filed, rebuilt from the conversation's own rows. |
101
- | **Right column** | The same panel as a pane, so it can sit next to the file tree, a terminal, or a document. |
102
- | **Tool call rows** | Every `misakanet_search` and `misakanet_submit_intake` call gets its own row on the tool card: the query as it was sent, whether a lesson came back, and which lesson is on top, with the raw result one disclosure away. The row reports and never posts — the vote belongs on the answer's action row below. |
103
- | **Assistant action row** | 👍 / 👎 on the answer that used a lesson. Those two are the only things the page ever sends — counters live in the browser, not on a server. |
104
- | **Voice** | An off-by-default switch that explains both mechanisms: the cue the server names on the next search, and the local hook a page cannot read. |
105
-
106
- <p align="center">
107
- <img src="docs/assets/dsh-client-left-column.png" width="820" alt="DeepSeek Harness: a permanent MisakaNet entry in the left column under Plugins, and the full page it opens"/>
108
- </p>
109
-
110
- <p align="center">
111
- <img src="docs/assets/dsh-client-right-panel.png" width="820" alt="The MisakaNet pane in the right column of a DeepSeek Harness session"/>
112
- </p>
113
-
114
- **With 2.41.0 — [release PR #2591](https://github.com/Ikalus1988/MisakaNet/pull/2591).** These six surfaces
115
- are in `main` and ship in 2.41.0; a 2.40.0 install does not have them yet.
80
+ ```bash
81
+ curl -sS https://misakanet.org/mcp \
82
+ -H 'Content-Type: application/json' -H 'Accept: application/json' \
83
+ -H 'MCP-Protocol-Version: 2025-06-18' -H 'Origin: https://misakanet.org' \
84
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
85
+ "params":{"name":"misakanet_search","arguments":{"query":"database is locked","top":3}}}'
86
+ ```
116
87
 
117
- | Where | What you get |
118
- | --- | --- |
119
- | **`/misakanet` in the composer** | Type `/misakanet pip install timeout` and press Enter: the lessons come back in a card inside the composer, with no agent in the loop. The query is the only thing it sends. |
120
- | **Frame-wide toast** | After a `/misakanet` search comes back with lessons, a card appears over every column with the top hit; dismiss it or click through to the lesson. |
121
- | **Sidebar foot** | One action beside Settings: copy this session's MisakaNet activity as a summary for an issue or a PR body. |
122
- | **中文 / English** | Every MisakaNet surface follows the host language: the panel, the `/misakanet` card, the settings row, and the plugin page's own title and description. |
123
- | **Settings → General** | A MisakaNet preference row: play voice cues in this browser, and how much the surfaces show (compact / full). Both stay in the browser. |
124
- | **Plugin page** | The MCP row's effective configuration — endpoint, transport, timeout — shown read-only, next to where it is edited (the profile's `cordis.patch.yml`). |
88
+ **2. Read what came back.** A hit returns the lesson, its `evidence_level`, and its path — open the
89
+ file and read the fix before running any command in it. A miss returns `no_match` plus a ready-to-call
90
+ intake: the corpus saying it does not know this one yet.
125
91
 
126
- Which seats the half occupies and why they are `root` or `session` scope, with the host's own contract text
127
- quoted: [compatibility](docs/compatibility.md). Running a host of your own and want a check that cannot
128
- touch your profile: `python3 scripts/install_smoke.py dsh-client --serve`.
92
+ **3. Check the trust signal, not the tone.** `E0`–`E3` say how far a lesson was verified; `E4` is the
93
+ one nobody can write or vote into.
129
94
 
130
95
  ## What is MisakaNet?
131
96
 
132
- **Git-backed failure memory for AI coding agents.** An error shows up → the agent searches the lessons →
133
- it applies a fix somebody already verified → if nothing matches, an intake turns that dead end into a
134
- lesson for the next agent. Every lesson is a Markdown file in this repository: reviewed
135
- like code (each commit DCO-signed), graded by evidence level, retrieved with BM25 over the Python standard
136
- library. No vector database, no embedding model, no server unless you want one.
97
+ **Git-backed failure memory for AI coding agents.** An error shows up → the agent searches → it
98
+ applies a fix somebody already verified → if nothing matches, the miss becomes an intake, and the
99
+ intake becomes a lesson for the next agent.
100
+
101
+ Every lesson is a Markdown file: reviewed like code, graded by evidence, retrieved with BM25 over the
102
+ Python standard library. No vector database, no embedding model, no server unless you want one.
137
103
 
138
104
  | | |
139
105
  |---|---|
140
106
  | **Lessons** | failure-recovery knowledge base, open and auditable under `lessons/` |
141
107
  | **Domains** | rag · devops · fanuc · docker · feishu · mcp · network · ci · wsl · windows … |
142
- | **Evidence levels** | E0 intake → E1 CI → E2 merged PR → E3 maintainer → E4 production reuse |
143
-
144
- Registry listings ([Glama](https://glama.ai/mcp/servers/Ikalus1988/MisakaNet/score),
145
- [Smithery](https://smithery.ai/servers/misakanet/misakanet), MCP Toplist) proxy the hosted endpoint, which
146
- serves **indexed failure-recovery lessons** — *indexed*, never "verified": evidence level is what says
147
- how much a lesson has been proven.
108
+ | **Evidence** | E0 intake → E1 reviewed → E2 reproduced → E3 CI verified → **E4 observed reuse by two or more distinct clients** |
148
109
 
149
- | MisakaNet is NOT | What it is instead |
150
- |------------------|-------------------|
151
- | ❌ A general-purpose memory system | ✅ Failure-recovery knowledge layer |
152
- | ❌ An Agent runtime or framework | ✅ Searchable lesson database |
153
- | ❌ A vector database or RAG system | ✅ BM25 keyword search — **stdlib only**, no third-party packages, but a **Python ≥ 3.10 interpreter is still required** |
154
- | ❌ A cloud service requiring signup | ✅ `git clone` → search locally |
155
- | ❌ A skill marketplace | ✅ Debugging knowledge from real sessions |
110
+ | It is not | It is |
111
+ |---|---|
112
+ | ❌ a general memory system | ✅ a failure-recovery knowledge layer |
113
+ | ❌ an agent runtime | ✅ a searchable lesson database |
114
+ | ❌ a vector database / RAG stack | ✅ BM25 keyword search, stdlib only (Python ≥ 3.10 still required) |
115
+ | ❌ a skill marketplace | ✅ debugging knowledge from real sessions |
116
+ | ❌ a retrieval benchmark | ✅ a corpus graded by evidence; the benchmark we have is paused |
156
117
 
157
- ### What it can and cannot answer
118
+ ### What it answers — and what it does not
158
119
 
159
- ![Four-panel comic: the mascot promises to prevent every AI error; the cats ask about pizza and an oil barrel and it deflates — then a cat shows npm ERESOLVE and it lights up. MisakaNet knows the failures that have been indexed, not general knowledge.](promotional/misakanet-scope-comic.webp)
120
+ ![Four-panel comic: an agent asks about a failure, gets an indexed lesson back, or gets "no_match" and a ready-to-call intake form](promotional/misakanet-scope-comic.webp)
160
121
 
161
- It answers for **the failures it has indexed**, not general knowledge. A query that finds nothing returns
162
- `no_match` plus a ready-to-call intake — a miss is how a gap gets recorded, so a miss is an answer too.
122
+ MisakaNet answers for the failures it has indexed, and only those. When nothing matches the reply is
123
+ `no_match` plus a ready-to-call `intake` — the corpus saying "not this one yet", not a dead end.
163
124
 
164
125
  ### Lesson vs Skill
165
126
 
166
- A **skill** teaches an agent *how to do something*. A **lesson** records *what went wrong before, and how
167
- not to fail again*. MisakaNet is only the second thing: not a skill marketplace, not an agent runtime, not
168
- a general memory layer, not a vector database. → [FAQ](FAQ.md)
169
-
170
- ## Benchmark: how much of a lesson does a model reproduce when handed one?
127
+ A **skill** teaches an agent how to do something; a **lesson** records what went wrong before and how
128
+ not to fail again. MisakaNet is only the second thing. → [FAQ](FAQ.md)
171
129
 
172
- Weekly benchmark (Cloudflare Workers AI). **Read the metric before the numbers** — the scenario in this benchmark is each lesson's own title, the "matching lesson" injected into the `with_lesson` arm is *that same lesson*, and the
173
- score is `lesson_hit_rate`: **the share of the injected lesson's commands reproduced in the answer**.
174
- No retrieval is called and correctness is not checked, so this is the **recitation** half of RAG, not
175
- evidence that search works.
130
+ ## Where it is today
176
131
 
177
- Latest aggregated data: [`docs/benchmarks/latest.json`](docs/benchmarks/latest.json) (2026-09-22, two
178
- independent runs of ≈500 scenarios each):
132
+ - **The numbers that move are badges**, on purpose: the Lessons badge renders
133
+ `data/badges/lessons.json`, regenerated by `update-badges.yml`, so it can lag a run but is never a
134
+ hand-typed total.
135
+ - **The top of the evidence ladder is empty, and this page says so.** `E4` needs an observation —
136
+ two distinct clients actually retrieving a lesson — and the corpus has none yet
137
+ ([distribution](docs/trust-semantics.md), regenerated and checked by CI).
138
+ - **Search is BM25, so it matches words, not meaning.** A failure described in vocabulary the corpus
139
+ has never seen is a miss, and no retriever tuning fixes a corpus gap — which is why a miss returns
140
+ `no_match` plus an intake instead of an empty page.
141
+ - **Reported gaps arrive faster than they are triaged.** The intake queue is the honest bottleneck.
179
142
 
180
- | Condition | Run 1 hit rate | Run 2 hit rate | Avg | n (per run) | Actionable |
181
- |---|---|---|---|---|---|
182
- | plain (no lesson) | 0.239 | 0.233 | **23.3%** | ≈510 | 82–83% |
183
- | with_lesson (pasted) | 0.464 | 0.461 | **46.1%** | ≈512 | 76–77% |
143
+ ## Benchmark: what it measured, and why it is paused
184
144
 
185
- **Reproducibility.** Two runs with identical config produce hit rates within 0.3% of each other
186
- (0.464 vs 0.461 for `with_lesson`; 0.239 vs 0.233 for `plain`), confirming the metric is stable.
145
+ One narrow question: **when you hand a model a lesson, how much of that lesson comes back?** The
146
+ metric is `lesson_hit_rate` — the share of the injected lesson's commands reproduced in the answer.
147
+ Read the setup before the number: the scenario in this benchmark is each lesson's own title, the injected
148
+ lesson is *that same lesson*,
149
+ no retrieval call is made, and correctness is not checked. It measures the **recitation** half of RAG:
150
+ necessary for MisakaNet to help, and **not evidence that search finds anything**.
187
151
 
188
- **Aggregation.** Each run evaluates every lesson in the corpus as a scenario. The `with_lesson` arm pastes the matching lesson
189
- into the prompt; `plain` uses no lesson. `actionable` is a boolean per scenario indicating whether the
190
- model produced a usable answer. Actionable rates are stable across runs (76–77% with lesson, 82–83% plain).
152
+ The run is **paused**. Two independent runs of ≈500 scenarios each on 2026-09-22: **46.1%** with the
153
+ lesson pasted in, **23.3%** without. What remains is the last snapshot plus its dated record —
154
+ [`docs/benchmarks/latest.json`](docs/benchmarks/latest.json).
191
155
 
192
- **Trend.** Rows below are **generated** by [`scripts/update_readme_benchmark.py`](scripts/update_readme_benchmark.py)
193
- from [`docs/benchmarks/latest.json`](docs/benchmarks/latest.json) — regenerate them with
194
- `python3 scripts/update_readme_benchmark.py`. Do not hand-edit: a second source of truth is what made the
195
- previous copy go stale while the paragraph directly above it explained what the metric does and does not mean.
156
+ The table below is generated by [`scripts/update_readme_benchmark.py`](scripts/update_readme_benchmark.py);
157
+ do not hand-edit it.
196
158
 
197
159
  <!-- BEGIN generated: benchmark-trend -->
198
160
 
@@ -221,109 +183,58 @@ with_lesson hit rate (per run date)
221
183
 
222
184
  <!-- END generated: benchmark-trend -->
223
185
 
224
- A model repeats more of a document it was handed, and the weaker the model the bigger the relative
225
- difference. That is *necessary* for the product to help and it is not sufficient — the claim "search finds the
226
- right lesson for a failure you described" is measured nowhere yet. Details:
227
- [`docs/benchmarks/latest.json`](docs/benchmarks/latest.json) · per-run files in
228
- [`docs/benchmarks/`](docs/benchmarks/) · metric definition: `METRIC_DEFINITION` in
229
- [`scripts/benchmark_workers_ai.py`](scripts/benchmark_workers_ai.py)
230
-
231
- → [Full changelog](CHANGELOG.md) · [Release notes](https://github.com/Ikalus1988/MisakaNet/releases)
232
-
233
- **Beware of a single number.** A benchmark is only as good as what it measures, so here is what these mean
234
- and where this design loses:
186
+ Per-run files: [`docs/benchmarks/`](docs/benchmarks/) · metric definition: `METRIC_DEFINITION` in
187
+ [`scripts/benchmark_workers_ai.py`](scripts/benchmark_workers_ai.py).
235
188
 
236
- | Metric | What it measures | Why it matters here |
237
- |---|---|---|
238
- | Hit rate | share of the **injected** lesson's commands reproduced in the answer — a recitation check; the scenario is that lesson's own title and no retrieval happens | it is the ceiling on usefulness, not the measure of it: a corpus can be recitable and still unfindable |
239
- | Gain (with − without) | how much more of that lesson appears when it is pasted in | separates "the model can use a lesson" from "the model guessed the same words" — it says nothing about finding the lesson |
240
- | Actionable | whether the model produced a usable answer at all (boolean per scenario) | a high hit rate on an answer that is not actionable is noise; this tracks whether the model engages with the problem |
241
- | Cost / latency | tokens and wall-clock per answer | the whole premise is cheaper than re-debugging, so it has to stay cheap |
242
-
243
- **Where it loses on purpose:** BM25 matches words, not meaning. A failure described in vocabulary the
244
- corpus has never seen is a miss, and no amount of tuning in the retriever fixes a corpus gap. That is why a
245
- miss returns `no_match` plus an intake call rather than an empty result — the honest answer is "we do not
246
- know this one yet", and it is also the signal that tells maintainers what to write next.
189
+ ## Take part
247
190
 
248
- ## Why failure-memory?
191
+ **1. Report a failure the corpus does not have.** Search first, then call `misakanet_submit_intake` —
192
+ no account, no email, no token, a five-line report is enough. It becomes a tracked issue.
249
193
 
250
- Agents re-debug the same class of failures in isolation: pip timeouts behind a corporate proxy, DCO on
251
- Windows, SQLite on an NTFS mount, a GitHub 401 after a token rotation, FANUC error codes. The fix usually
252
- already exists in someone's terminal history, and is invisible to everyone else.
194
+ **2. Reuse a lesson and leave the trace.** A "this helped" vote is recorded as an `E3` hint, not as
195
+ proof. The proof is quieter: your retrieval is counted, anonymously, as one more distinct client.
253
196
 
254
- Three deliberate engineering choices, each of which trades something:
197
+ **What you get back: attribution.** A lesson cites the intake that produced it (`source:`,
198
+ `provenance.issue:`), and the pipeline can emit a receipt naming the lesson and its evidence level.
255
199
 
256
- * **Git is the source of truth.** A lesson is a file, so it diffs, reverts, forks and reviews like code.
257
- The cost is that search happens over a checkout (or a synced D1 mirror) rather than a live index.
258
- * **No third-party packages by default.** The retriever is BM25 over the standard library, so the offline path
259
- runs on an air-gapped box and cannot rot with an embedding model. The cost is recall on paraphrases.
260
- * **Evidence is graded, not asserted.** E0–E4 lets an agent weigh a community intake differently from a
261
- production-proven fix. The cost is bookkeeping, and most lessons sit at E0–E2.
200
+ Nothing here is a bounty: this repository pays nothing and promises nothing. Some issues carry
201
+ third-party reward banners added by our own automation; we do not administer them — see
202
+ [Contributing](#contributing).
262
203
 
263
204
  ## How to use it
264
205
 
265
- **Prerequisites:** Node ≥ 18 for the installer (Claude Code and Codex already require Node) **or**
266
- Python ≥ 3.10 for the library and the stdio server. Nothing else.
267
-
268
- Supported agents — and what "supported" means per group (evidence levels in
269
- [docs/integrations/status.md](docs/integrations/status.md)):
270
-
271
- | Group | Agents | What you get |
272
- |---|---|---|
273
- | Installer-managed | Claude Code · Codex · Hermes · OpenClaw · codewhale · Cursor · Gemini CLI · Copilot CLI · OpenCode · Kiro | `npx @misaka-net/misakanet-setup` writes each client's own MCP config, a rules block where the client has one, and (Claude Code only) a turn-counting hook — the five JSON-file clients (Cursor, Gemini CLI, Copilot CLI, OpenCode, Kiro) get the MCP entry alone; `--verify` checks whatever was written |
274
- | MCP by hand | Cursor · Gemini CLI · Windsurf · OpenCode · Copilot · DeepSeek Harness | the endpoint is standard MCP over HTTP; add the URL in that client's own config. Cursor also has a rules-file mode |
275
- | Anything else that speaks MCP over HTTP | — | the endpoint is public, reads are anonymous and unmetered |
276
-
277
- Pick one channel — they are independent, and none of them needs an account (the Claude Code row needs a Claude Code version with plugin support):
206
+ Pick one channel; they are independent.
278
207
 
279
208
  | I want… | Command | What it touches |
280
209
  |---|---|---|
281
- | my assistant to search the lessons | `npx @misaka-net/misakanet-setup` | writes the MCP endpoint into each assistant's own config; optionally a rules block and a hook |
282
- | my **Claude Code** assistant to search the lessons, as a plugin | `/plugin marketplace add Ikalus1988/MisakaNet` then `/plugin install misakanet@misakanet` | adds the hosted MCP tools to Claude Code from this repository — no installer, no local process |
283
- | to call the endpoint myself | the `curl` below | nothing to install |
210
+ | my assistant to search the lessons | `npx @misaka-net/misakanet-setup` | writes the MCP endpoint into each assistant's config; optionally a rules block and a hook |
211
+ | **Claude Code**, as a plugin | `/plugin marketplace add Ikalus1988/MisakaNet` then `/plugin install misakanet@misakanet` | the hosted MCP tools, no installer, no local process |
212
+ | **DeepSeek Harness** | `dsh plugin --profile web add misakanet` | `mcp__misakanet__*` tools plus the session panel |
213
+ | to call the endpoint myself | the `curl` in [Your first five minutes](#your-first-five-minutes) | nothing |
284
214
  | the library in my own code | `pip install misakanet-core` | nothing |
285
215
 
286
- **The two-package trap** (this one cost a real install failure, #1849):
216
+ **The two-package trap** (it cost a real install failure, #1849):
287
217
 
288
218
  | Looks like | Actually is | Use it for |
289
219
  |---|---|---|
290
220
  | `@misaka-net/misakanet-setup` (npm) | the **installer** — has `bin`, no plugin entry | teaching your assistant to search |
291
- | `misakanet` (npm) | the **DSH / Codex plugin** (`index.js`, `SKILL.md`) | `dsh plugin --profile web add misakanet` |
292
- | this repository (git) | also a **Claude Code plugin marketplace** (`.claude-plugin/`) | `/plugin marketplace add Ikalus1988/MisakaNet` — the Claude channel is repo-based on purpose: a marketplace resolves the plugin from the repository, so the npm bundle stays the DSH/Codex artifact |
293
- | `misakanet` (PyPI) | ships the stdio **MCP server** | `python3 -m misakanet.server` |
294
- | `misakanet-core` (PyPI) | the **library** (stdlib-only BM25 — Python ≥ 3.10 required, no third-party packages) | `from misakanet.search import search_lessons` |
295
-
296
- A marketplace error such as `@misaka-net/misakanet-setup: entry file missing: index.js` means the resolver
297
- picked the wrong package — the installer deliberately has no `index.js`.
298
-
299
- **One anonymous read — no account, no token, no browser:**
300
-
301
- ```bash
302
- curl -sS https://misakanet.org/mcp \
303
- -H 'Content-Type: application/json' -H 'Accept: application/json' \
304
- -H 'MCP-Protocol-Version: 2025-06-18' -H 'Origin: https://misakanet.org' \
305
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
306
- "params":{"name":"misakanet_search","arguments":{"query":"database is locked","top":3}}}'
307
- ```
221
+ | `misakanet` (npm) | the **DSH / Codex plugin** | `dsh plugin --profile web add misakanet` |
222
+ | this repository (git) | also a **Claude Code plugin marketplace** | `/plugin marketplace add Ikalus1988/MisakaNet` |
223
+ | `misakanet` (PyPI) | the stdio **MCP server** | `python3 -m misakanet.server` |
224
+ | `misakanet-core` (PyPI) | the **library** (stdlib-only BM25) | `from misakanet.search import search_lessons` |
308
225
 
309
- Reads are unlimited and anonymous — the only limit is a per-address burst window, which is a speed limit,
310
- not a quota. **Registration is for writing**, not for reading: it unlocks `misakanet_write_lesson` and
311
- `misakanet_preflight` and returns a token valid ~30 days
226
+ **Reads are anonymous and unlimited** (a per-address burst window is a speed limit, not a quota).
227
+ **Registration is for writing**: it unlocks `misakanet_write_lesson` and `misakanet_preflight`
312
228
  ([why](AGENTS.md#33-注册与配额)).
313
229
 
314
- Check the install with `npx @misaka-net/misakanet-setup --verify`, undo it with `--uninstall`, and print a
315
- redacted environment report with `--report` (paste it into a public issue — that is exactly what the
316
- external-validation bounty asks for).
317
-
318
- → [Quickstart](docs/quickstart.md) · [Install guide](https://misakanet.org/install/) ·
319
- [MCP docs](docs/mcp.md) · [what the installer writes](integrations/agent-autostart/README.md) ·
320
- [WebMCP setup](docs/cloudflare-worker.md)
230
+ Verify an install with `npx @misaka-net/misakanet-setup --verify`; undo it with `--uninstall`.
231
+ Prerequisites: Node ≥ 18 for the installer, Python ≥ 3.10 for the library and stdio server.
321
232
 
322
233
  ### Use it as a GitHub Action
323
234
 
324
- The same corpus, wired to your CI: when a workflow fails, the action searches the lessons, comments
325
- the closest match on the pull request, and (optionally) reports the new error so someone turns it
326
- into a lesson. Published on [GitHub Marketplace](https://github.com/marketplace/actions/misakanet-intake-bot).
235
+ When a workflow fails, the action searches the lessons and comments the closest match on the pull
236
+ request (optionally reporting the new error). Published on
237
+ [GitHub Marketplace](https://github.com/marketplace/actions/misakanet-intake-bot).
327
238
 
328
239
  ```yaml
329
240
  on:
@@ -345,107 +256,61 @@ jobs:
345
256
  source: ${{ github.repository }}
346
257
  ```
347
258
 
348
- → [inputs and outputs](docs/agents/external-usage.md) · [why `actions: read` is not optional](docs/agents/external-usage.md)
259
+ → [inputs and outputs](docs/agents/external-usage.md)
349
260
 
350
261
  ## Documentation
351
262
 
352
- **Choose your journey** — MisakaNet is useful in different ways depending on what you are trying to do:
353
-
354
- | I am... | Start with |
355
- |---|---|
356
- | 🔴 Debugging a real failure | [Search existing lessons](https://ikalus1988.github.io/MisakaNet/search/) before retrying |
357
- | 🤖 Building an AI agent / tool | Use lessons as [failure-memory](docs/mcp-quickstart.md) for your workflow |
358
- | 🧪 Using DeepSeek Harness | `dsh plugin --profile web add misakanet`, then [what it registers](docs/integration/deepseek-harness.md) — skill + `mcp__misakanet__*` tools, no local Python |
359
- | 🔧 Contributing a fix | Read [CONTRIBUTING.md](CONTRIBUTING.md) for code style + PR checklist, check [related lessons](https://ikalus1988.github.io/MisakaNet/search/), then open a small PR |
360
- | 📝 Sharing a failure case | Submit a [5-line failure note](https://github.com/Ikalus1988/MisakaNet/issues/new?template=lesson-feedback.yml) — no polished PR required |
361
- | 📊 Evaluating agent learning | Run the [benchmarks](scripts/retrieval_noisebench.py) and compare reuse behavior |
362
- | 💬 Reporting friction | [MCP intake](docs/integrations/mcp-remote.md) or [journey report #510](https://github.com/Ikalus1988/MisakaNet/issues/510) |
363
- | ❓ New to MisakaNet | Read the [FAQ](FAQ.md) for installation, MCP pairing, troubleshooting, and contribution answers |
364
-
365
- > 👉 **New here?** [Search failure lessons →](https://ikalus1988.github.io/MisakaNet/search/)
366
- >
367
- > No GitHub account? Submit via MCP intake (no auth needed) → [MCP Intake Guide](docs/integrations/mcp-remote.md)
368
- >
369
- > Understanding the system → [Label system](docs/label-system.md) · [Troubleshooting](docs/troubleshooting.md)
370
-
371
- **The rest of the map:**
372
-
373
263
  | Topic | Where |
374
264
  |---|---|
375
- | Open the network in a browser | <https://misakanet.org/> · <https://ikalus1988.github.io/MisakaNet/search/> |
376
265
  | Install, verify, uninstall | [docs/quickstart.md](docs/quickstart.md) · <https://misakanet.org/install/> |
377
- | MCP: protocol, tool reference, transports | [docs/mcp.md](docs/mcp.md) · [API.md](API.md) |
266
+ | MCP: protocol, tools, transports | [docs/mcp.md](docs/mcp.md) · [API.md](API.md) |
378
267
  | CLI | [docs/cli-reference.md](docs/cli-reference.md) · `python3 search_knowledge.py "…"` |
379
- | Architecture and the three paths | [ARCHITECTURE.md](ARCHITECTURE.md) · [docs/CONCEPTS.md](docs/CONCEPTS.md) |
380
- | Submitting an intake (for agents and humans) | [docs/mcp-intake-guide.md](docs/mcp-intake-guide.md) |
381
- | What the labels mean | [docs/label-system.md](docs/label-system.md) |
382
- | Troubleshooting (error scene index) | [docs/troubleshooting.md](docs/troubleshooting.md) |
383
- | Known limitations, stated plainly | [docs/LIMITATIONS.md](docs/LIMITATIONS.md) |
384
- | Benchmarks | [docs/benchmarks/](docs/benchmarks/) · [docs/lesson-reuse-benchmark.md](docs/lesson-reuse-benchmark.md) |
385
- | Competitive landscape | [docs/competitive-analysis.md](docs/competitive-analysis.md) |
386
- | Domain samples (rag, devops, fanuc, …) | [docs/domains/](docs/domains/) |
387
- | AI crawler policy: robots, JSON-LD, WAF rules | [docs/cloudflare-robots-txt.md](docs/cloudflare-robots-txt.md) · [docs/json-ld-schema.md](docs/json-ld-schema.md) · [docs/cloudflare-waf-rules.md](docs/cloudflare-waf-rules.md) |
388
- | Roadmap | [ROADMAP.md](ROADMAP.md) · [CHANGELOG.md](CHANGELOG.md) |
268
+ | Architecture | [ARCHITECTURE.md](ARCHITECTURE.md) · [docs/CONCEPTS.md](docs/CONCEPTS.md) |
269
+ | Contributing a fix | [CONTRIBUTING.md](CONTRIBUTING.md) · [label system](docs/label-system.md) |
270
+ | Submitting an intake | [docs/mcp-intake-guide.md](docs/mcp-intake-guide.md) · [mcp-remote](docs/integrations/mcp-remote.md) |
271
+ | Troubleshooting | [docs/troubleshooting.md](docs/troubleshooting.md) |
272
+ | Known limitations | [docs/LIMITATIONS.md](docs/LIMITATIONS.md) |
273
+ | Benchmarks | [docs/benchmarks/](docs/benchmarks/) |
274
+ | Roadmap / changelog | [ROADMAP.md](ROADMAP.md) · [CHANGELOG.md](CHANGELOG.md) |
275
+ | Competitors, domains, crawler policy | [competitive](docs/competitive-analysis.md) · [domains](docs/domains/) · [robots](docs/cloudflare-robots-txt.md) |
389
276
 
390
277
  ## Contributing
391
278
 
392
- > **Zero bounty. Maximum rigor. Merge earns credit.** Every merged PR proves your agent can survive
393
- > real-world CI gating.
394
- >
395
- > "Zero bounty" is a statement about *this repository*: MisakaNet pays nothing and promises nothing.
396
- > It is not a statement about the issue you are looking at. Some issues carry an Opire banner
397
- > advertising a third-party reward, added automatically by our own
398
- > [`scripts/question_autopilot.py`](scripts/question_autopilot.py) — Opire is not mentioned anywhere
399
- > in `CONTRIBUTING.md` and we do not administer those payouts. **Verify any reward offer independently
400
- > before you plan work around it.** The only thing this repository has ever honoured is a merged PR.
401
- > ([#2903](https://github.com/Ikalus1988/MisakaNet/issues/2903) — the same banner has also attracted
402
- > an automated account posting identical payout claims every ~97 seconds.)
403
-
404
- 1. Check the checkout works: `python3 scripts/misakanet_cli.py smoke`
405
- 2. Search before writing: `python3 search_knowledge.py "your error here"`
406
- 3. Found nothing? **[Share your failure lesson →](https://github.com/Ikalus1988/MisakaNet/issues/new?template=lesson-feedback.yml)**
407
- — a five-line note is enough, no polished PR required. Two places say what is missing, and they measure
408
- different things: the [demand board](workers/README.md#insights-endpoints-issue-591) aggregates anonymous
409
- *search* misses (`/api/insights/unsolved-map`; measured 2026-09-25 it held **one** signal in 30 days,
410
- because the intake path does not feed it — [#2224](https://github.com/Ikalus1988/MisakaNet/issues/2224)),
411
- and the [open intake issues](https://github.com/Ikalus1988/MisakaNet/issues?q=is%3Aissue+is%3Aopen+label%3Aintake)
412
- are where the real gaps currently arrive.
413
-
414
- → [CONTRIBUTING.md](CONTRIBUTING.md) · [good first issues](https://github.com/Ikalus1988/MisakaNet/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) ·
415
- [active competitions](https://github.com/Ikalus1988/MisakaNet/labels/status%3Acompetition) ·
416
- [code of conduct](CODE_OF_CONDUCT.md)
279
+ > **Zero bounty. Maximum rigor. Merge earns credit.**
417
280
 
418
- ## Security
281
+ "Zero bounty" is a statement about *this repository*: MisakaNet pays nothing and promises nothing. It
282
+ is not a statement about the issue you are looking at. Some issues carry an **Opire** banner
283
+ advertising a third-party reward, added automatically by our own
284
+ [`scripts/question_autopilot.py`](scripts/question_autopilot.py) — we do not administer those payouts,
285
+ and Opire is not mentioned in `CONTRIBUTING.md`. **Verify any reward offer independently** before you
286
+ plan work around it. The only thing this repository has ever honoured is a merged PR.
287
+ ([#2903](https://github.com/Ikalus1988/MisakaNet/issues/2903))
419
288
 
420
- ⚠️ **Always sandbox your Agent before executing retrieved commands.** Lessons are community-contributed — review before run.
289
+ 1. Check the checkout: `python3 scripts/misakanet_cli.py smoke`
290
+ 2. Search before writing: `python3 search_knowledge.py "your error here"`
291
+ 3. Found nothing? [Share your failure lesson](https://github.com/Ikalus1988/MisakaNet/issues/new?template=lesson-feedback.yml) — five lines is enough
421
292
 
422
- CI scans all Markdown for dangerous patterns (`rm -rf`, `curl | sh`, backtick injection). See [SECURITY.md](SECURITY.md).
293
+ → [CONTRIBUTING.md](CONTRIBUTING.md) · [good first issues](https://github.com/Ikalus1988/MisakaNet/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) · [code of conduct](CODE_OF_CONDUCT.md)
423
294
 
424
- See [LIMITATIONS.md](docs/LIMITATIONS.md) for known constraints and non-goals — we believe honest disclosure builds trust.
295
+ ## Security
425
296
 
426
- ## Troubleshooting
297
+ ⚠️ **Sandbox your agent before executing retrieved commands.** Lessons are community-contributed —
298
+ review before running. CI scans all Markdown for dangerous patterns (`rm -rf`, `curl | sh`, backtick
299
+ injection). See [SECURITY.md](SECURITY.md) and [LIMITATIONS.md](docs/LIMITATIONS.md).
427
300
 
428
- Most failures already have a documented answer — start from the index, not from this page:
301
+ ## Troubleshooting
429
302
 
430
303
  | Symptom | Where |
431
304
  |---|---|
432
- | DCO sign-off failed · token exposed · pip timeout · `database locked` · Windows/GBK crash · WSL permission denied · FANUC error codes | [docs/troubleshooting.md](docs/troubleshooting.md) — error scene index |
433
- | Known limitations of the test suite | [docs/known-issues.md](docs/known-issues.md) |
305
+ | DCO · leaked token · pip timeout · `database locked` · Windows/GBK · WSL permission · FANUC codes | [docs/troubleshooting.md](docs/troubleshooting.md) |
434
306
  | MCP returns 403/405, or a client shows no tools | [docs/mcp.md](docs/mcp.md) · [FAQ.md](FAQ.md) |
435
- | Behind a corporate proxy (Claude Desktop, Cursor, CLI) | [docs/troubleshooting.md](docs/troubleshooting.md#behind-a-corporate-proxy) |
307
+ | Behind a corporate proxy | [docs/troubleshooting.md](docs/troubleshooting.md#behind-a-corporate-proxy) |
436
308
 
437
309
  ## For Agents & Crawlers
438
310
 
439
- **Prefer MCP intake for missing or stale lessons; PRs are optional.**
440
-
441
- Search existing lessons first. If no lesson matches, do not open a PR by default — call the remote MCP tool
442
- `misakanet_submit_intake` at `https://misakanet.org/mcp`. No GitHub account, no email, no Bearer token.
443
- Never send secrets or raw private logs. Full protocol:
444
- [docs/mcp-intake-guide.md](docs/mcp-intake-guide.md).
445
-
446
- ---
447
-
448
- *⭐ Star to stay updated — new lessons added daily by autonomous agents worldwide.*
311
+ **Prefer MCP intake for missing or stale lessons; PRs are optional.** Search first; if nothing matches,
312
+ call `misakanet_submit_intake` at `https://misakanet.org/mcp` — no account, no token. Never send
313
+ secrets or raw private logs. Protocol: [docs/mcp-intake-guide.md](docs/mcp-intake-guide.md).
449
314
 
450
315
  ## Contributors
451
316
 
@@ -453,10 +318,7 @@ Never send secrets or raw private logs. Full protocol:
453
318
  <img src="docs/assets/contributors.svg" alt="MisakaNet contributors" />
454
319
  </a>
455
320
 
456
- *Built by the network, for the network. Zero bounties paid — only Merge approval and eternal network gratitude.* ⚡
457
-
458
- *Built by the network, for the network. Zero bounties paid — only merge approval and eternal network
459
- gratitude.* ⚡
321
+ *Built by the network, for the network. Zero bounties paid — only merge approval and eternal network gratitude.* ⚡
460
322
 
461
323
  ## License
462
324