Stage a document and sync it

The repository shell above does not write documents/. It is the root-level document surface in every Project repository, alongside apps/ and templates/, and it holds committed YAML pointers while acting as temporary staging, not a second document store. Git keeps the pointer; Navigator keeps the bytes. Drop a local file below it, list what a sync would do, then run it:

Against a staged documents/exhibits/exhibit-a.png, the dry run prints one line per staged file and a count, and changes nothing:

The real run derives the document slug from its path below documents/, uploads the bytes through Navigator's authenticated API, writes exhibit-a.png.yml only after the upload succeeds, and then removes the staged file. It prints 1 uploaded. The pointer records kind, desired visibility, current revision metadata, and the previous asset id when the chain has one. It never contains an object-storage coordinate or legal-document bytes; object storage and the assets revision chain remain authoritative. Folder conventions infer filing for pleadings/, exhibit for exhibits/, and agreement for agreements/; other paths use unclassified. Visibility defaults to internal.

The real run needs a stored login — navigator site login --host <host-or-url> — and a matter with that code visible to the account. --dry-run needs neither. The first real run also creates documents/.gitignore without overwriting an existing file; until that first sync, nothing in the checkout stops git add from staging raw bytes. validate then rejects every file below documents/ that is not a *.yml pointer or that .gitignore: