| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Migration 010 gave endings a one-year term with renewals, per PRD 0005 §5. That is withdrawn. The prices are unchanged; what changed is that they are not charged again. The reason is what the namespace is for. A name that lapses is a name somebody else can catch, and the whole pitch is that you can finally hold the clean name instead of the hyphenated one you settled for. An annual invoice with a drop date attached is the thing people are trying to get away from, and selling it back to them undoes the pitch. Names were already sold this way and only the comments said otherwise: `moshpit_names` has never had an expiry column and nothing has ever renewed a name. The PRD called it a yearly fee, the schema sold it outright, and the doc comment described the PRD. It now describes the code. Endings really did have the machinery, but it never shipped -- nothing in the app could open an ending checkout, so `quoteTld` and `quoteRenewal` were unreachable and only the webhook settler was wired up. No ending was ever charged a renewal and no row in the wild has an expiry this takes away, which is why migration 016 is a plain drop rather than a grandfathering policy: §21.8 asks for one before putting endings INTO a lifecycle, and taking them back out of one nobody was in needs no such thing. - `expires_at` and `term_started_at` are dropped from `moshpit_tlds`, columns and index. Gone rather than left NULL, because a nullable expiry is an annual term waiting to be switched back on. - `moshpit_tld_purchases` KEEPS `kind` and `years`. That is a financial record of what was sold at the time, and a ledger is not something to rewrite once the product changes. - A 'renew' row can no longer be created, but one may still settle late. It is honoured rather than refused -- the buyer keeps the ending, which now keeps itself. Refusing it would take money for nothing. - `isExpired()` stays and always answers no, so callers asking a fair question get a permanent answer instead of an import that fails. The pit page leads with it, since it is the one claim here worth making above the fold and the whole reason to prefer this over a registrar. Note for whoever writes the next migration: nothing may follow the last statement in a .sql file but whitespace. migrate.mjs splits on semicolons and hands each piece to libSQL, and a trailing comment-only piece comes back as `SQLITE_OK: not an error`, which is as unhelpful as it sounds. 591 pass in apps/pwa. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWhPX5Uzd29whRg5WPAYM7
ThreatCrush Security Scan23 finding(s) in the 5 file(s) this pull request changes. MEDIUM: 23
Not introduced by this pull request. The full set is in the Security tab.
…and 16 more. Full results in the Security tab. Snippets are redacted; ThreatCrush never prints matched credential material. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Migration 010 gave endings a one-year term with renewals, per PRD 0005 §5. That is withdrawn. The prices are unchanged — what changed is that they are not charged again.
The reason is what the namespace is for. A name that lapses is a name somebody else can catch, and the whole pitch is that you can finally hold the clean name instead of the hyphenated one you settled for. An annual invoice with a drop date attached is the thing people are trying to get away from; selling it back to them undoes the pitch.
Two things worth knowing before reviewing
Names were already sold this way. moshpit_names has never had an expiry column and nothing has ever renewed a name. The PRD called it a yearly fee, the schema sold it outright, and the doc comment described the PRD. It now describes the code.
The ending term never shipped. Nothing in the app could open an ending checkout, so quoteTld and quoteRenewal were unreachable and only the webhook settler was wired up. No ending was ever charged a renewal, and no row in the wild has an expiry this drop takes away. That is why migration 016 is a plain drop rather than a grandfathering policy — §21.8 asks for one before putting endings into a lifecycle, and taking them back out of one nobody was in needs no such thing.
What changed
The pit page
Leads with it, since it is the one claim here worth making above the fold and the whole reason to prefer this over a registrar:
For whoever writes the next migration
Nothing may follow the last statement in a .sql file but whitespace. migrate.mjs splits on semicolons and hands each piece to libSQL, and a trailing comment-only piece comes back as SQLITE_OK: not an error, which is as unhelpful as it sounds. Cost me a debug cycle; noted in the migration header.
Tests
591 pass in apps/pwa. moshpit-terms.test.mjs rewritten for lifetime semantics; migration verified from scratch.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GWhPX5Uzd29whRg5WPAYM7