feat: opt-in sign-up trial (ADR 0036) #94
Inga granskare
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-web!94
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "feat/signup-trial"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
What
Adds an opt-in trial to sign-up: a new user can tick a box to start a time-boxed trial that
grants the same capabilities as a paid account, ending at the end of August 2026, after which the
account becomes a participant account. The checkbox is a temporary stand-in for the future
"subscribe" option (ADR 0036).
Implements bitborg-web#92 and bitborg-web#93 (epic bitborg-docs#51).
Changes
signup-form.astro) with in-form text explaining the end date and downgrade,rendered only while the
TRIAL_OPENkill switch is on (mirrorsSIGNUPS_OPEN/ ADR 0029)./api/signupreads the trial flag (re-checkingtrialOpen()server-side), provisions a trialsign-up into the
tier_trialKanidm group and a non-trial into the participant baseline, andrecords consent (
trial,trial_terms_version) in thesignupstable.src/lib/kanidm.tspicks the trial vs base tier group per sign-up; the fallback base defaultis aligned to
tier_participantto match the already-live prod value (bitborg-web#93 — this isthe code fallback only, not a prod behaviour change; prod already sets it via group_vars).
/trial-terms(+/en/trial-terms), linked from the checkbox:what the trial grants, the fixed end date, what the participant downgrade means (no new hosting,
data retained and exportable), no charge, no auto-renewal.
tier_trialmembers.signups.trial+signups.trial_terms_version(+ generated migration0004).signup.trial*,panel.plan.trial*,trialTerms.*in both locales.TERMS_VERSION(2026-07-09 → 2026-07-26, matching the terms content).How it works
A trial sign-up lands the person in
tier_trial; the entitlement reconciler projects that to thepaidForgejo quota group plus org-create and Actions (via the group's nesting). At end of Augustan operator-run batch (runbook) moves trial members to the participant group and the reconciler
revokes the paid capabilities. Retiring the trial later = flip
TRIAL_OPEN=false.Depends on
tier_trialgroup + nesting +KANIDM_TRIAL_GROUP/TRIAL_OPENenv (PR inbitborg-infra).
tier_trial→paidmapping (PR in bitborg-auth-reconciler).Merge order for prod: reconciler + infra first (so the group exists and is projected), then this.
Testing
pnpm check(0 errors),pnpm lint,pnpm test(57 pass, incl. new trial provisioning cases),content style guide check on all new copy — all green. Not yet applied to prod.
edeb1edaf3ae816e5547