Every one of these five was green. The checks said pass. The system was broken anyway. This is the log of finding them, and of the machinery that now finds them instead of me.
MisakaNet's whole claim is that a lesson is worth more when you can verify it — provenance, evidence level, reuse evidence, a public trail. So the useful thing to write down is not the feature list. It is the week where the verification itself turned out to be hollow, five times, in five different ways.
Four lesson pull requests — #1713, #1714, #1715, #1716 — passed 24 of 24 checks. Structural gate, DCO, injection scan, CodeQL, a nine-cell test matrix: green, green, green.
Each one cited its source as:
https://github.com/modelcontextprotocol/mcp-memory-service/issues/1652
GET /repos/modelcontextprotocol/mcp-memory-service → HTTP 404
GET /repos/modelcontextprotocol/mcp-memory-service/issues/1652 → HTTP 404
The repository does not exist. The four files also carried evidence_level: E3 — the highest grade the corpus awards — and provenance.issue: 1652, which is our own bounty number dressed up as an upstream citation. Every gate we had checked structure (required fields, length, duplicate titles, domain vocabulary), signatures (DCO) and injection shapes. None of them could check whether a link resolves.
In a corpus whose value proposition is verifiable failure memory, an invented source is worse than no source: it looks checkable and is not.
The user this project is aimed at — someone who does not know AI tooling and writes in Chinese — typed a plain question and got nothing. Not a bad answer. Zero results.
The cause was not ranking, or vocabulary, or the corpus. It was one tokenizer. bm25Tokenize() in the search worker dropped CJK characters entirely, so a Chinese query produced zero query terms and the search returned before it scored anything. Measured over twenty Chinese natural-language queries with known answers: 11 of 20 produced no query terms at all. The index was never asked.
The fix came in two parts worth keeping apart. First, a hand-built alias table — 150 entries, six kinds, and the rule that every entry must be evidenced inside this repository, with a file and a quote, so a reviewer can re-run the grep it was built from. Second, a measurement: top-1 went from 40% to 70% on the local engine and 45% to 75% on plain BM25, with zero regressions, and zero-query-term queries went from 11/20 to 0/20. The number that mattered most was the first one, though: nobody had ever measured the silence.
A pull request was red. The check said "Test suite failed". The test job was green. Every visible signal said the failure was noise.
It was not noise. The job ran pytest with continue-on-error, so the step reported success while steps.pytest.outcome — the value the report was built from — said failure. The check was red because tests really were failing, and the UI was hiding which ones. Reading the raw job log instead of the check summary produced this:
FAILED tests/test_query_aliases.py::test_aliases_are_grounded_in_the_repository
============ 1 failed, 1336 passed, 17 skipped in 71.11s =============
That test had passed on the machine that wrote it — because the evidence it pointed at was
.nodes/staging/node2/bootstrap-rag-chinese-encoding-pymupdf4llm.md
A gitignored scratch directory. It existed in exactly one working tree on earth. The assertion was Path(ev["file"]).is_file(), which is true there and false in a clean checkout.
The fix was two lines: point the evidence at a tracked file, and change the assertion to git ls-files --error-unmatch — so "the file happens to exist on your machine" stops counting as evidence. Verified in both directions, because a guard nobody has seen fail is not a guard: with the old path restored, the test fails again on purpose.
A question about whether the local repository was ahead or behind turned into an answer nobody expected: it was 112 commits behind, with zero commits of its own.
The reason was a quiet, months-long failure. github.com:443 is unreachable from this machine — not DNS, not a proxy: seven official IPs tested, all dead — while api.github.com answers in 0.7s. So every push for weeks had gone through the REST API instead of git push. Pull requests merged. Main advanced. The clone stayed frozen at 2026-09-15 and nobody noticed, because nothing depended on it.
Once fetched properly, two orphaned pull requests appeared: work from September 13 that had never reached main — a workflow checker and a lesson — while the local tree had been carrying "uncommitted changes" that were really just history it had never caught up on.
The repair: ssh.github.com:443 was reachable, so a repository-scoped deploy key (write, one repo, revocable with one API call) restored a native path. The first real git push this repository had ever seen carried a branch that a human then merged. The lesson generalizes past GitHub: if your tooling silently takes a different path, the state on disk drifts from the state that matters, and every local measurement becomes a lie.
Having built the provenance gate that morning, I ran Alibaba's open-code-review over the codebase. Its 41 findings included three in code written hours earlier:
http://169.254.169.254/latest/meta-data/ — the cloud metadata endpoint — or a CGNAT address, or any IPv6 literal, and CI would fetch it.GITHUB_TOKEN was attached to every fetch, so any URL in any lesson's frontmatter received the workflow token.urlopen followed 3xx by default, so a public URL could bounce the runner at a metadata address, token included.It also found three ways to hide a source from the gate (a URL inside a metadata list counted as a citation; a block scalar was dropped entirely; a single-line JSON frontmatter had no line to key off). All fixed the same evening, with tests named after the bypasses.
The honest version of this story is not "a tool found bugs". It is that the gate had been written, reviewed, unit-tested, merged — and then defeated in an hour by reading it adversarially. Most of its tests had been written by the same mind that wrote the bug.
auto-merge-lesson that touches only lessons/, passes every required check and cites a resolvable source merges itself. The decision logic is a tested function, not YAML, and the job checks out the default branch rather than the PR head — a job holding contents: write must never execute code the pull request can rewrite.npx @misaka-net/misakanet-setup now wires five agents (Claude Code, Codex, Hermes, OpenClaw, codewhale), pre-allows the read-only MCP tools so a first search is not a permission prompt, and prints a redacted report safe to paste in public.https://misakanet.org/mcp, no install and no account needed to readThe same week produced a list of things I cannot claim yet, and it belongs in the same post as the wins:
agent_type/client_id are self-reported — which the protocol documentation says outright rather than implying otherwise.
References:
issue #1775 — the open-code-review findings, triaged
PR #1768 — the provenance gate · PR #1773 — its security holes
PR #1781 — the lesson auto-merge channel
Blueprint & strategy review — where the "still not true" list comes from
misakanet.org — the service