{
  "_meta.donor_facts": "docs/specs/2026-06-16-donor-capability-inventory.md",
  "modules.@platform-modules/util.verified_by": "turbo typecheck+test+build+verify green + root smoke + blueprint-transitive (this session, #14). Built leaves shipped; result/validation (candidate) + sanitize-html (WATCH) stay opt-in per-subpath, not module status.",
  "modules.@platform-modules/util.census": {
    "count": 6,
    "donors": [
      "zync",
      "multideal",
      "trance-shop",
      "ForumZone",
      "vibeflare",
      "fewtok"
    ],
    "note": "leaf-by-leaf, not whole-module"
  },
  "modules.@platform-modules/util.subpaths[1].note": "5/5 donors hand-roll; Node absent in Workers",
  "modules.@platform-modules/util.subpaths[6].note": "absorbs webhooks-inbound dedup",
  "modules.@platform-modules/util.subpaths[14].note": "@platform-modules/cron dissolved into this leaf",
  "modules.@platform-modules/util.subpaths[15].note": "cache/http dissolved into this leaf",
  "modules.@platform-modules/util.subpaths[16].note": "security fix — donors ship unsanitized",
  "modules.@platform-modules/util.subpaths[21].note": "promote pending HTML-render census",
  "modules.@platform-modules/db.verified_by": "turbo typecheck+test+build+verify green + root smoke + blueprint-transitive (this session, #14).",
  "modules.@platform-modules/db.census": {
    "count": 4,
    "donors": [
      "multideal",
      "zync",
      "ForumZone",
      "trance-shop"
    ],
    "converged": true
  },
  "modules.@platform-modules/db.subpaths[0].note": "type-only: Database/TransactionalDatabase/Transaction/Querier; zero runtime export",
  "modules.@platform-modules/db.subpaths[1].note": "narrowed: no .transaction(), +batch",
  "modules.@platform-modules/record-store.verified_by": "turbo typecheck+test+build green (record-store + mail + @app/consumer) + tri-backend conformance suite (in-memory · querier-pglite · d1-miniflare, identical keyset/cursor/order/payload) + apps/consumer swap-parity harness (capture in-memory ≡ local-D1, paginate-to-exhaustion deep-equal) + broken-export red-on-break; seam-reviewer Waves 1–5 CLEAN",
  "modules.@platform-modules/record-store.census": {
    "trigger": "forward-need (expansion mode) — ×1 build, NOT donor-count; shape recurs 3× in-repo (audit.listAudit keyset · jobs.outbox · multideal mock_emails D1) as COUSINS not one contract (spec §5)",
    "donors": [
      "multideal (mock_emails D1 — the capture donor)"
    ]
  },
  "modules.@platform-modules/record-store.subpaths[0].note": "RecordStore<T>/Stored<T>/Page contract + makeInMemoryRecordStore (zero-dep, L0; backs tests + mail/testing). seq = incrementing counter. RecordStoreAdmin type defined, impl deferred",
  "modules.@platform-modules/record-store.subpaths[1].note": "makeQuerierRecordStore over Querier<S> — every drizzle driver; table (seq bigserial, id, created_at_ms bigint, record jsonb); mirrors audit.listAudit numeric keyset; NO parallel driver seam; pglite suffices (numeric keys = collation-invariant)",
  "modules.@platform-modules/record-store.subpaths[2].note": "makeD1RecordStore(d1, table) — raw D1 (D1Database type-only peer); seq = AUTOINCREMENT rowid; HOST-OWNED table (adapter never CREATEs) + pure recordStoreD1TableSql DDL helper; seeded by multideal mock_emails donor",
  "modules.@platform-modules/jobs.verified_by": "turbo typecheck+test+build+verify green + saas-blueprint jobs wiring (this session, #14).",
  "modules.@platform-modules/jobs.census": {
    "count": 5,
    "donors": [
      "zync",
      "ForumZone",
      "multideal",
      "trance-shop",
      "vibeflare"
    ],
    "note": "mechanisms differ per donor — adapter axis IS the design"
  },
  "modules.@platform-modules/jobs.subpaths[0].note": "envelope + handler registry + ack/retry + pluggable idempotency seam",
  "modules.@platform-modules/jobs.subpaths[2].note": "FOR UPDATE SKIP LOCKED + backoff + in-table DLQ",
  "modules.@platform-modules/jobs.subpaths[3].note": "alarm self-reschedule; absorbs cron DO-alarm",
  "modules.@platform-modules/jobs.subpaths[4].note": "transactional outbox — the events-bus replacement",
  "modules.@platform-modules/mail.verified_by": "turbo typecheck+test+build green (ledger #4)",
  "modules.@platform-modules/mail.census": {
    "count": 7,
    "donors": [
      "zync",
      "ForumZone",
      "Press.zone",
      "multideal",
      "trance-shop"
    ]
  },
  "modules.@platform-modules/mail.subpaths[0].note": "createMail + validateMessage + render; zero runtime dep",
  "modules.@platform-modules/mail.subpaths[4].note": "fetch, no SDK",
  "modules.@platform-modules/mail.subpaths[5].note": "makeCaptureAdapter({store: RecordStore<CapturedMail>}) — the mechanism; records sends to a pluggable store. In-memory store backs mail/testing; host D1/PG store backs persistent dev/preview capture. D1 NEVER enters mail (§5)",
  "modules.@platform-modules/mail.subpaths[6].note": "makeFakeMailAdapter = makeCaptureAdapter over record-store in-memory store; records sends, assert via .store.list(), discard",
  "modules.@platform-modules/mail.note": "ForumZone = provider-failover reference",
  "modules.@platform-modules/auth.verified_by": "turbo typecheck+test+build+verify green + saas/community blueprint fail-closed auth (this session, #14). shipped = core seam (sessions / engine-custom / register / login / refresh) built+verified+consumer-exercised. Opt-in method subpaths NOT YET BUILT: oauth-provider, passkey, totp, otp-sms-firebase, admin-sessions, portal-sessions, invites — tracked per-subpath, not via module status. Supersedes ledger #4 'auth stays designed=intent' under Model B (user-confirmed 2026-06-16); verified=gate-truth retained.",
  "modules.@platform-modules/auth.census": {
    "count": 4,
    "donors": [
      "multideal",
      "zync",
      "ForumZone",
      "trance-shop"
    ],
    "converged": true
  },
  "modules.@platform-modules/auth.subpaths[1].note": "PBKDF2-SHA-512 + pepper; Neon refresh rows; no jose/KV",
  "modules.@platform-modules/auth.subpaths[4].note": "be an authz server; PKCE/consent",
  "modules.@platform-modules/auth.subpaths[7].note": "manual JWKS RS256, no firebase-admin",
  "modules.@platform-modules/auth.subpaths[8].note": "Web Crypto reimpl; trance uses Node crypto = unsafe",
  "modules.@platform-modules/auth.subpaths[12].note": "meetsMinimumTier/requireTier->402",
  "modules.@platform-modules/auth.subpaths[13].census": {
    "count": 2,
    "donors": [
      "zync",
      "vibeflare"
    ],
    "converged": true
  },
  "modules.@platform-modules/auth.subpaths[13].note": "PROMOTED candidate->designed 2026-06-16 (ledger #1, user-confirmed) on x2-convergence (Bearer prefix.secret -> hash-lookup -> scope), not count. Seam = issue/hash/rotate/scopes/last-used; record in auth boundary spec before build. Press.zone BUNNY_API_KEY is CDN-key consumption, not issuance — excluded",
  "modules.@platform-modules/tenancy.verified_by": "turbo typecheck+test+build green (ledger #4). synthesis-§6 'designed' was stale; prose 'shipped' confirmed.",
  "modules.@platform-modules/tenancy.census": {
    "count": 2,
    "donors": [
      "zync",
      "ForumZone"
    ],
    "converged": true,
    "also": [
      "Press.zone (divergent SaaS-licensing)"
    ]
  },
  "modules.@platform-modules/tenancy.subpaths[1].note": "default; OWNER/ADMIN/MEMBER/VIEWER/CONTRACTOR",
  "modules.@platform-modules/tenancy.subpaths[2].note": "ForumZone flat enum",
  "modules.@platform-modules/tenancy.subpaths[3].note": "SET LOCAL GUC tx-runner; needs TransactionalDatabase",
  "modules.@platform-modules/tenancy.subpaths[4].note": "scopeQuerier fail-closed (neon-http story)",
  "modules.@platform-modules/ledger.verified_by": "turbo typecheck+test+build+verify green + commerce-blueprint idempotent settlement (this session, #14).",
  "modules.@platform-modules/ledger.census": {
    "count": 3,
    "donors": [
      "multideal",
      "ForumZone",
      "Press.zone"
    ],
    "converged": true
  },
  "modules.@platform-modules/ledger.subpaths[0].note": "appendEntry + debit(guarded-UPDATE) + debitWithRead(FOR-UPDATE) + getBalance",
  "modules.@platform-modules/tax.verified_by": "turbo typecheck+test+build+verify green + commerce-blueprint applyVat funnel (this session, #14).",
  "modules.@platform-modules/tax.census": {
    "count": 2,
    "donors": [
      "multideal",
      "trance-shop"
    ],
    "converged": true,
    "note": "rates-table; trance = US-exclusive (Pattern C)"
  },
  "modules.@platform-modules/tax.subpaths[0].note": "IL 1976-2025 + EU scaffold; applyVat/extractVat",
  "modules.@platform-modules/notifications.verified_by": "turbo typecheck+test+build green (ledger #4)",
  "modules.@platform-modules/notifications.census": {
    "count": 3,
    "donors": [
      "zync",
      "multideal",
      "ForumZone"
    ],
    "note": "zync = reference impl"
  },
  "modules.@platform-modules/notifications.subpaths[0].note": "notify(event) router, ZERO channels; host-injected Dedup/Preference stores",
  "modules.@platform-modules/notifications.subpaths[2].note": "VAPID + RFC 8291",
  "modules.@platform-modules/uploads.verified_by": "turbo typecheck+test+build+verify green + consumer tests/uploads-authz.test.ts + 2 blueprints (this session, #14).",
  "modules.@platform-modules/uploads.census": {
    "count": 6,
    "donors": [
      "multideal",
      "ForumZone",
      "zync",
      "trance-shop",
      "Press.zone"
    ],
    "note": "validation converges 5/6; upload FLOW fragments 3 ways -> host"
  },
  "modules.@platform-modules/uploads.subpaths[0].note": "strict AVIF brand + SVG/HTML reject",
  "modules.@platform-modules/uploads.subpaths[4].note": "absorbs entitlements numeric-cap",
  "modules.@platform-modules/search.verified_by": "turbo typecheck+test+build+verify green + consumer tests/search.test.ts + commerce/community blueprint wiring (this session, #14).",
  "modules.@platform-modules/search.census": {
    "count": 5,
    "donors": [
      "zync",
      "ForumZone",
      "multideal",
      "trance-shop",
      "Press.zone"
    ],
    "note": "ALL Postgres-native — zero external-engine adapter axis"
  },
  "modules.@platform-modules/search.subpaths[0].note": "searchEntities federation seam; host registers entityType->queryFn",
  "modules.@platform-modules/seo.verified_by": "turbo typecheck+test+build+verify green + consumer tests/seo.test.ts (this session, #14).",
  "modules.@platform-modules/seo.census": {
    "count": 3,
    "donors": [
      "multideal",
      "ForumZone",
      "trance-shop"
    ],
    "note": "pure builders; Press.zone=legacy CMS+SEO stack contributes nothing"
  },
  "modules.@platform-modules/seo.subpaths[0].note": "escape union <>& + U+2028/2029",
  "modules.@platform-modules/ai.verified_by": "turbo typecheck+test+build+verify green + consumer tests/ai.test.ts (this session, #14). shipped = core completion+fallback; usage/tool-use/model-discovery harvest-pending per r5_note (opt-in, not module status).",
  "modules.@platform-modules/ai.peer_note": "provider SDKs per adapter; NO db in core (host resolves creds)",
  "modules.@platform-modules/ai.census": {
    "count": 2,
    "donors": [
      "zync",
      "multideal"
    ],
    "converged": true,
    "also": [
      "ForumZone",
      "vibeflare",
      "fewtok"
    ]
  },
  "modules.@platform-modules/ai.subpaths[0].note": "AIAdapter + error hierarchy(retryable) + executeWithFallback; usage has NO cost field",
  "modules.@platform-modules/ai.subpaths[1].note": "covers openai/gemini-compat/groq/together",
  "modules.@platform-modules/ai.subpaths[5].census": {
    "count": 2,
    "donors": [
      "vibeflare",
      "Botmaster"
    ]
  },
  "modules.@platform-modules/ai.subpaths[5].note": "raw token recording + daily rollup, NO cost",
  "modules.@platform-modules/ai.subpaths[7].note": "listModels + cache; 1-donor but generic (R5)",
  "modules.@platform-modules/ai.subpaths[8].note": "COMPOSES @platform-modules/jobs, not a re-impl",
  "modules.@platform-modules/ai.r5_note": "shipped over-thinned (completion+fallback only); usage/tool-use/model-discovery harvest pending — see synthesis §6 2026-06-15",
  "modules.@platform-modules/realtime.verified_by": "turbo typecheck+test+build+verify green + consumer tests/realtime.test.ts exercising /server (fake DO/Queue) (this session, #14). Core barrel = types-only; /server built+unit-proven.",
  "modules.@platform-modules/realtime.census": {
    "count": 2,
    "donors": [
      "zync",
      "ForumZone"
    ],
    "converged": true,
    "note": "best = ForumZone hibernatable DO"
  },
  "modules.@platform-modules/realtime.subpaths[0].note": "TYPES ONLY — browser-safe barrel",
  "modules.@platform-modules/realtime.subpaths[1].note": "Workers-locked: broadcastFrame/acceptHibernatable/publishEvent/makeQueueConsumer/verifyInternalSecret",
  "modules.@platform-modules/billing.verified_by": "turbo typecheck+test+build+verify green + commerce/saas blueprint money funnel (this session, #14).",
  "modules.@platform-modules/billing.emits_note": "subscription.* = webhook relay only (Stripe/Sumit subscription-event passthrough) — NOT recurring lifecycle. Recurring lifecycle (plan catalog/subscribe/portal/proration/dunning) lives in the billing/subscriptions subpath. billing↔entitlements wiring (subscription.activated → entitlements.setTier) is host/plugin event wiring, never a billing source import.",
  "modules.@platform-modules/billing.census": {
    "count": 4,
    "donors": [
      "multideal",
      "ForumZone",
      "trance-shop",
      "zync"
    ]
  },
  "modules.@platform-modules/billing.subpaths[0].note": "one-time charge/refund + webhook idempotency",
  "modules.@platform-modules/billing.subpaths[1].note": "recurring lifecycle — plan catalog · subscribe · portal · proration · dunning. Same provider seam billing already owns (Stripe/Sumit); a parallel module would duplicate the provider/webhook spine. Harvest as subpath (R5). billing/subscriptions + entitlements + their -react = the subscriptions plugin.",
  "modules.@platform-modules/billing.subpaths[3].note": "IL; shared with invoicing",
  "modules.@platform-modules/billing.subpaths[4].note": "IL",
  "modules.@platform-modules/billing.subpaths[5].note": "IL",
  "modules.@platform-modules/billing.subpaths[6].note": "IL; trance-shop provider-in-charge",
  "modules.@platform-modules/entitlements.status_note": "BUILD-approved (design spec §4, 2026-06-17). Deletion test PASS — delete it → tier/capability gating scatters into every app + plugin screen-gate; complexity relocates ×N. Re-disposition from dissolved.entitlements: the prior 3-way-split verdict is REVERSED — ×2 convergence (zync tier-ordering + ForumZone feature-limits jsonb) on the CAN/QUOTA/SET-TIER seam. Spec each via module-plan-template before build.",
  "modules.@platform-modules/entitlements.dep_direction_note": "NO back-edge to billing. billing↔entitlements = host/plugin event wiring (subscription.activated → entitlements.setTier via direct call/jobs.outbox), never a source import. entitlements imports nothing from billing.",
  "modules.@platform-modules/entitlements.census": {
    "count": 2,
    "donors": [
      "zync",
      "ForumZone"
    ],
    "note": "zync tier-ordering (plan→feature gates) + ForumZone feature-limits jsonb; ×2 convergent seam"
  },
  "modules.@platform-modules/entitlements.note": "plugin-screen capability substrate. Capability evaluator split: role:* checks → auth guard; feature:*/quota:* checks → entitlements. Coexists with auth/entitlements subpath (auth/entitlements = HTTP 402 guard/requireTier middleware; @platform-modules/entitlements = the underlying can/quota/setTier engine the guard calls into). auth/entitlements subpath build on-consumer-2 flag stays valid — it is the HTTP layer above this module.",
  "modules.@platform-modules/marketing.verified_by": "turbo typecheck+test+build green + consumer tests/marketing.test.ts (compliance seam: legal-gate fail-closed, suppression + EU/IL double-opt-in refusal, RFC 8058 one-click headers, tracking-off-by-default, region branch, adapter-registry error). Red-on-break PROVEN (drop executeCompliantSend re-export -> 4 tests fail). #14 marketing-fixture gap closed this session.",
  "modules.@platform-modules/marketing.census": {
    "count": 2,
    "donors": [
      "trance-shop",
      "ForumZone"
    ],
    "note": "self-managed x2; brevo x1 (337 hits), loops x1"
  },
  "modules.@platform-modules/marketing.subpaths[0].note": "compliance baked in: double-opt-in, suppression, ad-label, tracking-consent",
  "modules.@platform-modules/marketing.subpaths[6].note": "census-observed ESP (x1); NOT built — no src/loops.ts or package export on disk",
  "modules.@platform-modules/invoicing.census": {
    "count": 2,
    "donors": [
      "multideal",
      "zync"
    ],
    "converged": false
  },
  "modules.@platform-modules/helpdesk.verified_by": "turbo typecheck+test+build+verify green + consumer tests/helpdesk.test.ts (this session, #14).",
  "modules.@platform-modules/helpdesk.census": {
    "count": 3,
    "donors": [
      "zync",
      "trance-shop",
      "multideal"
    ],
    "note": "3-donor shape + multideal polymorphic generalization"
  },
  "modules.@platform-modules/helpdesk.subpaths[0].note": "polymorphic satellite tables keyed (parentType,parentId) + isValidTransition + SLA contract",
  "modules.@platform-modules/affiliate.census": {
    "count": 1,
    "donors": [
      "multideal"
    ],
    "note": "PZ wallet + trance split are DIFFERENT concepts"
  },
  "modules.@platform-modules/affiliate.subpaths[1].note": "-> future @platform-modules/risk on 2nd consumer",
  "modules.@platform-modules/audit.verified_by": "turbo typecheck+test+build+verify green + consumer tests/audit.test.ts + saas/community blueprint wiring (this session, #14).",
  "modules.@platform-modules/audit.census": {
    "count": 4,
    "donors": [
      "zync",
      "ForumZone",
      "multideal",
      "trance-shop"
    ],
    "note": "core sync-inline write; zync = best (partitioned+redact+queue-sink)"
  },
  "modules.@platform-modules/audit.subpaths[0].note": "appendAuditEntry append-only, never-throws-into-mutation; listAudit keyset",
  "modules.@platform-modules/cache.census": {
    "count": 5,
    "donors": [
      "multideal",
      "ForumZone",
      "trance-shop",
      "vibeflare",
      "Press.zone"
    ],
    "note": "same need, 5 backends — real adapter axis; ForumZone downweighted (aspirational) → ~4 working"
  },
  "modules.@platform-modules/cache.subpaths[0].note": "createCache get/set/del/getOrSet + single-flight (per-isolate only) + namespace(); CacheBackend stores opaque strings, core owns JSON+T; runtime-agnostic, zero-dep",
  "modules.@platform-modules/cache.subpaths[1].note": "default; isolate-local Map+TTL; dev/test/fallback only (unbounded growth)",
  "modules.@platform-modules/cache.subpaths[2].note": "CF KV (binding injected); type-only peer; 60s min TTL, no silent clamp",
  "modules.@platform-modules/cache.subpaths[3].note": "Node runtime story; client injected; type-only peer; promoted WATCH→BUILD per spec (only non-CF runtime)",
  "modules.@platform-modules/cache.note": "shipped 2026-06-16 (7d1cf7f); swr dropped from v1 (browser-only WATCH; additive-later=non-breaking minor); cache-api/d1/do + epoch/tags stay WATCH; HTTP-response-cache dissolved to util/http-cache-headers; counters stay in util/rate-limit (NOT yet built)",
  "modules.@platform-modules/i18n.verified_by": "turbo typecheck+test+build+verify green + consumer i18n harness (this session, #14).",
  "modules.@platform-modules/i18n.layer_note": "RECLASSIFIED —→L0 2026-06-16: zero runtime deps + framework-free + browser-safe = the L0 FOUNDATION definition (alongside util/db). The prior '—' was a pre-classification artifact — i18n was the pilot, built 2026-06-12, one day BEFORE the L0–L3 DAG was written (synthesis 2026-06-13), and never back-labelled. Only the '-react' siblings remain layer '—' (framework axis, intentionally outside the build-order DAG).",
  "modules.@platform-modules/i18n.census": {
    "count": 1,
    "donors": [
      "achiron"
    ],
    "also": [
      "trance-shop",
      "multideal"
    ]
  },
  "modules.@platform-modules/i18n.subpaths[0].note": "harvest pending: nested+namespaced keys (R5)",
  "modules.@platform-modules/i18n.subpaths[5].note": "lazy bundle-split",
  "modules.@platform-modules/i18n.subpaths[6].note": "pickLocalized DB-row by locale",
  "modules.@platform-modules/i18n.r5_note": "shipped over-thinned (flat string table)",
  "modules.@platform-modules/ui-tokens.subpaths[0].note": "themeless var(--mod-*) defaults",
  "modules.@platform-modules/ui-tokens.subpaths[1].note": "Tailwind v4 @theme inline adapter",
  "modules.@platform-modules/ui-tokens._note": "themeless token contract (typed unions lifted from mod-ui-enforcement/tokens.ts) + base.css var(--mod-*) defaults + theme.css Tailwind-v4 @theme adapter; brand values supplied by Distribution/instance theme. Phase 0 of mod-www program.",
  "modules.@platform-modules/ui-primitives.subpaths[0].note": "Button/Dialog/Tabs/Select — Radix+CVA, token-only props",
  "modules.@platform-modules/ui-primitives._note": "Radix+CVA primitives (Button/Dialog/Tabs/Select), token-only props, no className escape; classes resolve via the ui-tokens v4 @theme adapter. Minimal set for content-site islands. Phase 0 of mod-www program.",
  "modules.@platform-modules/i18n-react.verified_by": "turbo typecheck+test+build green + jsdom tests + consumer dep (this session, #14).",
  "modules.@platform-modules/i18n-react.subpaths[0].note": "I18nProvider/useTranslations/useLocale/LanguageSwitcher",
  "modules.@platform-modules/realtime-react.verified_by": "turbo typecheck+test+build green + 10 jsdom tests (mocked WebSocket) (this session, #14).",
  "modules.@platform-modules/realtime-react.subpaths[0].note": "useChannel/usePresence/<Channel>",
  "deliveryStages._note": "ORTHOGONAL axis to the layer DAG. The mining-doc 'Layer 0-5' numbering COLLIDES with L0-L3 and is REJECTED — use these named stages. This is packaging/delivery grain, not build-order. Most stages are CANDIDATE/SPECULATIVE — build one blueprint BY HAND before authoring any generator (YAGNI / Gate-1).",
  "deliveryStages.stages[2].note": "Convergence>count: where donors converge (zync+vibeflare) they converge ON Radix — zync packages/ui pulls the full @radix-ui/* set + cmdk (shadcn signature); vibeflare uses @radix-ui dialog/select/tabs/toast/checkbox/progress/tooltip; ForumZone has no Radix-family dep (hand-rolled, accessibility unverified). The convergent answer IS 'adopt the standard', not a shared internal contract. Delete-test FAIL: the generic accessible-primitive need is already met by Radix (accessibility hard-floor solved) — a wrapper module relocates complexity + adds a swap-survival liability for zero accessibility gain. Pattern (don't re-propose): raw primitive→Radix/shadcn at consumer; headless BEHAVIOR→per-module <core>-react siblings; styled COMPOSITES (AppShell/Sidebar/admin)→template/host-owned stage. See spec §3.",
  "deliveryStages.stages[2].product_note": "UMBRELLA killed (above) ≠ capability killed. RECONCILED 2026-06-16 (owner decision, supersedes the earlier 'own repo/brand, not a module inside agnostic mod' framing): the live form is a flat @platform-modules/ui-* family INSIDE mod (ui-tokens/ui-util/ui-primitives) on the framework/presentation axis — the SAME opt-in axis as i18n-react/realtime-react, so agnostic CORE (L0-L3) is untouched and a backend-only adopter pulls none of it. Answers the VALUE-kill (swap-survival), not just packaging: ui-tokens is the engine-agnostic foundation that carries swap-survival (reject Radix → ui-tokens + your own primitives); ui-primitives is the opinionated Radix batteries-on-top whose deletion removes the batteries path (re-rolls/fragments across siblings+templates) but NOT swap-survival. A LIVE, demand-VALIDATED direction — build GATED, not greenlit. It builds tokens + an agent-enforcement triad + mod-seam-wiring OVER adopted Radix primitives (does NOT reverse adopt-not-build; value moved up a layer). Engine fork CLOSED → Radix+Tailwind+CVA as an ENFORCED IMPORTABLE package (NOT shadcn copy-paste). Do NOT re-kill the product when re-reading this kill. See docs/specs/2026-06-16-ui-product-brief.md + UI census docs/catalog/2026-06-16-ui-donor-census.md.",
  "deliveryStages.stages[5].note": "AMENDED 2026-06-17: a blueprint is THEMELESS (preset + plugins + wiring + glue + templates + skills; wires the ui-tokens CONTRACT, ships NO theme values) — the themed installable product is the 'distribution' stage below. build ONE by hand first — prefer a SINGLE-preset blueprint (saas-admin↔presets.saas or community↔presets.community); content-site (mod-www) is the active first hand-build. marketplace is a TWO-preset compose (commerce+community), harder, not the first. ai-dashboard/creator-content have NO preset = most speculative. Extract a generator only after a SECOND hand-built blueprint converges. See spec §4/§7.",
  "deliveryStages.stages[6].note": "ADDED 2026-06-17: a distribution = a blueprint + a token THEME + opinionated defaults + install wizard + optional CMS — the themed, installable, self-hostable PRODUCT (Debian analogue an end-user installs and runs), vs the themeless blueprint you DEVELOP with. The 'distro' analogy belongs HERE, not blueprint. GRADUATES to its OWN repo depending 100% on PUBLISHED @platform-modules/* once contracts freeze + publish path proven (Debian-from-kernel); kept in-monorepo until then (workspace:^ atomic edits during discovery). First/reference: software-site (over the content-site blueprint) — ROADMAP, not v0.0.1. One deployed distribution = an INSTANCE (e.g. mod-www). See spec docs/specs/2026-06-17-mod-www-foss-site-program-design.md §0/§9/§10 + delivery-stack §2.",
  "presets._note": "a preset = a package whose only content is dependencies. Built later, on demand. create-mod-app --preset <name> reads this file.",
  "presets.core_note": "removed @platform-modules/events (dissolved) from the prose 'core' preset",
  "presets.saas_note": "ledger added 2026-06-16 (HARD import-closure: billing/src imports @platform-modules/ledger and every settled charge + settlement/refund webhook injects LedgerSeam.appendEntry — billing/index.ts confirmSettlement/confirmRefund — Pattern B: ledger sits ABOVE billing). tax added as Pattern-C-CONDITIONAL curation, NOT closure: billing/src imports zero tax (host resolves the taxed amount pre-charge for inclusive IL/EU pricing, passes it into settleCharge); a US-exclusive saas may drop tax. Surfaced by the hand-built saas-admin blueprint dep-closure check; corrected spec-first.",
  "presets.commerce_note": "invoice-on-charge (receipts/tax-invoices emitted when a charge settles) is Pattern-A billing-provider CONFIG — PaymentProvider.emitsInvoiceOnCharge + ChargeResult.documentUrls — NOT a module dep (CLAUDE.md §3: Sumit invoice-on-charge → billing config). @platform-modules/invoicing (standalone recurring/AR-aging/credit-notes, zync-hardened) stays WATCH (×2 DIVERGENT donor shapes: provider-dispatch vs AR-subledger, ledger #3) and is NOT in the basic commerce recipe — add it only when a consumer needs the AR-subledger form. Drift removed 2026-06-16 (preset listed an unbuilt WATCH module). | db + util added 2026-06-16 (HARD import-closure: billing+ledger import @platform-modules/db; search/src imports @platform-modules/util — the original list omitted the L0 foundations every member sits on).",
  "presets.community_note": "db + mail added 2026-06-16 as HARD import-closure (quote-agnostic src scan: auth/src imports @platform-modules/{db,mail}; notifications/src imports @platform-modules/mail; audit writes through @platform-modules/db) — these are PEER deps, so pnpm never auto-installs them and the preset MUST list them. util added too, for parity with core/saas + app-direct-use: it is the L0 leaf imported as a `dependency` (not peer) by auth/notifications/search, so it already resolves transitively — listing it is consistency, not closure. Over-declared optional PEERs elsewhere (billing→jobs/tax, marketing/search/tax→db) left as-is: optional:true, non-breaking, likely injected-Querier seams — a separate package.json hygiene pass, not preset business.",
  "presets.content-site_note": "content-site: themeless module floor for a software/org public-site blueprint (landing+docs+blog+contributors). Registry-array preset (no package — matches every existing preset; preset-package form is an unsettled platform-wide question, out of Phase-0 scope). mod-www program Phase 0. Import-closure: ui-primitives imports ui-tokens; i18n-react imports i18n; seo standalone — the hand-built content-site blueprint's dep-closure pass confirms the floor.",
  "plugins._note": "a plugin = a bolt-on FEATURE added on top of any base preset (create-mod-app --preset <base> --plugin <name>). Distinct from a preset (the BASE dep-bundle) and a blueprint (a full base app). Built/wired on demand. THIS CATALOGUE IS DISPOSITION ONLY — the plugin SYSTEM (auto-wire/manifest/loader) is DEFERRED (deliveryStages.rejected.generator-upgrade-engine; gate: >=2 hand-built blueprints converge). It records which plugins exist, their deps, and their donor harvest source — the plugin-grain mirror of `modules`.",
  "plugins.subscriptions.bundles_note": "billing includes the /subscriptions subpath (recurring lifecycle). billing-react + entitlements-react = -react siblings (missing, build). Template: subscription-tiers (pricing · plan-picker/compare · upgrade-downgrade · checkout · billing-portal · usage/quota-meter · admin tier-setup).",
  "plugins.subscriptions.optional_note": "jobs = dunning schedule; mail = dunning emails",
  "plugins.subscriptions.harvest": {
    "billing/subscriptions": "zync (recurring/proration/portal) + ForumZone",
    "entitlements": "zync (tier-ordering) + ForumZone (feature-limits) — net-new module, BUILD-approved",
    "billing-react": "multideal (Stripe+Connect) — BUILD",
    "entitlements-react": "net-new — BUILD"
  },
  "plugins.blog.harvest": {
    "content": "multideal editor primitives (RichTextEditor/PublishDialog/draft-publish/rich-text-content blocks) + NET-NEW corpus/taxonomy/feeds (no donor)",
    "content-react": "multideal (harvest)",
    "seo": "shipped"
  },
  "plugins.cms.harvest": {
    "content": "same as blog (editor prims harvest + net-new corpus)",
    "uploads": "shipped (media library)"
  },
  "plugins.helpdesk.harvest": {
    "helpdesk": "multideal (polymorphic ticket)",
    "helpdesk-react": "BUILD (sibling missing)"
  },
  "plugins.marketing.harvest": {
    "marketing": "trance + ForumZone",
    "marketing-react": "trance/ForumZone (newsletter subscribe form) — BUILD"
  },
  "plugins.integrations.harvest": {
    "integrations": "zync (slack/jira/asana/monday/clickup task-sync + Zapier OAuth client + Make.com)"
  },
  "plugins.affiliate.harvest": {
    "affiliate": "multideal"
  },
  "plugins.invoicing.harvest": {
    "invoicing": "zync (AR-aging/credit-notes)"
  },
  "templates._note": "DISPOSITION CATALOGUE ONLY — not a backlog. A template is a multi-screen flow (flow-grain; screen-set) assembled by the host over @platform-modules/ui-* + module -react siblings. Build no template until its backing module is shipped AND has a shipped -react sibling. Generic templates are scaffolded (host-owned, copied); plugin-owned templates are shipped as that plugin's package components. Screen-grain paths + SHA pins live in docs/catalog/2026-06-17-screen-flow-donor-census.md (SoT). Added 2026-06-17 from design spec §5.",
  "templates._census_gaps_note": "no donor coverage for these screens — build fresh when template gates met",
  "templates.auth.bestDonor": "zync.is (+ multideal magic-link/verify)",
  "templates.account.bestDonor": "zync.is",
  "templates.subscription-tiers.bestDonor": "zync.is (pricing/plan/billing/usage) + trance (admin tier-setup)",
  "templates.team-org.bestDonor": "zync.is",
  "templates.admin-dashboard.bestDonor": "multideal (shell/CRUD) + trance (25+ admin breadth)",
  "templates.content.bestDonor": "multideal (feed/taxonomy) + ForumZone (comments)",
  "templates.notifications.bestDonor": "zync.is (inbox) + multideal (bell)",
  "templates.onboarding.bestDonor": "zync.is (wizard/progress/resume)",
  "templates.marketing.bestDonor": "zync.is (landing/pricing) + multideal (referral)",
  "templates.moderation.bestDonor": "multideal (admin) + ForumZone (community, tested)",
  "templates.search.bestDonor": "multideal (public) + zync.is (in-app)",
  "templates.system.bestDonor": "spread: trance (404/500) · zync (status) · multideal (a11y)",
  "blueprints._note": "DISPOSITION CATALOGUE ONLY — recipe status, NOT built. A blueprint = preset (read from registry.json → presets, never re-list) + plugins + host-assembled templates + wiring. Build ONE by hand before any generator (delivery-stack §7). Added 2026-06-17 from design spec §6.",
  "blueprints.saas-admin.bestDonor": "zync.is",
  "blueprints.saas-b2b.bestDonor": "zync.is (tenant/roles/switcher)",
  "blueprints.saas-b2b.note": "multi-tenant variant; team-org with heavy RBAC + org-switcher",
  "blueprints.commerce-storefront.plugins_note": "catalog/checkout = WATCH; subscriptions = subscribe-and-save",
  "blueprints.commerce-storefront.bestDonor": "trance-shop-israel",
  "blueprints.community-forum.bestDonor": "ForumZone",
  "blueprints.blog.bestDonor": "content net-new; multideal editor + ForumZone comments",
  "blueprints.cms.preset_note": "core + uploads",
  "blueprints.cms.bestDonor": "net-new; trance content-admin ref (Press.zone = reference CMS only)",
  "blueprints.ai-saas.preset_note": "saas + ai module",
  "blueprints.ai-saas.plugins_note": "subscriptions = usage-metered",
  "blueprints.ai-saas.bestDonor": "zync.is (usage-metered plan)",
  "blueprints.marketing-site.bestDonor": "zync.is (landing) + multideal (landing app)",
  "blueprints.helpdesk.bestDonor": "multideal (admin/support 7-screen subsystem)",
  "statusLegend.dissolved": "failed Gate-1 delete-test — pieces relocated to util leaves / sibling modules / host; NOT a package",
  "modules.@platform-modules/search.watch": [
    "algolia/meilisearch adapter (0 donors)",
    "fewtok SQLite kb-store path"
  ],
  "modules.@platform-modules/seo.watch": [
    "og-image (Satori)",
    "IndexNow",
    "GEO meta"
  ],
  "modules.@platform-modules/ai.subpaths[5].build": "harvest",
  "modules.@platform-modules/ai.subpaths[6].build": "harvest",
  "modules.@platform-modules/ai.subpaths[7].build": "harvest",
  "modules.@platform-modules/billing.subpaths[1].donors": [
    "ForumZone",
    "zync"
  ],
  "modules.@platform-modules/invoicing.status_review": "census 2026-06-16 found zync ALSO has standalone invoicing (recurring/AR-aging/credit-notes, hardened) -> x2 donors BUT divergent shape (provider-dispatch vs AR-subledger). Promote or hold? (ledger #3)",
  "modules.@platform-modules/helpdesk.watch": [
    "email-intake",
    "dispute/offer-negotiation",
    "threaded moderation",
    "AI-agent",
    "KB"
  ],
  "modules.@platform-modules/i18n.subpaths[5].build": "harvest",
  "modules.@platform-modules/i18n.subpaths[6].build": "harvest",
  "modules.@platform-modules/i18n.subpaths[7].build": "harvest",
  "dissolved": {
    "@platform-modules/events": "census x0 (2026-06-14) -> jobs/outbox + direct calls",
    "@platform-modules/webhooks": "inbound -> util crypto/idempotency leaves (host recipe); OUTBOUND delivery re-disposition pending (ledger #5, x5 donors found incl zync hardened)",
    "@platform-modules/image": "magic-bytes/dims -> uploads leaves; transcode = host engine choice (3 donors, 3 engines)",
    "@platform-modules/analytics": "LLM usage -> ai/usage subpath; domain BI = host SQL",
    "@platform-modules/compliance": "List-Unsub/suppression->mail; unsub-endpoint->notifications; ToS/deletion->auth; export-job->jobs(WATCH)",
    "@platform-modules/cron": "cron-expr leaf->util/cron; DO-alarm->jobs/do-runner; triggers config = host",
    "@platform-modules/risk": "fraud = affiliate/fraud capability; extract on 2nd non-affiliate consumer",
    "@platform-modules/returns": "recipe only (helpdesk substrate + payments refund); WATCH near payments; never a helpdesk case-type",
    "@platform-modules/kv-store": "failed Gate-1 (~20-line binding wrapper, not shared logic)",
    "cache/http": "-> util/http-cache-headers leaf",
    "entitlements (prior disposition, REVERSED 2026-06-17)": "was: NOT a module — gate->auth/entitlements; limits->billing; tier->tenancy; cap->uploads/quota. REVERSED: ×2 convergent seam (zync tier-ordering + ForumZone feature-limits), deletion test PASS → now @platform-modules/entitlements (L2, designed). See modules.@platform-modules/entitlements."
  },
  "watch": {
    "@platform-modules/db-d1": "x1 D1 story",
    "@platform-modules/promotions": "x1 mature (multideal); trance trivial+incompatible",
    "@platform-modules/inventory": "x2 structurally incompatible (PG FOR-UPDATE vs CF-DO RAM counter)",
    "@platform-modules/community": "x1 (ForumZone-only, all 6 sub-concerns)",
    "integrations": "NEW class (zync: slack/jira/asana/zapier/make) — x1 WATCH, forward-need for SaaS (ledger #6)",
    "outbound-webhook-delivery": "x2 now (zync hardened + others) — re-dispose (ledger #5)"
  },
  "excluded": {
    "ticketing": "EXCLUDED 2026-06-16 — event ticketing is the PROPRIETARY CORE PRODUCT of trance-shop-israel, not generic substrate. Harvesting a donor's own flagship product as a module is out of scope regardless of census count. Reusable substrate (auth/realtime/jobs/ledger) already ships; an adopter composes those. Do NOT re-promote from census (supersedes ledger #7 WATCH)."
  },
  "deliveryStages.rejected": {
    "generator-upgrade-engine": "mod.manifest.json + drift markers + mod-upgrade CLI + codemods + patchability classes — Gate-1 FAIL: zero blueprints built, zero consumers. Do not build before one blueprint has drifted.",
    "framework-swappability-claim": "surface targets choose shape at GENERATION time only; real apps mutate routes/layouts/cookies — frameworks are NOT swappable post-gen (per 05-surface-targets.md, correctly)",
    "ui-react-module": "@platform-modules/ui-react (a unified visual-primitive library) — disposition RUN 2026-06-16, KILLED. (1) convergence>count fails: 2/3 donors converge on Radix, not a shared internal contract, 3rd hand-rolled. (2) delete-test fails: Radix already meets the generic accessible-primitive need (cron/cache-http/kv-store bucket). (3) a unified ui-react is the fan-in UMBRELLA the react-packaging decision + CLAUDE.md §6 already reject. Consumers bring Radix/shadcn; headless behavior→<core>-react siblings; styled composites→template/host. PRODUCT-vs-MODULE: this kills the MODULE only; a SEPARATE mod-based UI PRODUCT (own repo/brand) is a live, demand-VALIDATED, build-GATED direction — see deliveryStages.ui-primitives.product_note + docs/specs/2026-06-16-ui-product-brief.md. Do NOT re-kill the product. | RECONCILED 2026-06-16 (owner decision): the live form is NOT a separate repo/brand but a FLAT @platform-modules/ui-* FAMILY INSIDE mod (ui-tokens/ui-util/ui-primitives) on the framework/presentation axis — supersedes the 'own repo/brand' framing above. Only the UMBRELLA (one unified ui-react) stays killed; flat focused siblings are the anti-umbrella (fan-OUT foundation others depend on, not a fan-IN hub) and pass the delete-test the umbrella failed — swap-survival lives in engine-agnostic ui-tokens, ui-primitives is opinionated Radix batteries on top. 'Consumer brings Radix' → ui-primitives adopts Radix as its internal engine. Build still GATED (design/roadmap, not available)."
  },
  "plugins._not_plugins": "api-keys + webhooks-outbound are NOT standalone plugins — harvest api-keys into @platform-modules/auth as a subpath (forward-need, every public API); webhooks-outbound flagged for re-disposition (x5 donors, zync hardened). See wasp-map §6.",
  "templates._census_gaps": [
    "delete-account",
    "web-push optin",
    "media-library",
    "maintenance page",
    "empty-states",
    "setup-checklist",
    "public newsletter-signup",
    "social-OAuth callback"
  ]
}
