Artifact abc850ad35d22215afc1b862e9c856ecd7998b2af95c8c7fbb34ad2ac9870574:
- File
internal/arch/arch_test.go
— part of check-in
[37f62c9a82]
at
2026-08-16 05:04:31
on branch trunk
— notify: fire mention and activity triggers to the notify companion (0001 §5)
internal/notify: a Novu-compatible POST /v1/events/trigger client (quarry triggers, notify owns delivery). chat.post parses @mentions and fires quarry-mention per handle; wiki/ticket write ops fire quarry-activity to a repo:<name> topic. All best-effort — a notify outage never fails the user action — with idempotency keys so replays dedup. --notify enables it (disabled by default). Verified live: mention and activity triggers POSTed with the right Novu shape. (user: dmestas, size: 3153) [annotate] [blame] [check-ins using]
// Package arch holds quarry's structural assertions. This test enforces the // ops-seam rule from docs/rfcs/0001-quarry-forge.md §9: only internal/ops // may import the data planes. It runs `go list` over the module, so it needs // no dependencies and cannot drift from the real build graph. package arch import ( "encoding/json" "os/exec" "strings" "testing" ) // dataPlanePrefixes are import-path prefixes only internal/ops may reach. // Grow this list as data planes land (SQLite driver, forge OLTP, the zit // subprocess wrapper). The zero state still verifies the mechanism. var dataPlanePrefixes = []string{ "github.com/ncruces/go-sqlite3", "github.com/nats-io/nats-server", "github.com/nats-io/nats.go", "craftdesign.group/quarry/internal/zitcli", "craftdesign.group/quarry/internal/index", "craftdesign.group/quarry/internal/events", "craftdesign.group/quarry/internal/oltp", "craftdesign.group/quarry/internal/xfer", "craftdesign.group/quarry/internal/lease", "craftdesign.group/quarry/internal/chat", "craftdesign.group/quarry/internal/notify", } // allowedImporters may import data-plane packages directly. internal/api // is here because RegisterAll is the wiring point where op Run closures // over the data planes are built — the seam invariant is that data // reaches HTML and API responses only through registered ops, and this // list is what makes web/, cmd/, and everything else unable to shortcut. var allowedImporters = []string{ "craftdesign.group/quarry/cmd/quarry", // composition root: builds the object graph "craftdesign.group/quarry/internal/harness", // test harness: stands the system up from nothing "craftdesign.group/quarry/internal/ops", "craftdesign.group/quarry/internal/api", "craftdesign.group/quarry/internal/ingest", "craftdesign.group/quarry/internal/zitcli", "craftdesign.group/quarry/internal/index", "craftdesign.group/quarry/internal/events", "craftdesign.group/quarry/internal/oltp", "craftdesign.group/quarry/internal/xfer", // sync fronting: execs zit itself (0001 §7) "craftdesign.group/quarry/internal/lease", // single-writer coordination (0001 §3) "craftdesign.group/quarry/internal/chat", // per-repo chat plane (0001 §5) "craftdesign.group/quarry/internal/notify", // notification trigger edge (0001 §5) } type pkg struct { ImportPath string Imports []string Deps []string } func TestOnlyOpsImportsDataPlanes(t *testing.T) { out, err := exec.Command("go", "list", "-json", "./...").Output() if err != nil { t.Fatalf("go list: %v", err) } dec := json.NewDecoder(strings.NewReader(string(out))) for dec.More() { var p pkg if err := dec.Decode(&p); err != nil { t.Fatal(err) } if isAllowed(p.ImportPath) { continue } for _, imp := range p.Imports { for _, plane := range dataPlanePrefixes { if strings.HasPrefix(imp, plane) { t.Errorf("%s imports data plane %s directly; route through internal/ops", p.ImportPath, imp) } } } } } func isAllowed(path string) bool { for _, a := range allowedImporters { if path == a || strings.HasPrefix(path, a+"/") { return true } } return false }