From 049c941cebe7e55b8cb0c207b9820da1396e09fc Mon Sep 17 00:00:00 2001 From: Tri Lam Date: Sun, 31 May 2026 01:55:28 -0700 Subject: [PATCH 1/3] =?UTF-8?q?feat(pivot):=20PR-I.1a=20=E2=80=94=20in-rep?= =?UTF-8?q?o=20Go=20submodule=20scaffold=20at=20module/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Empty submodule (module/go.mod declaring module path on go 1.26.3 — no source files yet) plus root go.work listing `.` and `./module` so dev builds resolve both modules without publishing. Per RFC-0013 §migration PR-I.1a: scaffolding only, no file movement. The `module/v0.0.1` genesis tag will be cut after merge to validate the publish path (Go module proxy can resolve the empty submodule) before any real code moves in PR-I.1b. Side-effects required to keep CI green side-by-side: - .gitignore un-ignores go.work (the workspace file is committed now; go.work.sum stays ignored as a per-environment cache). - Makefile `build` target sets GOWORK=off for the OCB invocation. OCB generates ./_build/{go.mod,main.go} and runs `go build` from inside ./_build/. With workspace mode active, that inner build tries to resolve ./_build as a package of the root module (since the workspace lists `.`) and fails with "main module does not contain package github.com/tracecoreai/tracecore/_build". The generated module is intentionally non-workspace; isolate it. - go.work carries a replace directive for google.golang.org/genproto. viper@v1.12.0 (transitive dep of the golangci-lint tool chain) pulls the old monolithic google.golang.org/genproto which provides googleapis/rpc/status — a path now owned by the split-out google.golang.org/genproto/googleapis/rpc that grpc-go imports. Workspace mode unifies these two providers and surfaces an ambiguous-import build error that single-module mode (GOWORK=off) prunes away via MVS. The replace points the workspace at a recent monolithic-genproto tag that no longer ships the conflicting path. GOWORK=off builds ignore the block entirely. - builder-config.yaml gains commented-out skeleton entries for the future receivers / processors / replaces lines that PR-I.1b and PR-I.2 will uncomment — keeps those PRs mechanical (no indentation or module-path typo risk). Verification (all under workspace mode): - `go build ./...` — clean - `go vet ./...` — clean - `go test ./components/... ./internal/... ./pkg/... ./tools/...` — pass - `make check` (fmt + tidy-check + lint + vet + mod-verify) — clean - `make verify` (check + license + build-tags + doc-check + zizmor + ...) — clean - `make build` (OCB) — produces ./_build/tracecore Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Tri Lam --- .gitignore | 7 ++++++- CHANGELOG.md | 2 ++ Makefile | 9 ++++++++- builder-config.yaml | 24 ++++++++++++++++++++++-- go.work | 27 +++++++++++++++++++++++++++ module/README.md | 36 ++++++++++++++++++++++++++++++++++++ module/go.mod | 3 +++ 7 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 go.work create mode 100644 module/README.md create mode 100644 module/go.mod diff --git a/.gitignore b/.gitignore index e1745aa4..20e959c3 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,12 @@ coverage.txt __debug_bin* # Go workspace -go.work +# RFC-0013 PR-I.1a (2026-05-31): go.work is committed because the in-repo +# Go submodule under module/ requires workspace mode to resolve locally +# during dev builds. go.work.sum stays ignored — it is a per-environment +# cache equivalent to go.sum but for workspace-resolved transitive deps, +# and would create cross-platform churn without adding integrity value +# (each module's own go.sum already pins its direct + transitive deps). go.work.sum # IDE diff --git a/CHANGELOG.md b/CHANGELOG.md index 684f0477..245da776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ Build-tag `dcgm` retired (`make build-tags` no longer vets `-tags dcgm`). `make **PR-J landed: four receiver-side integration recipes for the v0.2.0 swap.** New docs ship under `docs/integrations/`: [`filelog-container.md`](docs/integrations/filelog-container.md) (replaces `containerstdout` — `filelogreceiver` with the container parser stanza, `k8sattributesprocessor`, and `file_storage` for restart-safe checkpoints), [`journald-kernel.md`](docs/integrations/journald-kernel.md) (replaces `kernelevents` — `journaldreceiver` + `filelogreceiver` on `/dev/kmsg` + OTTL `transform` that preserves the customer-stable `kernelevents.xid` and `gpu.id` attributes from RFC-0013 §3), [`k8sobjects-events.md`](docs/integrations/k8sobjects-events.md) (replaces `k8sevents` — `k8sobjectsreceiver` watch mode + OTTL `transform` that derives the eleven-entry `k8s.event.hint` enum), and [`prometheus-scrape.md`](docs/integrations/prometheus-scrape.md) (replaces `dcgm` + `kueue` — generic `prometheusreceiver` scrape with the four GPU vendor exporters tabulated and an OTTL stamp of the `gpu.vendor` resource attribute). Every recipe ships a matching `docs/integrations/examples/*.yaml` validated end-to-end by `make validator-recipe` against the OCB-built `./_build/tracecore validate`. The k8sobjects recipe introduces a new `` marker recognized by both `scripts/doc-check.sh` (accepted) and `scripts/validator-recipe.sh` (skipped with a named log line) because the upstream `k8sobjectsreceiver`'s `Validate()` enumerates server-preferred resources via the discovery client and therefore cannot be exercised offline — its example is gated by the kind-cluster job that runs the chart. Updates `docs/migration/v0.1-to-v0.2.md` to flip the PR-J open-item to done with file pointers. CHANGELOG only — no operator-visible runtime change; v0.2.0 release still gates on PR-K (in-tree-receiver deletion) and PR-L (final migration guide body). +**PR-I.1a landed: in-repo Go submodule scaffold at `module/`.** Empty submodule (`module/go.mod` declaring `module github.com/tracecoreai/tracecore/module` on `go 1.26.3` — no source files yet) plus root `go.work` listing `.` and `./module` so dev builds resolve both modules without publishing. The `module/v0.0.1` genesis tag will be cut after merge to validate the publish path (Go module proxy can resolve the empty submodule) before any real code moves in PR-I.1b. No file movement and no behaviour change in this PR; the OCB binary at `./_build/tracecore` and `go build ./...` / `go vet ./...` / `go test ./...` all stay green side-by-side. Two side-effects: `.gitignore` un-ignores `go.work` (the workspace file is now committed; `go.work.sum` stays ignored as a per-environment cache); `make build` sets `GOWORK=off` for the OCB invocation because the builder generates `./_build/{go.mod,main.go}` and runs `go build` from inside `./_build/` — workspace mode would try to resolve `./_build` as a package of the root module (since the workspace lists `.`) and fails with "main module does not contain package github.com/tracecoreai/tracecore/_build". `builder-config.yaml` gains a commented-out skeleton for the future `receivers:` / `processors:` / `replaces:` entries that PR-I.1b and PR-I.2 will uncomment — keeping the wiring as YAML now makes those PRs mechanical (no indentation / module-path typo risk). `go.work` carries a `replace google.golang.org/genproto => ...v0.0.0-20240227224415-6ceb2ff114de` directive to disambiguate the workspace's package graph — viper@v1.12.0 (transitive dep of the golangci-lint tool chain) pulls the old monolithic `google.golang.org/genproto` which provides `googleapis/rpc/status`, a path now owned by the split-out `google.golang.org/genproto/googleapis/rpc` that grpc-go imports. Single-module mode prunes the conflict via MVS; workspace mode surfaces it as an ambiguous-import build error. The replace points the workspace at a recent monolithic-genproto tag that no longer ships the conflicting path; `GOWORK=off` builds ignore the block entirely. + **PR-E unblocked.** Original RFC-0013 §migration plan named `telemetrygeneratorreceiver` as the upstream replacement for `clockreceiver`. Verified 2026-05-30: the receiver does not exist in `opentelemetry-collector-contrib` at any tag from v0.95.0 through v0.130.0; two community proposals (contrib issues #41687 and #43657) were closed `not_planned`. Replacement landed on `hostmetricsreceiver` (loadscraper @ 1s) — an upstream OCB-bundled receiver that emits 3 low-cardinality series (`system.cpu.load_average.{1m,5m,15m}`) at the cadence the bench's pass condition needs (first parseable JSON line at the sink — see `bench/install/run.sh`). This PR adds `hostmetricsreceiver` to `builder-config.yaml`, adds a `receivers.hostmetrics` opt-in block to the chart values (default disabled — chart default stays `clockreceiver` this release), and flips `bench/install/tracecore-values.yaml` to enable hostmetrics + disable clockreceiver. RFC-0013 §migration PR-E + §4 + §7 deletion table updated. Chart-default flip from `clockreceiver` to `hostmetrics` + source-deletion of `components/receivers/clockreceiver/` are deferred to PR-K (in-tree-receiver deletion wave) so the values-keys migration ships together with `NOTES.txt` deprecation warnings and the coordinated migration of ~92 in-tree test-fixture references in one cut rather than two operator-visible changes. Remaining v0.1.0 work: PR-F.1 (delete `components/receivers/dcgm/` + `pkg/dcgm/` + `internal/selftelemetry/` + `internal/telemetry/`) landed in this Unreleased section; PR-F.2 (delete `internal/componentstatus/`) deferred until `internal/pipeline` migrates to upstream `componentstatus`. Chart default pipeline still hardwires the to-be-deleted receivers, so the receiver-side deletions (clockreceiver / containerstdout / kernelevents / k8sevents) ride with PR-K alongside the v0.2.0 recipe migration to avoid an interim chart break. diff --git a/Makefile b/Makefile index f5c9053a..e74d5d96 100644 --- a/Makefile +++ b/Makefile @@ -36,8 +36,15 @@ build: ## Build tracecore via OpenTelemetry Collector Builder using builder-con @# it with the target GOOS/GOARCH preserved -- the builder's inner @# `go build` inherits those and produces a target-arch binary. @# GOBIN keeps the install local + deterministic; PATH-independent. + @# GOWORK=off isolates OCB from the root go.work (RFC-0013 PR-I.1a): + @# OCB generates ./_build/{go.mod,main.go} and runs `go build` from + @# inside ./_build/. With workspace mode active, that inner build + @# tries to resolve ./_build as a package of the root module (since + @# the workspace lists `.`) and fails with "main module does not + @# contain package github.com/tracecoreai/tracecore/_build". The + @# generated module is intentionally non-workspace; isolate it. GOOS= GOARCH= GOBIN=$(CURDIR)/_build/.tools go install go.opentelemetry.io/collector/cmd/builder@v0.110.0 - $(CURDIR)/_build/.tools/builder --config=builder-config.yaml + GOWORK=off $(CURDIR)/_build/.tools/builder --config=builder-config.yaml test: ## Run unit tests with the race detector. go test -race ./... diff --git a/builder-config.yaml b/builder-config.yaml index f1c3dcb1..025f7dba 100644 --- a/builder-config.yaml +++ b/builder-config.yaml @@ -44,5 +44,25 @@ extensions: - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.110.0 - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.110.0 -# tracecoreai/tracecore-components/{receiver/ncclfrreceiver,processor/rankjoinprocessor,processor/patterndetectorprocessor} -# add in PR-I (v0.2.0) after the separate module repo is created. +# RFC-0013 PR-I.1a (2026-05-31): scaffold the in-repo Go submodule under +# module/ — empty in this PR. PR-I.1b will `git mv` nccl_fr → +# module/receiver/ncclfrreceiver/ and add the `receivers:` entry plus +# the `replaces:` block below (uncomment, no other change). PR-I.2 adds +# the two processor entries. Keeping the wiring as commented YAML now +# makes PR-I.1b / PR-I.2 mechanical (delete the comment prefix; no risk +# of mis-indented yaml or typo'd module path). Supersedes the prior +# "separate module repo" plan — see RFC-0013 §migration line 246 for +# the in-repo-submodule rationale (one fork, one CI, one DCO). +# +# receivers (add to the block above, NOT here): +# - gomod: github.com/tracecoreai/tracecore/module/receiver/ncclfrreceiver v0.1.0 +# +# processors (add to the block above at PR-I.2): +# - gomod: github.com/tracecoreai/tracecore/module/processor/rankjoinprocessor v0.1.0 +# - gomod: github.com/tracecoreai/tracecore/module/processor/patterndetectorprocessor v0.1.0 +# +# replaces: +# # Resolve the submodule against the in-repo checkout during dev / +# # release-tag-cut builds. Required because module/vX.Y.Z is not +# # published to a proxy — OCB would fail to fetch otherwise. +# - github.com/tracecoreai/tracecore/module => ./module diff --git a/go.work b/go.work new file mode 100644 index 00000000..1b66dede --- /dev/null +++ b/go.work @@ -0,0 +1,27 @@ +// RFC-0013 PR-I.1a (2026-05-31): root go.work pinning the in-repo Go +// submodule under module/ alongside the root module. Required because +// module/vX.Y.Z is not published to a proxy during PR-I.1a — local dev +// builds resolve module/ → ./module via this workspace file. OCB picks +// the same resolution up from builder-config.yaml's `replaces: ./module` +// entry (added in PR-I.1b alongside the first `receivers:` entry). +// +// The Go directive matches go.mod and module/go.mod exactly. workspace +// mode requires go.work's `go` directive be >= every member module's. +go 1.26.3 + +use ( + . + ./module +) + +// RFC-0013 PR-I.1a (2026-05-31): exclude old monolithic genproto from the +// workspace graph. Required because viper@v1.12.0 (transitive dep of +// golangci-lint tool chain) pulls google.golang.org/genproto@v0.0.0-20220519 +// which provides googleapis/rpc/status — a path now owned by the split-out +// google.golang.org/genproto/googleapis/rpc submodule that grpc-go imports. +// Workspace mode unifies these two providers and surfaces an ambiguous-import +// build error that single-module mode (GOWORK=off) prunes away via MVS. +// Replacing to a recent monolithic-genproto tag that no longer ships the +// path keeps the workspace graph unambiguous. No effect on single-module +// builds; GOWORK=off ignores this block. +replace google.golang.org/genproto => google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de diff --git a/module/README.md b/module/README.md new file mode 100644 index 00000000..012c28d8 --- /dev/null +++ b/module/README.md @@ -0,0 +1,36 @@ +# `module/` — TraceCore moat Go submodule + +This directory is a separate Go module from the repo root. Its module path +is `github.com/tracecoreai/tracecore/module`, and it is published via tags +of the form `module/vX.Y.Z` (Go submodule prefix). + +## Status + +PR-I.1a (this PR) ships the **empty scaffold only**: `module/go.mod` declaring +the module path, and a root `go.work` so dev builds resolve both modules +without publishing. No code lives here yet. + +After this PR merges, the tag `module/v0.0.1` is cut as the genesis tag +to validate the publish path (the empty submodule resolves through the Go +module proxy) before any real code moves in subsequent PRs. + +## Roadmap + +Per RFC-0013 §migration: + +- **PR-I.1b** — `git mv components/receivers/nccl_fr` → `module/receiver/ncclfrreceiver/` + and `git mv pkg/nccl/fr_parser` → `module/pkg/nccl/fr_parser/`. Renames the + Go package `nccl_fr` → `ncclfrreceiver`. No new tag (next bump is PR-I.2). +- **PR-I.2** — adds `module/processor/rankjoinprocessor/` and + `module/processor/patterndetectorprocessor/` net-new. Tags `module/v0.1.0`. + +## Why an in-repo submodule (not an external repo) + +Single fork, one CI, one issue tracker, one DCO, one PR for cross-cutting +changes. Go submodule tags give an independent version line for the moat +components without the operational cost of a second repository. OCB's +`gomod:` resolves in-repo submodules identically to external repos via the +`replaces: ./module` entry in `builder-config.yaml`. + +See [RFC-0013 §migration PR-I](../docs/rfcs/0013-distro-first-pivot.md) for +the full rationale. diff --git a/module/go.mod b/module/go.mod new file mode 100644 index 00000000..55e23612 --- /dev/null +++ b/module/go.mod @@ -0,0 +1,3 @@ +module github.com/tracecoreai/tracecore/module + +go 1.26.3 From 21efcb6c639ecfa43e27096630e7b12983e705aa Mon Sep 17 00:00:00 2001 From: Tri Lam Date: Sun, 31 May 2026 02:00:11 -0700 Subject: [PATCH 2/3] docs(pr-i-1a): expand go.work genproto-replace root-cause comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-PR-open self-review surfaced that the prior comment named the symptom ("viper pulls old genproto") but not the deeper root cause. Replaces it with: - The grpc-go import path that triggers the collision, with both module versions that provide it. - The Go-internal reason workspace mode shows the conflict and single- module mode hides it (MVS pruning gap). - The "why not bump viper" cul-de-sac (golangci-lint v2.12.2, the latest at time of PR, still pins viper@v1.12.0 — verified by running `go get golangci-lint@v2.12.2 && go mod tidy && go vet ./...` in this worktree before reverting; the conflict re-surfaced). - The cleanup trigger that retires the replace. No code change. CI behaviour identical. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Tri Lam --- go.work | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/go.work b/go.work index 1b66dede..deb5247a 100644 --- a/go.work +++ b/go.work @@ -14,14 +14,33 @@ use ( ./module ) -// RFC-0013 PR-I.1a (2026-05-31): exclude old monolithic genproto from the -// workspace graph. Required because viper@v1.12.0 (transitive dep of -// golangci-lint tool chain) pulls google.golang.org/genproto@v0.0.0-20220519 -// which provides googleapis/rpc/status — a path now owned by the split-out -// google.golang.org/genproto/googleapis/rpc submodule that grpc-go imports. -// Workspace mode unifies these two providers and surfaces an ambiguous-import -// build error that single-module mode (GOWORK=off) prunes away via MVS. -// Replacing to a recent monolithic-genproto tag that no longer ships the -// path keeps the workspace graph unambiguous. No effect on single-module -// builds; GOWORK=off ignores this block. +// RFC-0013 PR-I.1a (2026-05-31): redirect the old monolithic genproto +// in the workspace graph to a tag that no longer ships googleapis/rpc/status. +// +// Root cause: google.golang.org/grpc@v1.81.1's status package imports +// google.golang.org/genproto/googleapis/rpc/status. That path lives in +// the split-out google.golang.org/genproto/googleapis/rpc submodule +// (current tag v0.0.0-20260526163538-3dc84a4a5aaa) AND, historically, in +// google.golang.org/genproto@v0.0.0-20220519153652-3a47de7e79bd (the last +// monolithic-genproto release before the split). Two modules provide the +// same import path -> ambiguous-import build error. +// +// Why workspace mode trips on it but single-module mode doesn't: Go's +// module loader prunes transitive indirect deps under MVS in single-module +// mode (GOWORK=off), and the old monolithic genproto sits behind a viper +// transitive that no live import path touches -> it gets pruned. Workspace +// mode (Go 1.18+) loads the union of every member module's require lines +// without that pruning step, so the old monolithic genproto survives into +// the package-load phase and collides with the split-out submodule. +// +// Why not "just bump viper": viper@v1.12.0 is the dep that pulls the old +// monolithic genproto, and it's pinned by the golangci-lint v2 module +// (verified 2026-05-31 — even v2.12.2, the latest, still pins viper v1.12.0). +// We don't import viper directly; bumping it would require forking +// golangci-lint or waiting for upstream. The redirect here is the smallest +// in-tree fix that keeps workspace mode usable today. +// +// No effect on single-module builds; GOWORK=off ignores this block. The +// redirect can be removed once golangci-lint's viper pin moves past the +// pre-split genproto era (track upstream golangci-lint go.mod). replace google.golang.org/genproto => google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de From d2ef9205b5f9a3d4ef16ea2bc1ae191fe8b413e7 Mon Sep 17 00:00:00 2001 From: Tri Lam Date: Sun, 31 May 2026 02:10:27 -0700 Subject: [PATCH 3/3] fix(pr-i-1a): root-level replaces: + module/doc.go for proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two reviewer findings on PR #214: 1. builder-config.yaml: the commented `replaces:` skeleton was already at root-level indentation (zero indent, sibling to `dist:` / `receivers:` / `processors:` / `exporters:` / `extensions:`), which matches OCB v0.110.0 schema (`cmd/builder/internal/builder/config.go` declares `Config.Replaces []string \`mapstructure:"replaces"\``) and the canonical upstream pattern in `opentelemetry-collector-releases/distributions/otelcol-contrib/ manifest.yaml` (replaces: as the final root-level block after all component lists). Expand the comment to document this placement decision so PR-I.1b's uncomment is unambiguously byte-clean. 2. module/doc.go: add a doc.go stub so `module/v0.0.1` (genesis tag cut after PR-I.1a merges) resolves through the Go module proxy. Proxies typically require at least one .go file in the module root — without doc.go, a `go list -m github.com/tracecoreai/tracecore/module@v0.0.1` fetch through `proxy.golang.org` may fail and break the PR-I.1b release-tag workflow. Verified: `go list ./module/...` → `github.com/tracecoreai/tracecore/module`, `go vet ./module/...` clean, `make check` + `make build` + `go test ./...` green. Per RFC-0013 design-review root-cause discipline: fix proxy + schema documentation risks at scaffold time, not post-PR-I.1b failure. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Tri Lam --- builder-config.yaml | 16 +++++++++++++--- module/doc.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 module/doc.go diff --git a/builder-config.yaml b/builder-config.yaml index 025f7dba..b9326719 100644 --- a/builder-config.yaml +++ b/builder-config.yaml @@ -47,20 +47,30 @@ extensions: # RFC-0013 PR-I.1a (2026-05-31): scaffold the in-repo Go submodule under # module/ — empty in this PR. PR-I.1b will `git mv` nccl_fr → # module/receiver/ncclfrreceiver/ and add the `receivers:` entry plus -# the `replaces:` block below (uncomment, no other change). PR-I.2 adds +# uncomment the `replaces:` block below (no other change). PR-I.2 adds # the two processor entries. Keeping the wiring as commented YAML now # makes PR-I.1b / PR-I.2 mechanical (delete the comment prefix; no risk # of mis-indented yaml or typo'd module path). Supersedes the prior # "separate module repo" plan — see RFC-0013 §migration line 246 for # the in-repo-submodule rationale (one fork, one CI, one DCO). # -# receivers (add to the block above, NOT here): +# receivers (add to the `receivers:` block above, NOT here): # - gomod: github.com/tracecoreai/tracecore/module/receiver/ncclfrreceiver v0.1.0 # -# processors (add to the block above at PR-I.2): +# processors (add to the `processors:` block above at PR-I.2): # - gomod: github.com/tracecoreai/tracecore/module/processor/rankjoinprocessor v0.1.0 # - gomod: github.com/tracecoreai/tracecore/module/processor/patterndetectorprocessor v0.1.0 # +# The `replaces:` block below is at ROOT level (zero indent — sibling +# to `dist:`, `receivers:`, `processors:`, `exporters:`, `extensions:`), +# matching the OCB v0.110.0 schema (cmd/builder/internal/builder/config.go +# `Config.Replaces []string \`mapstructure:"replaces"\``) and the canonical +# upstream pattern in opentelemetry-collector-releases' +# `distributions/otelcol-contrib/manifest.yaml`, which places `replaces:` +# as the final root-level block after all component lists. Uncommenting +# in PR-I.1b is byte-clean: strip the `# ` prefix from the four lines +# below; indentation already matches root level. +# # replaces: # # Resolve the submodule against the in-repo checkout during dev / # # release-tag-cut builds. Required because module/vX.Y.Z is not diff --git a/module/doc.go b/module/doc.go new file mode 100644 index 00000000..d6d620f8 --- /dev/null +++ b/module/doc.go @@ -0,0 +1,14 @@ +// Copyright TraceCore Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package module hosts the in-repo Go submodule for receivers/processors/exporters +// moved out of the root module per RFC-0013. Contents land in PR-I.1b (nccl_fr move) +// and PR-I.2 (rankjoinprocessor + patterndetectorprocessor). +// +// This file exists so that `module/v0.0.1` (the genesis tag cut after PR-I.1a +// merges) resolves through the Go module proxy — proxies typically require at +// least one .go file in the module root to validate the module and surface it +// in `go list`. Without it, `GOPROXY=https://proxy.golang.org go list -m +// github.com/tracecoreai/tracecore/module@v0.0.1` may fail with a 404 or +// "no Go source files" error, breaking the PR-I.1b release-tag-cut workflow. +package module