Commits
Adds GOAT_USERNAME to .envrc so goat publishes lexicons as the dedicated
openletter.pub account when you're in the repo; the matching GOAT_PASSWORD
(app password) goes in .envrc.private, documented in the example.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Linode DNS for both domains, organized by domain (openletter.pub/domain.tf and
openletter.vote/domain.tf) with a small root module so a single terraform plan
from the repo root covers both. State lives in a Linode Object Storage bucket.
openletter.pub carries the _atproto handle attestation and the _lexicon
resolution record, both pointing at the dedicated openletter.pub account
(did:plc:vrxdl7yd3vz2hzdosqaywvb3). Secrets come from a gitignored
.envrc.private; see .envrc.private.example.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The five records from the design doc as lexicon JSON: petition, draft,
endorsement, objection, and contribution. Petitions are immutable markdown
letters; endorsements and objections are CID-pinned signatures (objections
have to give a reason); contribution is the co-author's half of the
mutually-attested authorship.
Also trims DESIGN.md to match — dropped the listed flag (it implied a privacy
control that doesn't exist on public records) and closesAt (deferred).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
We kept hitting the hard parts of petition versioning — forks, a stable
identity, re-affirmation, what the signature key hashes — and none of it is
needed for a first version. Drafts already cover getting a letter right before
it's published, so v1 petitions are now frozen once published: to change one
you withdraw and republish. This drops supersedes and the whole version chain,
and moves versioning and amendments to the deferred list, where they stay a
clean additive extension later.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sketches the pub.openletter.* record set — petition, draft, endorsement,
objection, and contribution — and the reasoning behind it: account-owned
data, CID-pinned signatures, immutable petition versions chained by
supersedes, drafts as the mutable staging ground, and mutually-attested
co-authorship. Also writes down the tradeoffs we're accepting and what we're
leaving for later, so there's something concrete to react to.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Starting point for openletter.pub (the pub.openletter.* lexicon namespace
for an ATProto-native petition system) and openletter.vote (the AppView and
web frontend). Petitions live on the originator's PDS, endorsements on each
endorser's.
Just scaffolding for now: a README sketching the design, an MIT license, a
.gitignore, and the two domain directories with placeholder READMEs. No
implementation language or framework chosen yet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Linode DNS for both domains, organized by domain (openletter.pub/domain.tf and
openletter.vote/domain.tf) with a small root module so a single terraform plan
from the repo root covers both. State lives in a Linode Object Storage bucket.
openletter.pub carries the _atproto handle attestation and the _lexicon
resolution record, both pointing at the dedicated openletter.pub account
(did:plc:vrxdl7yd3vz2hzdosqaywvb3). Secrets come from a gitignored
.envrc.private; see .envrc.private.example.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The five records from the design doc as lexicon JSON: petition, draft,
endorsement, objection, and contribution. Petitions are immutable markdown
letters; endorsements and objections are CID-pinned signatures (objections
have to give a reason); contribution is the co-author's half of the
mutually-attested authorship.
Also trims DESIGN.md to match — dropped the listed flag (it implied a privacy
control that doesn't exist on public records) and closesAt (deferred).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
We kept hitting the hard parts of petition versioning — forks, a stable
identity, re-affirmation, what the signature key hashes — and none of it is
needed for a first version. Drafts already cover getting a letter right before
it's published, so v1 petitions are now frozen once published: to change one
you withdraw and republish. This drops supersedes and the whole version chain,
and moves versioning and amendments to the deferred list, where they stay a
clean additive extension later.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sketches the pub.openletter.* record set — petition, draft, endorsement,
objection, and contribution — and the reasoning behind it: account-owned
data, CID-pinned signatures, immutable petition versions chained by
supersedes, drafts as the mutable staging ground, and mutually-attested
co-authorship. Also writes down the tradeoffs we're accepting and what we're
leaving for later, so there's something concrete to react to.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Starting point for openletter.pub (the pub.openletter.* lexicon namespace
for an ATProto-native petition system) and openletter.vote (the AppView and
web frontend). Petitions live on the originator's PDS, endorsements on each
endorser's.
Just scaffolding for now: a README sketching the design, an MIT license, a
.gitignore, and the two domain directories with placeholder READMEs. No
implementation language or framework chosen yet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>