Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ $DotNetChannel = "STS"
$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1
$env:DOTNET_NOLOGO = 1
$env:DOTNET_ROLL_FORWARD = "Major"
$env:FALLOUT_TELEMETRY_OPTOUT = 1

###########################################################################
# EXECUTION
Expand Down
1 change: 0 additions & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ DOTNET_CHANNEL="STS"
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_NOLOGO=1
export DOTNET_ROLL_FORWARD="Major"
export FALLOUT_TELEMETRY_OPTOUT=1

###########################################################################
# EXECUTION
Expand Down
3 changes: 0 additions & 3 deletions build/Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,6 @@ from framework in project.GetTargetFrameworks()
[Parameter]
public int TestDegreeOfParallelism { get; } = 1;

Configure<DotNetTestSettings> ITest.TestSettings => _ => _
.SetProcessEnvironmentVariable("FALLOUT_TELEMETRY_OPTOUT", bool.TrueString);

Target ITest.Test => _ => _
.Inherit<ITest>()
.Partition(2);
Expand Down
1 change: 0 additions & 1 deletion build/_build.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
<RootNamespace></RootNamespace>
<NoWarn>CS0649;CS0169</NoWarn>
<FalloutRootDirectory>.\..</FalloutRootDirectory>
<FalloutTelemetryVersion>1</FalloutTelemetryVersion>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
<IsPackable>false</IsPackable>
</PropertyGroup>
Expand Down
84 changes: 0 additions & 84 deletions docs/01-getting-started/07-telemetry.md

This file was deleted.

2 changes: 1 addition & 1 deletion docs/02-fundamentals/04-builds.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ You can examine the status of targets by using any of the appropriate `ICollecti

## Build Events

For implementing cross-cutting concerns, like telemetry and similar, you can hook into various build events:
For implementing cross-cutting concerns, like logging or notifications, you can hook into various build events:

```csharp title="FalloutBuild.cs"
abstract class FalloutBuild
Expand Down
72 changes: 72 additions & 0 deletions docs/adr/0010-no-telemetry-collection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# ADR-0010 — Fallout collects no telemetry

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 Those are quite verbose for my taste


- **Status:** Accepted
- **Date:** 2026-07-24
- **Deciders:** Fallout maintainers
- **Relates to:** [#79](https://github.com/Fallout-build/Fallout/issues/79) (drop the dead `Microsoft.ApplicationInsights` dependency — subsumed by this decision), the removed `docs/01-getting-started/07-telemetry.md`.

## Context

NUKE shipped a telemetry subsystem (added upstream in 2021): a `[Telemetry]` build extension plus global-tool hooks that gathered anonymous usage data — OS/SDK versions, build shape (target/component counts), hashed repo/commit fingerprints — and sent it to an **Azure Application Insights** instance owned personally by the original maintainer, behind a first-run disclosure/consent flow and a `NUKE_TELEMETRY_OPTOUT` opt-out.

Fallout inherited all of it, but it has been **inert since the fork**:

- The Application Insights instrumentation key was matkoch-owned and cannot be reused, so `Microsoft.ApplicationInsights` was dropped from dependencies ([#79](https://github.com/Fallout-build/Fallout/issues/79)) and `TrackEvent` became a stub that discards its inputs.
- The static constructor short-circuits before the consent flow ever runs — no disclosure prompt, no awareness cookie.
- Nothing is collected and nothing is transmitted anywhere.

The scaffolding was nonetheless **kept on purpose**, on the stated intent of wiring up a "Fallout-controlled backend later." That intent never acquired an owner, an endpoint, or a concrete plan — it was a standing *maybe*. Meanwhile the dormant code was a liability: it still assembled usage properties on the hot build path, it carried a re-enable comment that invited someone to flip it back on, and it kept a consumer-facing surface (`FALLOUT_TELEMETRY_OPTOUT`, `FalloutTelemetryVersion`, disclosure copy) alive for a feature that does nothing.

## Decision

**Fallout collects no telemetry — now or as a matter of standing policy for this fork — and the inherited subsystem is removed in full rather than left dormant.**

- No usage data is gathered, and nothing phones home. A build framework people run in CI and on their own machines should not be a data-collection channel; for a hard-fork rebuilding trust, "we collect nothing" is a simpler and stronger promise than "we collect anonymized data you can opt out of."
- Because there is nothing to opt out of, there is no opt-out. The `FALLOUT_TELEMETRY_OPTOUT` / legacy `NUKE_TELEMETRY_OPTOUT` env vars and the `FalloutTelemetryVersion` / `NukeTelemetryVersion` MSBuild property are removed along with the code that read them.
- Dormant scaffolding is not kept "just in case." If Fallout ever wants usage insight, that is a fresh decision requiring its own ADR and an **opt-in**, fully-documented design with a named endpoint and owner — not the revival of this code.

### Removed surface

- The `Telemetry` subsystem (`Telemetry`, `Telemetry.Events`, `Telemetry.Properties`) and the `[Telemetry]` build extension.
- All call sites: the `[Telemetry]` attribute on `FalloutBuild`, the config-generation hook, and the `setup` / `add-package` / `cake-convert` CLI events.
- `FALLOUT_TELEMETRY_OPTOUT` / `NUKE_TELEMETRY_OPTOUT`, `FalloutTelemetryVersion` / `NukeTelemetryVersion`, the `FalloutTelemetryDocsUrl` constant, and the test-run opt-out plumbing.
- The telemetry documentation page.
- The `fallout migrate` tool now **strips** NUKE's telemetry knobs from migrated projects instead of renaming them to dead `Fallout*` equivalents.

## Consequences

### Positive

- **Zero data collection**, and no privacy footgun — the "someone re-enables it incorrectly" path is gone because there is no code to re-enable.
- Smaller surface: dead code, a dead dependency ([#79](https://github.com/Fallout-build/Fallout/issues/79)), a consent UX, and several consumer-facing knobs all removed.
- Migrated NUKE projects come out clean — no telemetry-branded cruft carried across.

### Negative

- We forgo the aggregate usage insight telemetry could (in principle) have provided. Accepted: it was never actually flowing, and prioritization has done fine without it.
- Reintroducing any metrics later means starting from a clean, opt-in design — deliberately more work than flipping a dormant switch. That friction is the point.

### Neutral

- Removing the opt-out env var and the MSBuild property is **not a breaking change**: both only ever gated a no-op, and an unset/unknown env var or MSBuild property is silently ignored — no consumer build errors. The `FALLOUT001` legacy-property warning simply stops firing for `NukeTelemetryVersion`.
- `DOTNET_CLI_TELEMETRY_OPTOUT` (the **.NET SDK's** telemetry, unrelated to Fallout's) is left in place in the bootstrap scripts and generated CI — we still disable that.

## Alternatives considered

### A. Keep the scaffolding dormant, wire up a Fallout-owned endpoint later (the prior stance — rejected)

This is what the code and docs described. **Rejected** because the "later" had no owner, endpoint, or timeline; the dormant code was a live liability (hot-path property assembly, a re-enable invitation, consumer-facing knobs for a no-op); and keeping consent/opt-out machinery for a feature that does nothing is confusing. A future decision to collect data should be made explicitly, not pre-wired.

### B. Ship opt-in telemetry with a Fallout endpoint (rejected for now)

Stand up an opt-in, Fallout-owned analytics pipeline. **Rejected** — no compelling need for a build framework, and it is out of scope for the rebrand/foundation work. Not foreclosed forever: it would require its own ADR superseding this one, and would have to be opt-in by construction.

### C. Local-only anonymized stats (rejected)

Collect stats to a local file for the user's own inspection, never transmitted. **Rejected** as scope creep with no demonstrated demand; nothing stops a consumer from building this themselves via the public build-event hooks.

## References

- [#79](https://github.com/Fallout-build/Fallout/issues/79) — drop the dead `Microsoft.ApplicationInsights` dependency (subsumed here)
- [docs/agents/conventions.md](../agents/conventions.md) — "No telemetry" convention
- [docs/migration/from-nuke.md](../migration/from-nuke.md) — telemetry knobs are stripped on migration
1 change: 1 addition & 0 deletions docs/adr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@ If you change a decision, do NOT silently rewrite the old ADR — add a new one
| [0004](0004-calendar-versioning-and-dual-pace-channels.md) | Calendar versioning + dual-pace channels (edge/stable) + experimental APIs | Accepted (§3 amended by 0007; channel ladder §2 superseded by 0008) |
| [0007](0007-cut-release-branch-on-demand.md) | Cut `release/YYYY` on demand, not preemptively | Accepted |
| [0008](0008-collapse-experimental-into-main.md) | Collapse `experimental` into `main`; `main` is the sole prerelease lane | Accepted |
| [0010](0010-no-telemetry-collection.md) | Fallout collects no telemetry | Accepted |
2 changes: 1 addition & 1 deletion docs/agents/conventions.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Three groups: conventions to respect, things never to do, and the tool-wrapper r
- **Tool wrappers**: copy/paste from neighbours; cover full commands; use `<c>`, `<a>`, `<ul>`/`<ol>`, `<em>`, `<para/>` in `help`; don't write `secret: false` or `default: xxx`. See [Tool wrapper recipe](#tool-wrapper-recipe) below.
- **Tests next to code, separate folder**: every `Foo` project under `src/` has a sibling `Foo.Tests` project under `tests/`. Mirror the namespace.
- **No IDE-specific style files committed.** `.editorconfig` and `*.DotSettings` were removed during the takeover — relying on `dotnet format` defaults and review.
- **Telemetry opt-out is set in test runs** (`FALLOUT_TELEMETRY_OPTOUT=true`). Keep it that way.
- **No telemetry.** Fallout collects no usage data ([ADR-0010](../adr/0010-no-telemetry-collection.md)). The inherited NUKE telemetry subsystem, its opt-out env var, and the `FalloutTelemetryVersion` property were removed — don't reintroduce any of them.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 Is this necessary? It's not that an AI Agent is gonna reintroduce it magically.

- **No per-file license headers.** The MIT notice lives in [`LICENSE`](https://github.com/Fallout-build/Fallout/blob/main/LICENSE) at the repo root, and NuGet packages declare MIT via `PackageLicenseExpression`. Per-file headers were stripped in v11 (one source of truth + the header URL would have rotted on the repo-org transfer). Vendored third-party code keeps its own copyright headers — don't touch those (e.g. files under `src/Persistence/Fallout.Persistence.Solution/` retain Microsoft's MIT notice).
- **`[Experimental]` for opt-in unstable public APIs.** Not-yet-stable public surface is marked with `[Experimental("FALLOUT0xx")]` rather than held back or shipped silently. See [the `[Experimental]` convention](#experimental-for-opt-in-unstable-apis) below and the [diagnostic-ID registry](../experimental-apis.md).
- **`[Obsolete]` with a `DiagnosticId` for deprecations.** Deprecated public surface carries `[Obsolete(..., DiagnosticId = "FALLOUTOBS0xx")]` so `TreatWarningsAsErrors` consumers can suppress a single deprecation. See [the `[Obsolete]` convention](#obsolete-for-deprecating-public-apis) below and the [diagnostic-ID registry](../obsolete_apis.md).
Expand Down
6 changes: 0 additions & 6 deletions docs/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,6 @@ Central package versions are pinned in `Directory.Packages.props`; this page lin
|---|---|
| `NuGet.Packaging` | Read .nupkg metadata. Used by `NuGetVersionResolver`, `ProjectUpdater`. |

## Telemetry — currently inactive

| Package | Purpose | Status |
|---|---|---|
| `Microsoft.ApplicationInsights` | Telemetry client | **Dead weight today.** `Telemetry.cs` short-circuits because `InstrumentationKey = ""` (the original NUKE key was matkoch-owned, we don't reuse). Removal tracked in [#79](https://github.com/Fallout-build/Fallout/issues/79). Re-introduce when we stand up a Fallout-owned endpoint. |

## Vendored source

| Package | Source | Why vendored |
Expand Down
9 changes: 5 additions & 4 deletions docs/migration/from-nuke.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ If your build had previously worked against NUKE, it should now work against Fal
| Fully-qualified type refs | `Nuke.Common.AbsolutePath` | `Fallout.Common.AbsolutePath` |
| Base class name | `: NukeBuild` | `: FalloutBuild` |
| Base interface name | `: INukeBuild` | `: IFalloutBuild` |
| MSBuild properties in `_build.csproj` | `<NukeRootDirectory>`, `<NukeTelemetryVersion>` | `<FalloutRootDirectory>`, `<FalloutTelemetryVersion>` |
| Bootstrap scripts | `dotnet nuke`, `NUKE_TELEMETRY_OPTOUT`, `.nuke/temp` | `dotnet fallout`, `FALLOUT_TELEMETRY_OPTOUT`, `.fallout/temp` |
| MSBuild properties in `_build.csproj` | `<NukeRootDirectory>` | `<FalloutRootDirectory>` |
| Bootstrap scripts | `dotnet nuke`, `.nuke/temp` | `dotnet fallout`, `.fallout/temp` |
| Telemetry knobs (removed) | `<NukeTelemetryVersion>`, `NUKE_TELEMETRY_OPTOUT` | *dropped* — Fallout has no telemetry ([ADR-0010](../adr/0010-no-telemetry-collection.md)); `fallout migrate` strips them |
| Config directory | `.nuke/` | `.fallout/` (contents preserved) |

The 1:1 namespace prefix swap is the only structural change. Type names (other than `NukeBuild` / `INukeBuild`) keep their identifiers — `[Parameter]`, `[Solution]`, `[GitHubActions]`, `Solution`, `GitRepository`, etc. all stay the same.
Expand Down Expand Up @@ -103,9 +104,9 @@ You'll need a GitHub Personal Access Token with the `read:packages` scope. Then

If you'd rather drive the rewrite by hand (small projects, or you want to learn what the tool does):

1. Edit `build/_build.csproj`. For every `<PackageReference Include="Nuke.X" ...>`, change `Nuke.X` → `Fallout.X`. Same for `<NukeRootDirectory>` / `<NukeTelemetryVersion>` MSBuild properties.
1. Edit `build/_build.csproj`. For every `<PackageReference Include="Nuke.X" ...>`, change `Nuke.X` → `Fallout.X`. Same for the `<NukeRootDirectory>` MSBuild property. Delete any `<NukeTelemetryVersion>` — Fallout has no telemetry ([ADR-0010](../adr/0010-no-telemetry-collection.md)).
2. In every `.cs` file under `build/`, change `using Nuke.X.Y;` to `using Fallout.X.Y;`. Replace `: NukeBuild` with `: FalloutBuild` and `INukeBuild` with `IFalloutBuild`.
3. In `build.ps1`, `build.sh`, `build.cmd`: `dotnet nuke` → `dotnet fallout`, `NUKE_TELEMETRY_OPTOUT` → `FALLOUT_TELEMETRY_OPTOUT`, `.nuke/temp` → `.fallout/temp`.
3. In `build.ps1`, `build.sh`, `build.cmd`: `dotnet nuke` → `dotnet fallout`, `.nuke/temp` → `.fallout/temp`. Delete any `NUKE_TELEMETRY_OPTOUT` line (no telemetry to opt out of).
4. Rename the `.nuke/` directory to `.fallout/`. Contents are preserved.
5. Run `./build.ps1` to verify.

Expand Down
Loading
Loading