Family × PorchHearth — kids chores-for-hire (design doc, COUNSEL-GATED)
Status: DESIGN ONLY — NO CODE either side until (a) Sandon's explicit go-ahead AND (b) counsel review. Both HJ and PH agreed (crosstalk 2026-07-25): a joint design doc is the first artifact, counsel is the second, and no kid-facing or payout code is written before both. This is that doc. Requested 2026-07-25.
What it is
Household + neighborhood chores-for-hire where kids earn real credits. PH owns
the two-sided marketplace (a Need = a household posting a chore with
offeredPriceCents already exists — the demand side is their best-tested area). HJ's
Family layer is where a child sees available chores and where earned credit is
attributed to them, tied to the existing family points/chores.
The non-negotiable shape (payment rails force it)
PH flagged the constraint up front, and it decides the whole design:
- Stripe Connect requires an 18+ account holder. A kid cannot hold a payout account.
- Therefore: the parent's household is the payee; the credit is attributed to the child inside it. Payout custody sits with the adult by construction, not by policy. Build it this way from line one — it is the only shape the rails allow.
- PH's
HouseholdMemberRole.TEENis currently a stub (declared, no behavior). Any age-gating / restricted visibility / parent-approval is net-new and must be explicit, not assumed.
Safety model (PH owns marketplace trust; HJ owns the family gate)
Bright lines to design against — these are the counsel questions, stated concretely:
- Parent approval per job — no child accepts/starts a chore without a parent approving that specific job. Not a global toggle.
- No unsupervised child↔stranger contact. Neighborhood chores for a minor imply an adult in the loop; the design must make "who the kid is physically with" a first-class, parent-controlled field — or restrict to known/vetted households only.
- Payout custody = parent. Money lands in the parent household account; the child sees an attributed credit, redeemable per family rules (ties to family_rewards).
- Vetting / background posture for the demand side (who can hire a kid) is PH's marketplace responsibility; HJ renders only what PH marks safe-for-minors.
- Age floors + disclosures — counsel sets the minimum age, jurisdictional child-labor considerations, and the parental-consent record.
- Auditability — every kid-facing money event is parent-visible (the child-view hub is the natural surface) and logged.
Split of responsibilities
- PH (marketplace): the
Need/chore listings, who may hire, trust/safety + vetting, Stripe Connect payout to the parent household, asafe_for_minors/eligibility signal, and a read endpoint HJ consumes (default-OFF, opt-in, PII-safe — same shape as getaways/services). - HJ (family): the per-child opt-in (the
kids_choreskey is already reserved infamily_community_optins, migration 583), the parent-approval-per-job gate, the child-facing browse (filtered tosafe_for_minors), attributing earned credit into family points/rewards, and parent-visible audit in the child-view hub.
Sequence (nothing skips a gate)
- ✅ This design doc.
- ⏳ Sandon's explicit go-ahead to pursue it.
- ⏳ Counsel review of the safety model + payout-custody + age/consent, against something concrete (this doc + PH's trust model).
- Only then: PH contract for the read endpoint + eligibility signal → HJ consumer + parent-approval flow → credit attribution. Ship behind the opt-in, default OFF.
Open questions for counsel / Sandon
- Minimum age; which jurisdictions; parental-consent record shape.
- "Neighborhood" (stranger households) vs "known circle only" for v1 — the latter is dramatically lower risk.
- Whether real money at all in v1, or start with intra-family chores→credits (no external marketplace, no Stripe, no strangers) as a safe first step that proves the attribution mechanic before opening the neighborhood.
⚠️ Credit interchangeability is its OWN gated decision (PH caution, 2026-07-25)
HJ family points and PH neighborhood credits are two separate allowance ledgers and must stay that way by default. The moment a credit earned in one product can be spent or settled in the other, it stops being two ledgers and becomes a currency with two issuers — very hard to walk back once families hold balances, and a conversation neither HJ nor PH has had with Sandon. Do NOT build toward interchange by accident.
- Shipped intra-family chores (migration 584) touch ONLY HJ's own points — no PH link.
- PH's chores are internal, JWT-guarded at the class level with specs asserting no public/throttle/proxy guard — structurally unexposable.
- If a "mirror" is ever wanted: one-directional, read-only (HJ displays a PH
balance — PH's ledger is append-only, balance =
SUM(delta), so it's a single number to read) — NOT a transfer/settlement, unless Sandon explicitly asks for the harder thing (which is then a fresh owner + counsel conversation).
Recommendation: v1 = intra-family chores → attributed credit (zero external money, zero strangers — just formalizes allowance/chores, and it needs no counsel gate because no minor touches real external money or an outside party). The neighborhood + real-external-credit layer is v2, and only through gates 2–4 above.