Conformance rules
- Never retry an authorized refusal as an anonymous read inside a signed-in experience. Invalid bearer credentials do not become anonymous access.
- Stop protected publication when current authority or restriction proof is unavailable. Clear protected results and retire stale sessions instead of continuing from cached content.
- Do not serve stale replicas of canonical posts, profiles or social relationships. Revalidate before display; events and reconciliation support updating your view, not a license to ignore current admission. Do not use session-storage read replication to arbitrate refresh.
- Honor deleted and unavailable representations without reproducing the removed body. Do not restore content from an application cache after a network removal.
Reinstatement does not justify replaying a previously admitted body without current validation. Logout from an application ends its local session; user-controlled network grant revocation is a distinct lifecycle action.
Generation, incarnation and publication
Core admitted reads, including/api/session, carry x-sharedgraph-incarnation, x-sharedgraph-revision and x-sharedgraph-witness-epoch. Validate their syntax and preserve their association with the original response body. Missing or malformed stamps mean publication is unavailable, not that validation can be skipped.
x-sharedgraph-incarnation identifies the recovery incarnation. An incarnation change invalidates the prior publication context; revalidate and retire stale authority. x-sharedgraph-witness-epoch records independent restriction admission. Buffer a protected read, revalidate /api/session, and compare incarnation and witness epoch before releasing the body. Suppress it if either changed. x-sharedgraph-revision must be a valid nonnegative integer; do not require equality across unrelated requests, because unrelated bookkeeping can advance it.
The starter returns its browser generation in the JSON body of its own /session. The browser echoes it as x-app-generation on /network/*. A mismatch returns HTTP 409 and requires session revalidation. This is an application session signal, not a core response header and not a substitute for canonical grant or publication checks. Clear protected browser state when the session changes or validation becomes unavailable; revalidate when a hidden page returns. The starter revalidates active authority every four minutes and polls durable events every 15 seconds while visible and online. Known changes discard protected views before revalidation; offline, pagehide and freeze also clear them.
Safe mutation retries
Every social mutation carriesintentId in its JSON body: 1–100 ASCII letters, digits, underscores or hyphens. Generate one identifier per deliberate action and retain it for uncertain retries. There is no Idempotency-Key header in this contract.
Retry the same method, path and body under the same grant with the original identifier. The network stores a receipt per grant and intent and replays an admitted receipt rather than repeating the effect. Reusing the identifier for a different request returns HTTP 409 intent_conflict. Use a new identifier for a new action, never to blindly repeat an uncertain action. Receipts remain subject to current authority and availability; they are not reusable protected read views.
An edit also requires the current post revision. On revision_conflict, fetch the current admitted post and let the user reconcile the edit before submitting a new action. Successful mutations still need final principal and local session admission before returning their receipt. Never automatically retry writes after a network failure. If your UI offers explicit retry, preserve the intent separately from protected rendered content.