feat(server): INGEST_WING_ROUTING wires the Router; remove the classifier path (#208)

Removes the LLM classifier, the substring 'BM25' scorer, the agreement gate,
the backtest and the old migrate/wingmigrate tooling: measured at 2 of 55
pages placed (#208), and the migration was built for the per-wing facts layout
this branch replaces. wing now holds the decision types, the Router and
KnownWings. INGEST_WING_ROUTING=1 builds the Router (default wing
INGEST_DEFAULT_WING=web-clip, client pattern from INGEST_CLIENT_BLOCK or
CLAUDE_INGEST_CLIENT_BLOCK); a bad default or pattern is fatal at startup.
Watcher tests rewritten for the Router, including a deliberate subfolder into
any existing wing, typo'd folders parked, forged-key and edit-while-placing
cases.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-20 20:18:39 +02:00
co-authored by Claude Sonnet 5.5
parent 409b85096b
commit 8988c291ca
20 changed files with 263 additions and 1752 deletions
-20
View File
@@ -100,23 +100,3 @@ func TestClaudeSinkDoesNotWriteThroughASymlinkedArchiveDir(t *testing.T) {
})
}
}
func TestEnvFloat(t *testing.T) {
tests := []struct {
name string
set string
want float64
}{
{"unset falls back", "", 0.9},
{"valid value", "0.75", 0.75},
{"garbage falls back rather than becoming 0", "high", 0.9},
{"out of range is rejected, not clamped silently into auto-placing everything", "-1", 0.9},
{"above one is rejected", "1.5", 0.9},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Setenv("TEST_ENV_FLOAT", tt.set)
assert.InDelta(t, tt.want, envFloat("TEST_ENV_FLOAT", 0.9), 1e-9)
})
}
}