Extraction/canonicalization mass-attaches spurious [[mission]] link to unrelated tunnel-candidates notes #88
Closed
opened 2026-07-26 21:12:31 +00:00 by mathias
·
1 comment
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#88
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
4 separate, topically-unrelated notes each got a
[[mission]]link (→wiki/telos/decisions/mission.md) added with zero real connection:wiki/sources/tunnel-candidates-2026-07-19.md,-07-20.md,-07-22.md,-07-25.md— SSO decisions, BGP tunnel notes, security allowlist comparisons, none about TELOS mission.Local-LLM semantic-relevance check flagged all 4 independently as hallucinated/no topical connection. Same target, same source-note type, recurring — one systemic cause, not 4 independent hallucinations.
Where to look
Two candidate mechanisms in
ingestion/internal/pipeline/:links.go'sCanonicalizeLinks— if the LLM output a bare[[mission]](plain-link form) as a generic/filler mention,canonicalizeContent's title-lookup would resolve it against the inventory's "Mission" title and silently canonicalize it into a real link, rather than questioning whether the mention belongs there at all.schema.md/BuildPrompt) — if the schema's example output or instructions make "mission" look like a default/expected related-concept slot, the LLM may be pattern-matching it in from few-shot bias ontunnel-candidates-shaped inputs specifically.Scope
Acceptance criteria
tunnel-candidates-*-shaped fixture with no mission-related content does not get[[mission]]attached.Root cause was neither of the two mechanisms this issue named. Investigated both directly:
[[Mission]]becausewiki/concepts/mission.mdgenuinely exists as a concept page titled "Mission." Not a bug; it did its job.systemPrompt/BuildPrompt.Actual mechanism, found by tracing where these
tunnel-candidates-*.mdnotes come from: they're not normal ingested sources — they'reinternal/brain/tunnel.go'sAutoTunnel/DetectTunnelsoutput.DetectTunnelsdoes a naive case-insensitive whole-word substring match of every wiki note's title against source content; "Mission" (a generic English word) fuzzy-matches unrelated content constantly, and those fuzzy (non-exact) matches get logged tobrain/raw/tunnel-candidates-YYYY-MM-DD.mdas a human-review queue (brain_tunnelto promote).The bug:
internal/watcher/watcher.go'sprocessDirwalksbrain/raw/and feeds every.mdfile to the LLM extraction pipeline — with no exclusion fortunnel-candidates-*.md. So the watcher re-ingested AutoTunnel's own review-queue file as if it were external source material. The LLM, reading a log that literally contains(term: "mission")entries, reasonably surfaced "mission" as a term in its summary — which CanonicalizeLinks then correctly turned into a real link, because it correctly is a real page, just not a relevant one.Fixed in hyperguild@f005548:
processDirnow skipstunnel-candidates-*filenames, mirroring the exclusionapi.ListPendingalready applied. Regression test reproduces the original bug (asserts the LLMCompletefunc is never called for a tunnel-candidates file) and confirms the fix.Removed the 4 existing bad links in
mathias/brain@95af3b7— de-linked "mission" to plain text with a note explaining the fuzzy match, and trimmed one derivative hallucinated sentence in the 07-25 note that asserted a "broader mission" connection built on the bad link.