The asset manifest is a json file named either application.js.json or application.css.json.
By default, they are located in the app/assets directory, see the options section to change their location.
The manifest files contain an array of filenames and directory names that will be used to build the asset.

Files are included in the order they are specified in the manifest.
Directories will recursively include all matching files (js or hbs for javascripts, css or less for stylesheets)

No file will be included twice, even if it matches multiple file or directory listings.

If certain files need to be included before others, specify those files first, ex:

When an asset request is processed, response headers are set to maximize the chance of client caching.

Each browser uses a set of heuristics to determine if files should be downloaded, or served from cache.
Asset builder follows Google's optimize caching recommendations to maximize the chance of client caching.

There are three possible client actions:

Makes a normal GET request and downloads the asset.

Makes an If-Modified-Since request, and either downloads the asset or uses the cached version depending on response.

Makes no requests at all, and uses the cached copy of the asset.

Clearly, option 3 is most desirable.
In order to maximize the chances of full caching, Asset Builder sets the following headers:

Sets the Expires header to be one year from now

Sets the Last-Modified header to be one month ago

Sets the Cache-Control header to public to enable caching of assets served over ssl

In production mode, assets are only built once, and served from cache thereafter.
The link helpers generate links based on the SHA256 hash of the asset content, so the links will only change when the content of the assets change.