Status. Proposed design only. Nothing in this vault is DG client approval. No application, service or test has been executed; every scenario is Not executed. Fees and dates are open.

Server contracts and request enforcement

Illustrative, not frozen (architecture rev 3 p. 8).

OperationIllustrative contractRequired guard
Company contextGET /v1/me/companyResolve exactly one active membership; never trust a client-supplied tenant id
Draft and publicationPOST /v1/opportunities; PATCH /v1/opportunities/{id}; POST /v1/opportunities/{id}/publishSchema validation, owning-company role/assignment, expected version, approval binding
DiscoveryGET /v1/opportunities; GET /v1/recommendationsAudience and active-status filtering before search, ranking, snippets, counts and pagination
Private question / interestPOST /v1/opportunities/{id}/questions or /expressionsAuthorised opportunity, no self-interest, meaningful fields, approved contributor submission, version reference, idempotency key
Accept discussionPOST /v1/expressions/{id}/acceptOwner-side authority, current response state, no duplicate discussion, state and notification event committed together
Messages / actionsGET/POST /v1/conversations/{id}/messages; POST /{id}/actionsParticipant-company access plus role/assignment; assignee eligibility; safe due date and completion transition
Team / administrationScoped invitation, membership and recovery endpointsCompany admin versus DG authority; MFA for DG; one-company restriction; audit sensitive changes
flowchart LR
  A[Authenticate<br/>valid session] --> B[Resolve membership<br/>active / one company] --> C[Authorise record<br/>role + assignment] --> D[Validate version / transition<br/>commit mutation + event]

Failure behaviour: consistent denial that never reveals whether an inaccessible record exists; actionable validation; safe stale-write conflict; rate-limited abuse and retryable requests. Security controls: secure session cookies, CSRF protection where applicable, input sanitisation, pagination, server-side secrets; database constraints and (if adopted) row policies as defence in depth.

Build step: Step-03-Policy-Pipeline-and-Isolation-Harness.