{
  "schemaVersion": "0.1.0",
  "generatedAt": "2026-07-29T15:48:35.660Z",
  "snapshotDate": "2026-07-28",
  "components": [
    {
      "id": "spine",
      "title": "Spine",
      "repo": "spine",
      "packages": [
        {
          "name": "@pegma/spine",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/spine"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "The small, stable contracts every component shares.",
      "owns": [
        "PrincipalId and IsoTimestamp — shared identity and time types",
        "Clock — time as an injected, test-fixable input",
        "Logger — a one-method structured logging port",
        "Typed event declarations and a best-effort in-process bus"
      ],
      "refuses": [
        "Durable events — anything that must survive a crash goes to a storage-backed outbox, never the in-process bus",
        "Growth — the more spine changes, the more the ecosystem churns"
      ],
      "dependencies": [],
      "adapters": [],
      "hostMustProvide": [
        "Composition-root wiring for Clock, Logger, and any in-process bus subscribers"
      ],
      "capabilityTags": [
        "logging",
        "events_in_process"
      ],
      "recipeIds": [
        "cf-passkey-accounts",
        "storage-audit-mail-outbox",
        "durable-auth-rate-limits",
        "health-public-liveness",
        "logger-tee-composition",
        "inbound-webhook-receipts",
        "support-queue-slice"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/spine",
        "readme": "https://github.com/pegma-dev/spine#readme",
        "npm": "https://www.npmjs.com/package/@pegma/spine"
      },
      "now": "0.1.1 on npm; deliberately close to frozen."
    },
    {
      "id": "storage-core",
      "title": "Storage Core",
      "repo": "storage-core",
      "packages": [
        {
          "name": "@pegma/storage-core",
          "version": "0.4.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-core"
        },
        {
          "name": "@pegma/storage-azure-tables",
          "version": "0.4.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-azure-tables"
        },
        {
          "name": "@pegma/storage-cloudflare-d1",
          "version": "0.4.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-cloudflare-d1"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Persistence without the component knowing what the database is.",
      "owns": [
        "Declared collections with codecs — schema-agnostic on purpose",
        "update deciders re-run against fresh state on every conflict",
        "Version-conditional deletes for safe sweeps",
        "Single-collection, single-partition transactions",
        "A conformance suite adapters must pass — verified against a real Azurite table service, never a fake"
      ],
      "refuses": [
        "Server-side queries and secondary indexes",
        "Cross-partition anything",
        "Compatibility layers for pre-existing data layouts — Pegma targets net-new projects"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires",
          "note": "Shared contracts and Logger"
        }
      ],
      "adapters": [
        {
          "id": "memory",
          "packageName": "@pegma/storage-core",
          "host": "memory",
          "when": "Tests and local sketches; not a production durability claim"
        },
        {
          "id": "azure-tables",
          "packageName": "@pegma/storage-azure-tables",
          "host": "azure",
          "when": "Azure-hosted apps using the Tables adapter"
        },
        {
          "id": "cloudflare-d1",
          "packageName": "@pegma/storage-cloudflare-d1",
          "host": "cloudflare",
          "when": "Cloudflare Workers/Pages with D1"
        }
      ],
      "hostMustProvide": [
        "Chosen adapter binding (D1 database, Azure connection, or memory for tests)",
        "Collection declarations and codecs"
      ],
      "capabilityTags": [
        "storage",
        "cloudflare",
        "azure"
      ],
      "recipeIds": [
        "cf-passkey-accounts",
        "storage-audit-mail-outbox",
        "durable-auth-rate-limits",
        "inbound-webhook-receipts",
        "support-queue-slice"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/storage-core",
        "readme": "https://github.com/pegma-dev/storage-core#readme",
        "npm": "https://www.npmjs.com/package/@pegma/storage-core"
      },
      "now": "0.4.0 on npm with Azure Tables and Cloudflare D1 adapters; both adapters pass the same conformance suite."
    },
    {
      "id": "storage-blobs",
      "title": "Storage Blobs",
      "repo": "storage-blobs",
      "packages": [
        {
          "name": "@pegma/storage-blobs",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-blobs"
        },
        {
          "name": "@pegma/storage-azure-blob",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-azure-blob"
        },
        {
          "name": "@pegma/storage-cloudflare-r2",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-cloudflare-r2"
        },
        {
          "name": "@pegma/storage-s3",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/storage-s3"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Opaque object bytes through a narrow port — the counterpart to storage-core records.",
      "owns": [
        "Streaming put/get, head, delete, and etag-conditioned writes for one container/bucket",
        "Bounded prefix listing for retention and GC",
        "A conformance suite every adapter must pass against a real empty backend",
        "Thin adapters for Azure Blob, Cloudflare R2, and S3-compatible endpoints"
      ],
      "refuses": [
        "Client-facing signed URLs as the default path — hosts authorize on the API",
        "Authorization, rate limits, malware scanning, or attachment lifecycle inside the store",
        "Cross-object transactions or server-side query by metadata"
      ],
      "dependencies": [],
      "adapters": [],
      "hostMustProvide": [],
      "capabilityTags": [],
      "recipeIds": [],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/storage-blobs",
        "plan": "https://github.com/pegma-dev/storage-blobs/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/storage-blobs#readme",
        "npm": "https://www.npmjs.com/package/@pegma/storage-blobs"
      },
      "now": "0.1.0 on npm with Azure Blob, R2, and S3 adapters; first consumer planned is Support Desk attachments.",
      "stage": "Phase 6 complete. @pegma/storage-blobs@0.1.0 and the Azure Blob, Cloudflare R2, and S3 adapters are on npm with trusted-publisher provenance from the signed v0.1.0 release."
    },
    {
      "id": "authorization-core",
      "title": "Authorization Core",
      "repo": "authorization-core",
      "packages": [
        {
          "name": "@pegma/authorization-contracts",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-contracts"
        },
        {
          "name": "@pegma/authorization-core",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-core"
        },
        {
          "name": "@pegma/authorization-policy",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-policy"
        },
        {
          "name": "@pegma/authorization-auth0",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-auth0"
        },
        {
          "name": "@pegma/authorization-stripe",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-stripe"
        },
        {
          "name": "@pegma/authorization-storage",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-storage"
        },
        {
          "name": "@pegma/authorization-tokens",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-tokens"
        },
        {
          "name": "@pegma/authorization-identity",
          "version": "0.1.2",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/authorization-identity"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Provider-neutral roles, entitlements, and permissions between identity, billing, and your API.",
      "owns": [
        "Principals, roles, entitlements, permissions, and versioned policy",
        "Deterministic resolution: trusted facts in, effective permissions out",
        "Auth0 and Stripe adapters; storage over Storage Core",
        "Short-lived signed access grants (ES256, single-use)"
      ],
      "refuses": [
        "Being an identity provider or processing payments",
        "Organization scope in v1",
        "Offline commercial licensing — a different artifact entirely",
        "Email as an authentication or authorization key"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "optional",
          "note": "When using storage-backed authorization adapters"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Trusted identity/billing facts at the composition root",
        "Policy versioning and permission checks at the HTTP boundary"
      ],
      "capabilityTags": [
        "authorization"
      ],
      "recipeIds": [
        "cf-passkey-accounts"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/authorization-core",
        "plan": "https://github.com/pegma-dev/authorization-core/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/authorization-core#readme",
        "npm": "https://www.npmjs.com/package/@pegma/authorization-contracts"
      },
      "now": "0.1.2 on npm; the Identity claims adapter is composed by this Cloudflare reference application.",
      "stage": "Phase 5 complete; Phase 6 integration feedback and stabilization next (the signed v0.1.0 release published the original seven packages through OIDC with provenance on 2026-07-27; synchronized v0.1.2 corrects the pre-publish v0.1.1 release-test failure and first advertises Identity as the eighth package; 0.x public API remains unstable)"
    },
    {
      "id": "audit",
      "title": "Audit",
      "repo": "audit",
      "packages": [
        {
          "name": "@pegma/audit",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/audit"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Append-only audit records that commit atomically with the change they describe.",
      "owns": [
        "One audit vocabulary — actor, subject, event, idempotency — for every component",
        "A TransactionAction the caller includes in its own transact call"
      ],
      "refuses": [
        "Owning a store, a collection, or a partition — an audit record a component writes separately can lie; one inside the caller’s transaction cannot",
        "Tamper-evidence, SIEM ambitions, global ordering"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires",
          "note": "Audit rows commit inside the caller’s storage transaction"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Caller-owned storage transaction that includes the audit TransactionAction"
      ],
      "capabilityTags": [
        "audit",
        "storage"
      ],
      "recipeIds": [
        "storage-audit-mail-outbox"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/audit",
        "plan": "https://github.com/pegma-dev/audit/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/audit#readme",
        "npm": "https://www.npmjs.com/package/@pegma/audit"
      },
      "now": "0.1.0 on npm; awaiting its first integrated consumer.",
      "stage": "Phase 1 complete; awaiting the first real consumer (0.1.0 published, public API unstable)"
    },
    {
      "id": "support-desk",
      "title": "Support Desk",
      "repo": "support-desk",
      "packages": [
        {
          "name": "@pegma/support-desk-contracts",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/support-desk-contracts"
        },
        {
          "name": "@pegma/support-desk-core",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/support-desk-core"
        },
        {
          "name": "@pegma/support-desk-application",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/support-desk-application"
        },
        {
          "name": "@pegma/support-desk-templates",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/support-desk-templates"
        }
      ],
      "status": "in_development",
      "publishUsability": "usable",
      "summary": "A composable support queue for web and email, authorized by permissions from day one.",
      "owns": [
        "Tickets, channel-neutral messages, and requester trust levels",
        "Outbox-backed mail delivery — the state change and its delivery job commit in one transaction",
        "Inbound mailbox handling: threading, matching, abuse limits"
      ],
      "refuses": [
        "Being a hosted SaaS — hosts run it, own its data, and choose its providers",
        "AI processing before the host documents what may leave its boundary"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires"
        },
        {
          "componentId": "mail",
          "kind": "requires"
        },
        {
          "componentId": "authorization-core",
          "kind": "requires"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Host runtime and data ownership (not a hosted SaaS)",
        "Mail provider and permission model"
      ],
      "capabilityTags": [
        "support_queue",
        "mail_transactional"
      ],
      "recipeIds": [
        "support-queue-slice"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/support-desk",
        "plan": "https://github.com/pegma-dev/support-desk/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/support-desk#readme",
        "npm": "https://www.npmjs.com/package/@pegma/support-desk-contracts"
      },
      "now": "The customer Phase 1/2 application slice and provider-neutral Phase 6 mail source are implemented; abuse limits and deployment phases remain open, and all packages are unpublished.",
      "stage": "The customer-facing Phase 1/2 application slice, staff detail and mutation services (Buildout Task 4), the staff queue repairable projection (Buildout Task 5), the host-neutral release candidate (Buildout Task 6), and the source portion of Phase 6 are implemented. Buildout Tasks 1–6 are complete in source; the exact 0.1.0 package set is prepared for publication. Host deployments remain open until those packages are on the public registry."
    },
    {
      "id": "webhooks",
      "title": "Webhooks",
      "repo": "webhooks",
      "packages": [
        {
          "name": "@pegma/webhooks",
          "version": null,
          "published": false
        }
      ],
      "status": "in_development",
      "publishUsability": "unpublished",
      "summary": "Inbound webhook receipts: idempotent dedup, poison quarantine, retention.",
      "owns": [
        "One receipt per provider event id — the durable answer to “did we already process this?”",
        "Quarantine-then-acknowledge after bounded failures, ending retry storms",
        "Version-conditional retention sweeps"
      ],
      "refuses": [
        "Exactly-once delivery — does not exist; will not be pretended",
        "Ordering guarantees — domain logic, deliberately excluded",
        "Storing payloads — receipts hold ids and counters, never customer data"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "HTTP endpoint and provider signature verification",
        "Storage binding for the receipt ledger"
      ],
      "capabilityTags": [
        "webhooks_inbound"
      ],
      "recipeIds": [
        "inbound-webhook-receipts"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/webhooks",
        "plan": "https://github.com/pegma-dev/webhooks/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/webhooks#readme"
      },
      "now": "Phase 2 consumer migration is merged; operational exit awaits production Stripe traffic. Phase 3 is gated on a second real provider; unpublished.",
      "stage": "Phase 2 first-consumer migration implemented in RetireGolden; operational exit pending production Stripe traffic (0.x, public API unstable, unpublished)"
    },
    {
      "id": "sessions",
      "title": "Sessions",
      "repo": "sessions",
      "packages": [
        {
          "name": "@pegma/sessions",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/sessions"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Server-side session records: hashed ids, dual expiry, revoke-everywhere.",
      "owns": [
        "SHA-256-hashed identifiers, non-optionally — a leaked table hands out no sessions",
        "Absolute plus idle expiry through one liveness predicate",
        "Principal-wide revocation that wins races; hygiene sweeps that lose them"
      ],
      "refuses": [
        "Authentication — no OIDC, cookies, or CSRF; the host logs people in, this store remembers",
        "Tokens at rest, ever"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Authentication (login) at the host",
        "Cookie/session HTTP boundary and CSRF strategy"
      ],
      "capabilityTags": [
        "sessions"
      ],
      "recipeIds": [
        "cf-passkey-accounts"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/sessions",
        "plan": "https://github.com/pegma-dev/sessions/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/sessions#readme",
        "npm": "https://www.npmjs.com/package/@pegma/sessions"
      },
      "now": "0.1.0 on npm; RetireGolden is the first integrated consumer and this site is the second, live consumer; early 0.x API remains unstable.",
      "stage": "Phases 1–4 are complete. @pegma/sessions@0.1.0 is published; RetireGolden is the first integrated consumer and pegma.dev is the second, live consumer. The public API remains unstable."
    },
    {
      "id": "mail",
      "title": "Mail",
      "repo": "mail",
      "packages": [
        {
          "name": "@pegma/mail",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/mail"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Transactional mail: provider ports and an outbox pattern that owns no store.",
      "owns": [
        "A delivery-job projection committed in the CALLER’s transaction — the lost-send gap closed by construction",
        "A lease-claiming delivery worker: bounded retries, dead jobs kept as durable human-visible rows",
        "A narrow send port with mandatory idempotency keys; provider adapters on consumer pull"
      ],
      "refuses": [
        "Owning an outbox store — single-partition transactions make an owned outbox incapable of the promised atomicity (the audit precedent)",
        "Inbound mail, bulk/marketing sending, rich templating",
        "Deliverability abstraction — SPF/DKIM/DMARC live in the host’s DNS"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires",
          "note": "Outbox jobs live in the caller’s store"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Outbox collection in host storage",
        "Provider adapter and delivery worker schedule",
        "DNS for SPF/DKIM/DMARC"
      ],
      "capabilityTags": [
        "mail_transactional"
      ],
      "recipeIds": [
        "cf-passkey-accounts",
        "storage-audit-mail-outbox",
        "support-queue-slice"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/mail",
        "plan": "https://github.com/pegma-dev/mail/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/mail#readme",
        "npm": "https://www.npmjs.com/package/@pegma/mail"
      },
      "now": "0.1.0 on npm; extracted from Support Desk and now shared by Support Desk and Identity.",
      "stage": "Phases 1–3 are complete. @pegma/mail@0.1.0 is published and is composed by both Identity and Support Desk. The public API remains unstable."
    },
    {
      "id": "billing-core",
      "title": "Billing Core",
      "repo": "billing-core",
      "packages": [
        {
          "name": "@pegma/billing-core",
          "version": null,
          "published": false
        }
      ],
      "status": "planned",
      "publishUsability": "unpublished",
      "summary": "A provider-agnostic subscription ledger, maintained correctly under out-of-order webhook delivery.",
      "owns": [
        "The event-arbitration guard: a per-account watermark, a snapshot freshness bound, and lifecycle-rank tie-breaking so a stale active can never resurrect a same-second canceled",
        "Snapshot reconciliation that repairs field drift without disturbing the dedup identity of events",
        "Declared ledger invariants (sticky, first-wins) enforced inside the write path, and an atomic single-opportunity checkout reservation"
      ],
      "refuses": [
        "Processing payments, checkout flows, invoicing, tax, and metering — provider products; the ledger records lifecycle outcomes",
        "Entitlement resolution — what a subscription grants is Authorization Core’s job; this is what it is",
        "Card data, raw payloads, line items, amounts — the ledger stores identifiers and derived state only"
      ],
      "dependencies": [],
      "adapters": [],
      "hostMustProvide": [],
      "capabilityTags": [],
      "recipeIds": [],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/billing-core",
        "plan": "https://github.com/pegma-dev/billing-core/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/billing-core#readme"
      },
      "now": "Plan published; extraction from the reference application’s production ledger is scheduled deliberately.",
      "stage": "planning; nothing extracted yet. Implementation is scheduled deliberately — the extraction source must finish its current migrations first (see Timing). (0.x, unpublished.)"
    },
    {
      "id": "identity",
      "title": "Identity",
      "repo": "identity",
      "packages": [
        {
          "name": "@pegma/identity",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/identity"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "First-party identity: passkeys-first, email-code fallback, no passwords.",
      "owns": [
        "Account creation, passkey sign-in, and email one-time codes for enrollment, fallback, and recovery",
        "User records in the host’s own storage — no external provider",
        "Enumeration resistance as a test-pinned property, and an honestly stated email-recovery security floor"
      ],
      "refuses": [
        "Passwords — not a phase, a refusal: no password table, no reset flow, no breach class",
        "Being an OIDC/OAuth2 server for third parties",
        "Social login — external providers exist for that, and issuer-namespaced links let a host run both"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "requires"
        },
        {
          "componentId": "sessions",
          "kind": "requires"
        },
        {
          "componentId": "mail",
          "kind": "composes_with",
          "note": "Email codes"
        },
        {
          "componentId": "rate-limit",
          "kind": "composes_with",
          "note": "Durable limits on expensive auth paths"
        },
        {
          "componentId": "authorization-core",
          "kind": "composes_with",
          "note": "Identity claims adapter"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "HTTP routes and cookie boundary",
        "WebAuthn relying-party configuration",
        "Email provider and secrets",
        "Any account UI"
      ],
      "capabilityTags": [
        "accounts",
        "passkeys",
        "email_codes",
        "sessions",
        "authorization",
        "mail_transactional"
      ],
      "recipeIds": [
        "cf-passkey-accounts"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/identity",
        "plan": "https://github.com/pegma-dev/identity/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/identity#readme",
        "npm": "https://www.npmjs.com/package/@pegma/identity"
      },
      "now": "0.1.0 on npm; composed here with Sessions, durable rate limits, Mail, and Cloudflare D1.",
      "stage": "Phases 1–4 are complete. @pegma/identity@0.1.0 is published and live in pegma.dev with @pegma/authorization-identity@0.1.2. The public API remains unstable."
    },
    {
      "id": "rate-limit",
      "title": "Rate Limit",
      "repo": "rate-limit",
      "packages": [
        {
          "name": "@pegma/rate-limit",
          "version": "0.1.0",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/rate-limit"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Two honest tiers: in-memory abuse dampening, durable limits for expensive operations.",
      "owns": [
        "A per-instance sliding window that says it is per-instance",
        "A durable fixed-window counter that fails closed and refuses read-only under attack"
      ],
      "refuses": [
        "Pretending a per-instance window is a global quota — choosing a tier is mandatory",
        "DDoS protection — volumetric defense belongs at the edge",
        "Middleware and usage metering"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "optional",
          "note": "Required for the durable fixed-window tier"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Explicit tier choice (memory vs durable) per path",
        "Storage binding when using the durable tier"
      ],
      "capabilityTags": [
        "rate_limit_durable",
        "rate_limit_memory"
      ],
      "recipeIds": [
        "cf-passkey-accounts",
        "durable-auth-rate-limits"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/rate-limit",
        "plan": "https://github.com/pegma-dev/rate-limit/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/rate-limit#readme",
        "npm": "https://www.npmjs.com/package/@pegma/rate-limit"
      },
      "now": "0.1.0 on npm; durable fixed-window policies are composed by the production Identity worker.",
      "stage": "Phases 1, 2, and 4 are complete; Phase 3 has its first production consumer. @pegma/rate-limit@0.1.0 is published, and pegma.dev composes the durable tier for its Identity surface. The public API remains unstable."
    },
    {
      "id": "logger-adapters",
      "title": "Logger Adapters",
      "repo": "logger-adapters",
      "packages": [
        {
          "name": "@pegma/logger-tee",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/logger-tee"
        },
        {
          "name": "@pegma/logger-applicationinsights",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/logger-applicationinsights"
        },
        {
          "name": "@pegma/logger-cloudflare",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/logger-cloudflare"
        },
        {
          "name": "@pegma/logger-datadog",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/logger-datadog"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Thin Spine Logger implementations for Application Insights, Cloudflare Workers Logs, and multi-sink teeing.",
      "owns": [
        "Factories that implement Spine’s one-method Logger for named sinks",
        "A tee that fans one Logger out to many sinks at the composition root"
      ],
      "refuses": [
        "A logging-core or Pegma-owned observability vocabulary — the port stays in Spine",
        "Traces, metrics, APM, or SIEM — hosts use OpenTelemetry or vendor SDKs beside Pegma",
        "Growing Spine with sink SDKs"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires",
          "note": "Implements Spine Logger"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Composition-root Logger wiring (e.g. tee + sink factories)",
        "Vendor credentials/config for chosen sinks"
      ],
      "capabilityTags": [
        "logging"
      ],
      "recipeIds": [
        "logger-tee-composition"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/logger-adapters",
        "plan": "https://github.com/pegma-dev/logger-adapters/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/logger-adapters#readme",
        "npm": "https://www.npmjs.com/package/@pegma/logger-tee"
      },
      "now": "0.1.1 on npm; trusted publishing configured. Host tee wiring next.",
      "stage": "0.1.1 on npm (tee, Application Insights, Cloudflare, Datadog); trusted publishing configured; OIDC publish workflow in-repo. Public API unstable. Host tee wiring on RetireGolden and pegma.dev is the remaining consumer bar."
    },
    {
      "id": "health",
      "title": "Health",
      "repo": "health",
      "packages": [
        {
          "name": "@pegma/health",
          "version": "0.1.1",
          "published": true,
          "npmUrl": "https://www.npmjs.com/package/@pegma/health"
        }
      ],
      "status": "published",
      "publishUsability": "usable",
      "summary": "Composable health probes and HTTP responses for public liveness checks.",
      "owns": [
        "Check contracts, aggregation, and HTTP status mapping",
        "Process, detail, and injected Store ping helpers",
        "Spine log events health.ok / health.degraded / health.failed"
      ],
      "refuses": [
        "Owning a storage adapter or inventing domain collections",
        "Autodiscovery of checks — hosts register them at the composition root",
        "Metrics, APM, or alert fan-out"
      ],
      "dependencies": [
        {
          "componentId": "spine",
          "kind": "requires"
        },
        {
          "componentId": "storage-core",
          "kind": "optional",
          "note": "When registering a store ping check"
        }
      ],
      "adapters": [],
      "hostMustProvide": [
        "Explicit check registration at the composition root",
        "HTTP route that returns health responses"
      ],
      "capabilityTags": [
        "health"
      ],
      "recipeIds": [
        "health-public-liveness"
      ],
      "links": {
        "githubRepo": "https://github.com/pegma-dev/health",
        "plan": "https://github.com/pegma-dev/health/blob/main/docs/PROJECT_PLAN.md",
        "readme": "https://github.com/pegma-dev/health#readme",
        "npm": "https://www.npmjs.com/package/@pegma/health"
      },
      "now": "0.1.1 on npm; trusted publishing configured.",
      "stage": "0.1.1 on npm; trusted publishing configured. Public API unstable."
    }
  ],
  "recipes": [
    {
      "id": "cf-passkey-accounts",
      "intent": "A small Cloudflare Worker host for a fictional community library (Northshelf Branch) offers first-party accounts: passkey sign-in, email one-time codes for enrollment and recovery, server-side sessions, and durable rate limits on expensive auth paths. No passwords.",
      "packages": [
        "@pegma/identity@0.1.0",
        "@pegma/sessions@0.1.0",
        "@pegma/mail@0.1.0",
        "@pegma/rate-limit@0.1.0",
        "@pegma/authorization-identity@0.1.2",
        "@pegma/storage-core@0.4.0",
        "@pegma/storage-cloudflare-d1@0.4.0",
        "@pegma/spine@0.1.1"
      ],
      "adapters": [
        {
          "componentId": "storage-core",
          "adapterId": "cloudflare-d1"
        }
      ],
      "hostResponsibilities": [
        "HTTP routes and cookie/session boundary",
        "WebAuthn relying-party configuration",
        "Email provider adapter and DNS",
        "Secrets and any account UI"
      ],
      "nonGoals": [
        "Social login",
        "OIDC server for third parties",
        "Passwords",
        "Multi-tenant organizations"
      ],
      "antiPatterns": [
        "Password table or reset flow",
        "Durable events on Spine in-process bus",
        "Mail package owning its own outbox store"
      ],
      "fixture": {
        "kind": "recipe_package",
        "citation": "https://github.com/pegma-dev/pegma.dev/tree/main/recipes/cf-passkey-accounts",
        "status": "green"
      },
      "capabilityTags": [
        "accounts",
        "passkeys",
        "email_codes",
        "sessions",
        "authorization",
        "mail_transactional",
        "rate_limit_durable",
        "storage",
        "cloudflare"
      ],
      "requiresPublished": [
        "identity",
        "sessions",
        "mail",
        "rate-limit",
        "authorization-core",
        "storage-core",
        "spine"
      ],
      "backlogPriority": 1
    },
    {
      "id": "storage-audit-mail-outbox",
      "intent": "A fictional equipment checkout service (Yard Loan) records inventory mutations in Storage Core and, in the same single-partition transaction, appends an audit row and enqueues a transactional mail delivery job.",
      "packages": [
        "@pegma/storage-core@0.4.0",
        "@pegma/audit@0.1.0",
        "@pegma/mail@0.1.0",
        "@pegma/spine@0.1.1"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "Collection declarations",
        "Transaction boundary",
        "Durable storage-core adapter for production (not memory)",
        "Outbox collection in host storage",
        "Mail provider and delivery worker schedule"
      ],
      "nonGoals": [
        "Mail-owned outbox store",
        "Audit-owned store",
        "Cross-partition transactions"
      ],
      "antiPatterns": [
        "Send email after commit without an outbox job in the same transaction",
        "Audit write outside the caller transact"
      ],
      "fixture": {
        "kind": "recipe_package",
        "citation": "https://github.com/pegma-dev/pegma.dev/tree/main/recipes/storage-audit-mail-outbox",
        "status": "green"
      },
      "capabilityTags": [
        "storage",
        "audit",
        "mail_transactional"
      ],
      "requiresPublished": [
        "storage-core",
        "audit",
        "mail",
        "spine"
      ],
      "backlogPriority": 2
    },
    {
      "id": "durable-auth-rate-limits",
      "intent": "A fictional API for appointment holds (Chair Queue) applies durable fixed-window rate limits to expensive verification endpoints and an honest in-memory tier only for cheap abuse dampening.",
      "packages": [
        "@pegma/rate-limit",
        "@pegma/storage-core",
        "@pegma/spine"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "Explicit tier choice per path",
        "Storage binding for durable counters"
      ],
      "nonGoals": [
        "Volumetric DDoS protection at the app tier"
      ],
      "antiPatterns": [
        "Using only in-memory limits for email-code or passkey verify",
        "Calling the memory tier a cluster quota"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#p3--durable-auth-rate-limits",
        "status": "pending"
      },
      "capabilityTags": [
        "rate_limit_durable",
        "rate_limit_memory",
        "storage"
      ],
      "requiresPublished": [
        "rate-limit",
        "storage-core",
        "spine"
      ],
      "backlogPriority": 3
    },
    {
      "id": "health-public-liveness",
      "intent": "A fictional brochure site Worker exposes a public liveness endpoint composed from @pegma/health probes with checks registered at an explicit composition root.",
      "packages": [
        "@pegma/health",
        "@pegma/spine"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "HTTP health route",
        "Explicit check registration at the composition root"
      ],
      "nonGoals": [
        "APM, metrics, or alert fan-out"
      ],
      "antiPatterns": [
        "Autodiscovery of checks",
        "Health package inventing domain collections"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#p4--health-public-liveness",
        "status": "pending"
      },
      "capabilityTags": [
        "health"
      ],
      "requiresPublished": [
        "health",
        "spine"
      ],
      "backlogPriority": 4
    },
    {
      "id": "logger-tee-composition",
      "intent": "A fictional batch importer (Ledger Drop) wires Spine Logger once at the composition root through @pegma/logger-tee into Cloudflare Workers Logs.",
      "packages": [
        "@pegma/spine",
        "@pegma/logger-tee",
        "@pegma/logger-cloudflare"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "Composition-root Logger wiring",
        "Sink configuration"
      ],
      "nonGoals": [
        "Pegma-owned traces, metrics, or APM"
      ],
      "antiPatterns": [
        "Putting sink SDKs into Spine",
        "Replacing Logger with a custom observability core"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#p5--logger-tee-composition",
        "status": "pending"
      },
      "capabilityTags": [
        "logging"
      ],
      "requiresPublished": [
        "spine",
        "logger-adapters"
      ],
      "backlogPriority": 5
    },
    {
      "id": "static-brochure-minimal",
      "intent": "A fictional static museum site (Glass Wing) needs no accounts, no durable storage, and no mail — teaching agents to select nothing extra.",
      "packages": [],
      "adapters": [],
      "hostResponsibilities": [
        "Static hosting only"
      ],
      "nonGoals": [
        "Accounts, sessions, databases"
      ],
      "antiPatterns": [
        "Pulling identity/sessions for later",
        "Inventing a database for a static site"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#p6--static-brochure-minimal",
        "status": "pending"
      },
      "capabilityTags": [
        "static_host"
      ],
      "requiresPublished": [],
      "backlogPriority": 6
    },
    {
      "id": "inbound-webhook-receipts",
      "intent": "A fictional donation platform (Copper Plate) records inbound provider webhook receipts with idempotent dedup and poison quarantine. Deferred until @pegma/webhooks is published.",
      "packages": [
        "@pegma/webhooks",
        "@pegma/storage-core",
        "@pegma/spine"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "HTTP endpoint",
        "Provider signature verification",
        "Storage for the receipt ledger"
      ],
      "nonGoals": [
        "Exactly-once delivery",
        "Payload archival in the receipt ledger"
      ],
      "antiPatterns": [
        "Claiming exactly-once processing",
        "Storing full webhook bodies in receipts"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#d1--inbound-webhook-receipts-when-pegmawebhooks-is-published",
        "status": "none"
      },
      "capabilityTags": [
        "webhooks_inbound"
      ],
      "requiresPublished": [
        "webhooks",
        "storage-core",
        "spine"
      ],
      "backlogPriority": 90
    },
    {
      "id": "support-queue-slice",
      "intent": "A fictional maker-space helpdesk (Bench Ticket) runs a composable support queue for web and email. Deferred until Support Desk packages are published.",
      "packages": [
        "@pegma/support-desk-contracts",
        "@pegma/support-desk-core",
        "@pegma/support-desk-application",
        "@pegma/mail",
        "@pegma/storage-core",
        "@pegma/spine"
      ],
      "adapters": [],
      "hostResponsibilities": [
        "Host runtime and data ownership",
        "Permission model and mail provider"
      ],
      "nonGoals": [
        "Hosted SaaS Support Desk",
        "AI on ticket bodies without documented egress"
      ],
      "antiPatterns": [
        "Treating Support Desk as multi-tenant SaaS",
        "AI processing before the host documents what may leave its boundary"
      ],
      "fixture": {
        "kind": "pending",
        "citation": "docs/catalog/RECIPE_BACKLOG.md#d2--support-queue-slice-when-support-desk-packages-are-published",
        "status": "none"
      },
      "capabilityTags": [
        "support_queue",
        "mail_transactional"
      ],
      "requiresPublished": [
        "support-desk",
        "mail",
        "storage-core",
        "spine"
      ],
      "backlogPriority": 91
    }
  ]
}