Repository navigation
docs(adr): volunteer-launch decisions 0034-0038 (all five accepted) - #333
Merged
Merged
Conversation
Five scoped ADRs for the volunteer launch. Four record decisions already taken; the fifth is a proposal awaiting the owner's decision. - 0034 (accepted): invite-only magic-link authentication. A magic link to the invited address is the only sign-in method; the password path comes out of the login UI. Flags the hardcoded admin stub in the portal layouts as a blocker before the first invite. - 0035 (accepted): the shelter reference code is the canonical animal identifier and the Animal Record's primary key. Aggregator listing ids are engagement-row attributes, never join keys. Supplies the identifier ADR 0033 left unnamed. - 0036 (accepted): listing engagement data lives in the Pet Data service's own database. No fourth Supabase project, so ADR 0030 needs no amendment. - 0037 (accepted): hosted-only execution. Nothing runs on an operator's machine; the private-collector plus authenticated ingest endpoint design is retired. - 0038 (proposed): engagement collection by a weekly-cron Cloudflare Worker making two fetches. Awaiting the owner's decision, plus Worker egress and aggregator secrets. Docs only. No code, config, or existing ADR is changed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Roo9YbNRZ1NBuACbKv33ky
The consequence framed the dependency backwards, as password sign-in being able to "return" once transactional email exists. The real constraint is the other direction: production SMTP must land before magic-link sign-in, and the password form is removed as part of that same change. Removing it first would leave nobody able to sign in. Verified against apps/stacker/supabase/config.toml (SMTP block still commented), login/+page.server.ts (signInWithPassword is the only sign-in path) and the absence of signInWithOtp anywhere in the tree. Tracked as issues #157 and #158. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Roo9YbNRZ1NBuACbKv33ky
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Roo9YbNRZ1NBuACbKv33ky
The owner chose the two-fetch Cloudflare Worker over a saved third-party scraper profile on 2026-09-07, so 0038 is a decision, not a proposal. Also corrects the prerequisites: a deployed Worker reaches public hosts directly, so only the aggregator credentials as Worker secrets remain. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Roo9YbNRZ1NBuACbKv33ky
claude Bot
pushed a commit
that referenced
this pull request
Sep 7, 2026
Brings in #333 (docs/adr 0034-0038). Docs-only on main's side; no conflicts with the gate scripts or the packages/schema fix on this branch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CmiatNdnHR4ak4KqEysLsz
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.
Summary
Before: the design decisions taken for the volunteer launch lived only in a Slack thread. The repo's ADR sequence stopped at 0033, so the canonical animal identifier was unnamed, the login page still advertised a password sign-in that invited volunteers cannot use, and it was not written down anywhere that nothing may run on an operator's laptop.
After: five scoped ADRs, 0034 through 0038, all marked accepted. Four record decisions taken on 2026-09-06; the fifth (0038, the engagement collector) records the design you chose on 2026-09-07. Docs only: no code, no config, and no existing ADR's substance is changed.
The five records
0034 through 0037 are decisions you had already made, written down. 0038 was put to you as a design with one alternative (a saved third-party scraper profile that a human re-authenticates by hand); you chose the two-fetch Cloudflare Worker on 2026-09-07, so it is now accepted and the alternative is recorded as declined. One prerequisite is still yours to arrange: the aggregator credentials installed as Worker secrets.
Open questions the ADRs flag
A-00000shape; the aggregator's stats report printed the same code as a plain unpadded integer on 96 of 96 rows sampled on 2026-09-06. Whether the shelter system emits it padded or prefixed is unanswered. If it does, a canonical normalization is needed on both sides before any join is relied on; if it does not, the schema comment is stale. This needs a real shelter-system extract to settle.services/graderhas no data layer yet. Putting score records in Pet Data would cut against ADR 0030's one-database-per-service rule; giving the grader its own database reopens the fourth-project question that 0036 declined for engagement.Two follow-ups these ADRs record but do not perform
docs/adr/README.md's index and its "0001-0032" range line do not cover 0033 or these five. Left untouched deliberately (this PR adds only new files); worth a separate housekeeping commit.Verified in the repo while writing these (with the citations in the ADRs)
enable_signup = falseatapps/stacker/supabase/config.tomllines 169, 204 and 255. Note the scope limit already recorded inapps/stacker/CLAUDE.md:config.tomlgoverns local and self-hosted only, so the hosted project's setting is not verified.apps/stacker/src/routes/app/petdata/+layout.server.ts:7andapps/stacker/src/routes/app/retriever/+layout.server.ts:7both returnisAdmin: truewith a stub comment. ADR 0034 records this as a blocker before the first invite.login/+page.svelte:49-58) backed bysignInWithPassword(login/+page.server.ts:14). Not touched in this PR.petdata_animals.idis aStringprimary key, so it is non-null and indexed. The nullable, unindexed column on that table is the separatesource_record_id. ADR 0035 states both accurately. What is true is that nothing populates the identifier in production:parse_animal_responsehas no caller outside unit tests.Related issues
None.
Module(s) touched
services/petdataservices/retrieverapps/stackerpackages/(design-system, auth, schema)docs/or repo-level (CI, templates, ADRs)Checklist
🤖 Generated with Claude Code
https://claude.ai/code/session_01Roo9YbNRZ1NBuACbKv33ky
Generated by Claude Code