| Package Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Authorize namespace and create resumable content upload session. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Registry Edge. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Version metadata publishes before blob replication” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Package Client boundary before extracting or scaling it. |
| Registry Edge | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Verify digest/signature, scan bytes, and store immutable content-addressed blob. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Package Client from also owning the contract and failure behavior of Registry API. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Namespace typo enables dependency confusion” to Package Client. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Registry Edge boundary before extracting or scaling it. |
| Registry API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Atomically publish version metadata pointing only to ready blob. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Registry Edge from also owning the contract and failure behavior of Namespace Auth. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Malware verdict changes after download” to Registry Edge. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Registry API boundary before extracting or scaling it. |
| Namespace Auth | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Resolve constraints into exact versions/digests and cache immutable downloads at CDN. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Registry API from also owning the contract and failure behavior of Upload Session. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Popular package overloads origin” to Registry API. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Namespace Auth boundary before extracting or scaling it. |
| Upload Session | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Replicate blobs, index metadata, and enforce tombstone/retention policy with audit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Namespace Auth from also owning the contract and failure behavior of Metadata DB. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Maintainer tries to overwrite version” to Namespace Auth. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Upload Session boundary before extracting or scaling it. |
| Metadata DB | Owns authoritative versioned state or immutable evidence. In this design it participates in: Authorize namespace and create resumable content upload session. | Defines the source of truth and commit boundary. It prevents Upload Session from also owning the contract and failure behavior of Content Blob Store. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Version metadata publishes before blob replication” to Upload Session. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Metadata DB boundary before extracting or scaling it. |
| Content Blob Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Verify digest/signature, scan bytes, and store immutable content-addressed blob. | Defines the source of truth and commit boundary. It prevents Metadata DB from also owning the contract and failure behavior of Checksum / Signature. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Namespace typo enables dependency confusion” to Metadata DB. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Content Blob Store boundary before extracting or scaling it. |
| Checksum / Signature | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Atomically publish version metadata pointing only to ready blob. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Content Blob Store from also owning the contract and failure behavior of Malware Scanner. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Malware verdict changes after download” to Content Blob Store. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Checksum / Signature boundary before extracting or scaling it. |
| Malware Scanner | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Resolve constraints into exact versions/digests and cache immutable downloads at CDN. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Checksum / Signature from also owning the contract and failure behavior of Dependency Resolver. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Popular package overloads origin” to Checksum / Signature. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Malware Scanner boundary before extracting or scaling it. |
| Dependency Resolver | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Replicate blobs, index metadata, and enforce tombstone/retention policy with audit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Malware Scanner from also owning the contract and failure behavior of Search Index. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Maintainer tries to overwrite version” to Malware Scanner. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Dependency Resolver boundary before extracting or scaling it. |
| Search Index | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Authorize namespace and create resumable content upload session. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Dependency Resolver from also owning the contract and failure behavior of CDN. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Version metadata publishes before blob replication” to Dependency Resolver. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1B downloads/day · 100M versions · strong namespace integrity) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Search Index boundary before extracting or scaling it. |
| CDN | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Verify digest/signature, scan bytes, and store immutable content-addressed blob. | Removes repeated work from the latency-critical path. It prevents Search Index from also owning the contract and failure behavior of Replication Worker. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Namespace typo enables dependency confusion” to Search Index. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1B downloads/day · 100M versions · strong namespace integrity) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the CDN boundary before extracting or scaling it. |
| Replication Worker | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Atomically publish version metadata pointing only to ready blob. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents CDN from also owning the contract and failure behavior of Deletion / Tombstone. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Malware verdict changes after download” to CDN. | Costs leases, checkpoints, retries, DLQs, and lag operations. Separate once execution time or burstiness no longer fits the request deadline. Measure the latency, saturation, lag, or mismatch at the Replication Worker boundary before extracting or scaling it. |
| Deletion / Tombstone | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Resolve constraints into exact versions/digests and cache immutable downloads at CDN. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Replication Worker from also owning the contract and failure behavior of Audit / Provenance. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Popular package overloads origin” to Replication Worker. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Deletion / Tombstone boundary before extracting or scaling it. |
| Audit / Provenance | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Replicate blobs, index metadata, and enforce tombstone/retention policy with audit. | Proves correctness and supports controlled recovery. It prevents Deletion / Tombstone from also owning the contract and failure behavior of operators and repair tooling. | Infer correctness from request logs. Logs do not prove durable business state, detect silent drift, or safely repair ambiguous outcomes. Here that simpler choice would couple “Maintainer tries to overwrite version” to Deletion / Tombstone. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Audit / Provenance boundary before extracting or scaling it. |