No description
Find a file
Pierre-Olivier Mercier 7567271536 checker: cross-checker observation composition via ReportContext
Add the plumbing that lets a checker receive (at evaluation, report
rendering, and metrics extraction) observations produced by other
checkers on DiscoveryEntry records it originally published.

Surface changes:

  - RelatedObservation struct: one downstream observation, tagged with
    the producing CheckerID and the Ref matching the DiscoveryEntry
    it covers.

  - ObservationGetter gains GetRelated(ctx, key), so rules can opt in
    to cross-checker composition. mapObservationGetter (remote
    /evaluate path) returns empty; the host owns lineage resolution.

  - ReportContext interface: Data() + Related(key). Reporters consume
    it instead of a raw json.RawMessage, which collapses the former
    legacy/Ctx duplicate and gives one uniform signature:

        GetHTMLReport(ctx ReportContext) (string, error)
        ExtractMetrics(ctx ReportContext, t time.Time) ([]CheckMetric, error)

  - NewReportContext(data, related) and StaticReportContext(data) build
    fixed-payload contexts for entry points without an ObservationContext.

  - ExternalReportRequest gains a Related map so the host can ship
    pre-composed lineage to a remote checker over /report. The SDK's
    /report handler threads it through to the reporter via
    NewReportContext, closing the wire gap that previously forced
    remote reports to a StaticReportContext with no related data.

Tests cover the Related map round-trip end-to-end via a peeking provider.
2026-04-22 16:50:59 +07:00
checker checker: cross-checker observation composition via ReportContext 2026-04-22 16:50:59 +07:00
go.mod Initial commit 2026-04-08 00:53:15 +07:00
LICENSE Initial commit 2026-04-08 00:53:15 +07:00
NOTICE Initial commit 2026-04-08 00:53:15 +07:00
README.md Initial commit 2026-04-08 00:53:15 +07:00

checker-sdk-go

Public Go SDK for writing happyDomain checker plugins.

This module provides the stable types, helpers, and HTTP server scaffolding that all checker plugins need, independent of the happyDomain server itself.

Why a separate module?

The happyDomain server is licensed under AGPL-3.0 (with a commercial option). If checkers had to import the server's internal packages, every checker, even trivial ones, would inherit those licensing constraints.

This SDK is released under the Apache License 2.0, so:

  • You can write a checker plugin under any license you want (MIT, Apache, proprietary, AGPL, whatever fits your needs).
  • A plugin built against this SDK is not a derivative work of happyDomain.
  • happyDomain itself depends on this SDK (as an Apache-licensed dependency, which is compatible with AGPL).

Installation

go get git.happydns.org/checker-sdk-go/checker

Getting started

See checker-dummy for a fully working, documented template.

License

Apache License 2.0. See LICENSE and NOTICE.