Skip to content

feat(individuality): the free lite-personhood game sign-up - #350

Open
peetzweg wants to merge 3 commits into
mainfrom
feat/individuality-lite-signup
Open

feat(individuality): the free lite-personhood game sign-up#350
peetzweg wants to merge 3 commits into
mainfrom
feat/individuality-lite-signup

Conversation

@peetzweg

@peetzweg peetzweg commented Aug 31, 2026

Copy link
Copy Markdown
Member

Stacked on #348. The sign-up piece of the lite-personhood flow (#354): the fee-free Game.sign_up_with_account_lite_invite builder and the read that says whether either leg of the two-transaction lite sign-up is worth submitting.

Why: dim2 hand-rolls this today; humanity-spa is about to need the same reads for the vouch flow, and the blockers (invite pin, binding context, ring membership) are easy to get subtly wrong from the pallet docs alone.

How: readLiteSignUpRequirement runs the existing account requirement read plus the lite gates at one pinned block — PeopleLite.AccountToAlias (and its context vs Score.score_context via readScoreContext), Game.LiteInvites (which pins forever the one account a lite person may invite), PeopleLite.LitePeople, opt-in Members.Members ring membership. One deliberate judgment call: LiteSignUpBlocker is a parallel union (SignUpBlocker | <6 lite arms>) rather than a widening, so existing exhaustive consumers of the account read keep compiling on upgrade. signUpWithLiteInviteTx shares the identifier-key and airdrop-VRF guards with signUpWithAccountTx (the account path's body moved unchanged into a shared internal; public API untouched). Game.CommunicationIdentifiers being rewritten on every sign-up is deliberately never a blocker.

Semantics verified against the pallet source and the flow that ran live on previewnet (spec 1000036) on 2026-08-28. 475 package tests pass; workspace build + typecheck + 1,862 tests + biome clean; contract test pins paseo + previewnet and rejects devnet (predates Game.LiteInvites).

…ions

Pure helpers consolidating what dim2 and humanity each hand-roll:
productContext / contextSuffixBytes (the RFC-0024 Index/Raw expansion),
personhoodContext with the peopl context index map, ringCollectionId with
peopleRing / litePeopleRing, and readScoreContext, which checks that
Score.score_context is the product derivation of peopl.<Score.Suffix>/Index(0)
and reports a literal (non-host-mintable) context as NotProductDerived on the
ok channel. Product ids are always full DotNS ids; the TLD is never defaulted.

Pinned in-source against previewnet's published constants (spec 1000036),
both collection ids, and the dim2/game context vectors. Part of the lite
personhood sign-up flow (product-sdk#286).
…igin

The PeopleLiteAuth sibling of withAsPerson, on the same metadata-driven
machinery: AliasWithAccount for calls signed by an account bound to the
lite alias (the free Game.sign_up_with_account_lite_invite leg),
AliasWithProof for the unsigned ring-VRF-authorized
PeopleLite.set_alias_account bind leg, and AliasWithAccountRevised to
refresh a stale binding over the pallet's (implication, "revise",
account, nonce) tuple.

The slot patching, nonce read-back, proof-request guards and pipeline
cache that as-person-signer.ts kept file-private move to an internal
origin-extension.ts both signers share; the codec's context and proof
width guards are exported for the second encoder. Proof-variant bytes
are pinned against the encoding verified live on previewnet, and the
devnet blob - whose PeopleLiteAuthData predates the RevisionIndex
field - is the negative case proving the round-trip guard rejects a
field-list mismatch loudly. No behaviour change for withAsPerson.
…builder

Game.sign_up_with_account_lite_invite is the Pays::No, deposit-free game
sign-up a lite person's bound account submits under
withLiteAlias(AliasWithAccount). signUpWithLiteInviteTx builds it unsigned
with the account sign-up's width and count guards; the shared identifier-key
and airdrops-argument code moves into helpers both builders use.

readLiteSignUpRequirement is readGameSignUpRequirement plus the lite gates,
at one pinned block: the PeopleLite.AccountToAlias binding and its context
against Score.score_context (via readScoreContext), the forever
Game.LiteInvites pin (the blocker names the invited account), the
lite-person marker, the optional Members ring-membership check, and the
context-derivability answer. Its LiteSignUpBlocker union is parallel to
SignUpBlocker rather than widening it, so exhaustive consumers of the
account read keep compiling; every lite arm blocks the sign-up itself and
the draw-only split carries over unchanged. readGameSignUpRequirement's
body becomes runSignUpRequirementRead, taking an optional snapshot the way
runGameRead does, so the composed read pins once.

The new LiteSignUpChain contract is satisfied by paseo and previewnet and
asserted negatively for devnet, which predates Game.LiteInvites and the
call.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant