Relicense to MIT; record why the original results were fabricated - #3
Merged
Merged
Conversation
License: AGPL-3.0 to MIT, at the owner's request. Every runtime
dependency is permissive (MIT, BSD-2-Clause, ISC; JSZip is dual-licensed
and we take the MIT side), so nothing imposes copyleft obligations
downstream. Adds the previously absent `license` field to package.json.
Docs: adds CLAUDE.md and docs/POSTMORTEM.md.
The first version of this app was generated, looked professional, and
produced confident numbers that were substantially invented. That went
unnoticed for months. These two files exist so the failure modes are not
repeated or forgotten:
- CLAUDE.md is the operating contract for anyone, human or agent,
touching measurement code. It states the single rule (never substitute
a value for a failed measurement), the enforcement mechanism (null
plus strictNullChecks, and MetricValue having no fallback prop), a
table of what a browser genuinely cannot do and what to report
instead, and the specific traps in this codebase — the loosely typed
history payload, the Leaflet innerHTML sinks, CSV formula injection,
the third-party disclosure contract, and `{0 && ...}` rendering a bare
zero.
- docs/POSTMORTEM.md is the human-facing record: what was fabricated,
and more usefully why review did not catch it. The failure paths were
invisible on a working connection; `any` disabled the type checker at
the export boundary and hid six wrong field names; @types/react was
missing entirely so the whole React surface was implicitly any; and
confident presentation outran substance. It ends with the transferable
lessons, since none of this is specific to this project.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dz4sWqBnBqN12tDaDn6b8D
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
License: AGPL-3.0 → MIT
At the owner's request. Checked first: every runtime dependency is permissive — React/Recharts MIT, Leaflet BSD-2-Clause, lucide-react ISC, JSZip dual-licensed
MIT OR GPL-3.0(we take the MIT side). Nothing imposes copyleft obligations downstream, so the relicense is clean. Also adds thelicensefield that was missing frompackage.json.For the record, since "most open" came up: MIT is the most permissive mainstream license — anyone can take this closed-source and commercial. AGPL was the opposite trade, protecting end users' freedom at the cost of adoption friction. Neither is strictly "more open"; they optimise for different people. (0BSD/Unlicense drop even MIT's keep-the-notice condition, if that's ever the goal.)
Docs:
CLAUDE.mdanddocs/POSTMORTEM.mdThe first version of this app was generated, looked professional, and produced confident numbers that were substantially invented. That went unnoticed for months. These files exist so the failure modes aren't repeated — or forgotten.
CLAUDE.mdis the operating contract for anyone, human or agent, touching measurement code:null+strictNullChecks, and<MetricValue>deliberately having nofallbackprop. Plus the two greps that catch regressions.innerHTMLsinks, CSV formula injection, the third-party disclosure contract, silent truncation, and{0 && …}rendering a bare zero.docs/POSTMORTEM.mdis the human-facing record — what was fabricated, and more usefully why review didn't catch it:anydisabled the type checker at the export boundary, hiding six field names that didn't exist.@types/reactwas missing entirely, so the whole React surface was implicitlyany. Adding it and enablingstrictproduced zero errors — the safety had been available all along, just switched off.It closes with transferable lessons, since none of this is specific to this project.
Verification
npm run check— strict typecheck clean, 0 lint errors, 84 tests passing. Build succeeds. No source changes in this PR beyond thepackage.jsonlicense field.Generated by Claude Code