History: the Ruby-to-Go port

Facts began as a Go port of Puppet Facter . The port — proposed, implemented, verified, and then deliberately departed from — took place between 2026-06-07 and 2026-06-12. This file is the surviving summary of that project (see About this repository’s history ).

Method

The port was test-driven against the Ruby implementation, which stayed in the tree until completion:

Final parity-ledger accounting

The frozen ledger (docs/PARITY_LEDGER.md, generated 2026-06-10, never regenerated) closed with:

BucketCount
Total Ruby spec files895
In-scope614
Out-of-scope (explicit exclusion rule)281
Unclassified0
Covered by verified Go test reference612
Blanket coverage waived with documented reason2
Failed references0

The two waivers were Ruby implementation machinery with no Go analog (win32ole_spec.rb, WIN32OLE COM internals; class_discoverer_spec.rb, constant-reflection class discovery), each pinned instead by the Go tests covering the equivalent behavior.

Release-readiness milestones

Post-port departures

With the port complete and the project still unreleased, Facts deliberately narrowed and reshaped the Ruby-compatibility story. Each step is an archived OpenSpec change with an ADR where it changed a contract:

The migration log’s append-only discipline ended with the log itself: future behavior changes are recorded in CHANGELOG.md entries and OpenSpec change records under openspec/.

Architecture decisions

The full decisions live in docs/adr/ ; one line each:

About this repository’s history

This repository started as a fork of puppetlabs/facter carrying its full upstream git history (2,340 commits by 84 contributors, dating to 2019). On 2026-06-12 the history was deliberately flattened to a single initial commit: the inherited record overwhelmingly described another product and misrepresented this project’s activity and authorship. The detailed porting-era records (the port tracker, the 9,471-line migration log, the frozen parity ledger, the Ruby internals reference, and the inherited Ruby Facter 4.0.x release notes) were summarized into this file before their removal and are not recoverable from this repository. The Ruby implementation and its complete history remain available in upstream puppetlabs/facter ; attribution is carried by NOTICE , which does not depend on git history.

What lives in HEAD today: CONTEXT.md (the project language), docs/adr/ (the decisions), CONTRIBUTING.md (how to work on Facts, including the still-live TDD rules and release gates that originated in the port tracker), FACTER_CONF_COMPATIBILITY.md and CUSTOM_FACT_MIGRATION.md (the operator-facing compatibility contracts), and man/man8/facts.8 (the CLI manual).