The 5-loop substrate's load-bearing gate is verified — playbook +
matrix indexer give the results we're looking for. Per the report's
rubric, lift ≥ 50% of discoveries means matrix is doing real work;
7/8 = 87.5% blew through that.
Harness was structurally hiding bugs behind a 5-daemon stripped boot.
Expanding to the full 10-daemon prod stack surfaced 7 fixes in cascade:
1. driver→matrixd: {"query": ...} → {"query_text": ...} field name
2. harness temp toml missing [s3] → wrong default bucket → catalogd
rehydrate 500 on first call
3. harness→queryd SQL probe: {"q": ...} → {"sql": ...} field name
4. expand boot from 5 → 10 daemons in dep-ordered launch
5. add SQL surface probe (3-row CSV ingest → COUNT(*)=3 assertion)
6. candidates corpus was synthetic SWE-tech (Swift/iOS, Scala/Spark) —
wrong domain for staffing queries; replaced with ethereal_workers
(10K rows, real staffing schema, "e-" id prefix to avoid collision
with workers' "w-"). staffing_workers driver gains -index-name +
-id-prefix flags so the same binary serves both corpora
7. local_judge qwen3.5:latest is a vision-SSM 256K-ctx build running
~30s per judge call against the lift loop; reverted to
qwen2.5:latest (~1s/call, 30× faster, held lift theory)
Each contract drift (1, 3) is now locked into a cmd/<bin>/main_test.go
so future drift fires in `go test`, not in a reality run. R-005 closed:
- cmd/matrixd/main_test.go (new) — playbook record drift detector +
score bounds + 6 routes mounted
- cmd/queryd/main_test.go — wrong-field-name drift detector
- cmd/pathwayd/main_test.go (new) — 9 routes + add round-trip + retire
- cmd/observerd/main_test.go (new) — 4 routes + invalid-op + unknown-mode
`go test ./cmd/{matrixd,queryd,pathwayd,observerd}` all green.
Reality test results (reports/reality-tests/playbook_lift_001.{json,md}):
Queries 21 (staffing-domain, 7 categories)
Discoveries 8 (judge ≠ cosine top-1)
Lifts 7/8 (87.5%)
Boosts triggered 9
Mean Δ distance -0.053 (warm closer than cold)
OOD honesty dental/RN/SWE rated 1, no fake matches
Cross-corpus boosts confirmed (e- ↔ w- swaps in lifts)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
105 lines
3.1 KiB
Go
105 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
|
|
"git.agentview.dev/profit/golangLAKEHOUSE/internal/observer"
|
|
"git.agentview.dev/profit/golangLAKEHOUSE/internal/workflow"
|
|
)
|
|
|
|
// newTestRouter builds the observerd router with an in-memory store
|
|
// and a workflow runner with no modes registered. Closes R-005 for
|
|
// observerd.
|
|
func newTestRouter(t *testing.T) http.Handler {
|
|
t.Helper()
|
|
h := &handlers{
|
|
store: observer.NewStore(nil),
|
|
runner: workflow.NewRunner(),
|
|
}
|
|
r := chi.NewRouter()
|
|
h.register(r)
|
|
return r
|
|
}
|
|
|
|
func TestRoutesMounted(t *testing.T) {
|
|
r := newTestRouter(t)
|
|
want := map[string]bool{
|
|
"GET /observer/stats": false,
|
|
"POST /observer/event": false,
|
|
"POST /observer/workflow/run": false,
|
|
"GET /observer/workflow/modes": false,
|
|
}
|
|
router := r.(chi.Router)
|
|
_ = chi.Walk(router, func(method, route string, _ http.Handler, _ ...func(http.Handler) http.Handler) error {
|
|
key := method + " " + route
|
|
if _, ok := want[key]; ok {
|
|
want[key] = true
|
|
}
|
|
return nil
|
|
})
|
|
for k, mounted := range want {
|
|
if !mounted {
|
|
t.Errorf("route not mounted: %s", k)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStats_GET(t *testing.T) {
|
|
r := newTestRouter(t)
|
|
req := httptest.NewRequest("GET", "/observer/stats", nil)
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("expected 200, got %d", w.Code)
|
|
}
|
|
}
|
|
|
|
func TestWorkflowModes_GET(t *testing.T) {
|
|
r := newTestRouter(t)
|
|
req := httptest.NewRequest("GET", "/observer/workflow/modes", nil)
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("expected 200, got %d", w.Code)
|
|
}
|
|
}
|
|
|
|
// TestEvent_InvalidOp locks the validation path: an ObservedOp with
|
|
// missing required fields must 400, not 500. Without this assertion,
|
|
// observer.ErrInvalidOp could silently slip into the 500 branch on a
|
|
// future refactor and clients would see "internal" instead of the
|
|
// actual validation error.
|
|
func TestEvent_InvalidOp(t *testing.T) {
|
|
r := newTestRouter(t)
|
|
// Empty body — no endpoint, no source — fails ObservedOp validation.
|
|
body := []byte(`{}`)
|
|
req := httptest.NewRequest("POST", "/observer/event", bytes.NewReader(body))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
if w.Code != http.StatusBadRequest {
|
|
t.Errorf("expected 400 on invalid op, got %d (body=%s)", w.Code, w.Body.String())
|
|
}
|
|
}
|
|
|
|
// TestWorkflowRun_UnknownMode locks the 400 path on workflow definitions
|
|
// that reference modes not registered with the runner. The harness's
|
|
// reality test runs depend on this so an unknown-mode misconfiguration
|
|
// surfaces as a definition error, not a server error.
|
|
func TestWorkflowRun_UnknownMode(t *testing.T) {
|
|
r := newTestRouter(t)
|
|
body := []byte(`{"workflow":{"name":"t","nodes":[{"id":"n1","mode":"does.not.exist"}]}}`)
|
|
req := httptest.NewRequest("POST", "/observer/workflow/run", bytes.NewReader(body))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
if w.Code != http.StatusBadRequest {
|
|
t.Errorf("expected 400 on unknown mode, got %d (body=%s)", w.Code, w.Body.String())
|
|
}
|
|
}
|