coordination-engine/spec/HybridmailBinectSpecification.md

1058 lines
34 KiB
Markdown
Raw Normal View History

2026-06-01 23:59:23 +02:00
# HybridmailBinectSpecification.md
## 1. Document Status
**Document:** HybridmailBinectSpecification.md
**Project:** hybridmail-connect
**Provider Flavor:** Binect
**Parent Specification:** HybridmailAdapterSpecification.md
**Target Integration:** coordination-engine
**Adapter Contract:** AdapterInterfaceSpecification.md v1.0
**Status:** Draft v1.0
**Primary Scope:** Binect-specific hybrid-mail provider flavor for document upload, validation, attachments, preview, sending, and status mapping.
## 2. Purpose
This document specifies the Binect provider flavor for `hybridmail-connect`.
The Binect flavor implements the generic hybrid-mail adapter model for the Binect API. It maps Binects document-centric API workflow into the provider-neutral hybrid-mail model used by `coordination-engine`.
The purpose of this document is to capture:
* Binect-specific provider capabilities.
* Binect-specific workflow stages.
* Binect document, attachment, preview, sending, and status concepts.
* Binect validation semantics.
* Binect print and shipping option mapping.
* Binect evidence event mapping.
* Binect-specific limitations and assumptions.
* Binect-specific MVP boundaries.
The Binect flavor MUST remain compatible with the generic `HybridmailAdapterSpecification.md` and MUST NOT leak Binect-specific terminology into the core coordination model except through explicitly mapped provider metadata.
## 3. Grounding Summary
The public Binect API material indicates the following relevant features:
* Binect provides a REST API for digital business-letter dispatch.
* The API supports document upload.
* Attachments can be added to letters.
* Supported attachment formats include `pdf`, `rtf`, `txt`, `png`, `jpg`, `jpeg`, `bmp`, `gif`, and `ps`.
* Attachment size is limited to 20 MB according to the public FAQ.
* The API supports setting print and shipping options.
* The API supports preview retrieval.
* The API supports sending after preparation.
* The API supports document and shipping status queries.
* Serial or child document status handling is relevant.
* Validation includes address position, address format, and restricted-area checks.
* Binect handles full-service physical dispatch including printing, enveloping/franking, and handover to Deutsche Post.
* Binect publicly positions the API as a way to integrate digital business-letter dispatch into DMS, CRM, and other software systems.
These facts define the baseline for this provider flavor.
## 4. Provider Flavor Identity
```yaml
HybridmailProviderFlavorDescriptor:
provider_name: binect
provider_label: Binect API
provider_family: hybridmail
adapter_contract_version: "1.0"
parent_specification: HybridmailAdapterSpecification.md
deployment_mode: external
```
## 5. Binect Capability Descriptor
The Binect flavor MUST expose a capability descriptor.
```yaml
HybridmailProviderFlavorDescriptor:
provider_name: binect
provider_version: provider_specific
supported_file_types:
- pdf
- postscript
supported_attachment_file_types:
- pdf
- rtf
- txt
- png
- jpg
- jpeg
- bmp
- gif
- ps
attachment_max_size_mb: 20
supports_single_letter: true
supports_bulk: true
supports_serial_letters: true
supports_attachments: true
supports_preview: true
supports_webhooks: provider_specific
supports_polling: true
supports_registered_mail: provider_specific
supports_delivery_confirmation: provider_specific
supports_return_mail: provider_specific
supports_address_correction: provider_specific
supports_international_mail: provider_specific
supports_cancellation: provider_specific
supports_staging: provider_specific
supports_idempotency: adapter_managed
supports_rate_limits: provider_specific
supports_cost_calculation: true
supports_document_status: true
supports_shipping_status: true
supports_child_document_status: true
supported_print_options:
color_mode: provider_specific
simplex_duplex: provider_specific
envelope_selection: provider_specific
address_position: true
attachment_starts_on_new_sheet: true
supported_postal_products:
- standard
- provider_specific
limitations:
- Public Binect documentation confirms status queries but does not establish ordinary postal final-delivery proof for all products.
- Public documentation confirms validation and preview concepts but implementation must rely on the live Binect Swagger/API for exact field names.
- Idempotency should be enforced by hybridmail-connect if not provided natively by the Binect endpoint used.
- Cancellation semantics must be treated as provider-specific and time-sensitive.
```
## 6. Binect-Specific Conceptual Workflow
The Binect flavor uses a document-centric workflow.
```text
create/upload document
→ validate document
→ optionally add attachments
→ set or confirm print/shipping options
→ optionally retrieve preview
→ create/send sending
→ query document status
→ query shipping/sending status
→ receive or poll further status updates
```
The adapter MUST preserve this distinction:
```text
Document preparation is not sending.
Sending is not postal handover.
Postal handover is not final physical delivery proof.
```
## 7. Binect Object Mapping
## 7.1 Generic to Binect Mapping
| Generic hybrid-mail concept | Binect flavor concept |
| --------------------------- | --------------------------------------------------------------------------- |
| `HybridmailLetter` | Letter-level abstraction composed from Binect document plus sending context |
| `HybridmailDocumentRef` | Binect document |
| `HybridmailAttempt` | Binect document upload and/or sending operation |
| `HybridmailBatch` | Binect serial/bulk document or sending group |
| `PostalRecipient` | Address extracted from document or provided as metadata if supported |
| `HybridmailOptions` | Binect print and shipping options |
| `HybridmailPreview` | Binect preview/brief view |
| `HybridmailTimeline` | Aggregated Binect document and shipping status history |
## 7.2 BinectDocument
```yaml
BinectDocument:
binect_document_id: string
hybridmail_letter_id: string?
coordination_case_id: string?
participant_id: string?
provider_status: string?
normalized_status: string
original_file_ref: ResourceRef
file_type: pdf | ps | unknown
page_count: integer?
sheet_count: integer?
price_estimate: MoneyAmount?
validation_result: BinectValidationResult?
preview_refs:
- BinectPreviewRef
attachment_refs:
- BinectAttachmentRef
created_at: timestamp
updated_at: timestamp?
metadata: object?
```
## 7.3 BinectAttachment
```yaml
BinectAttachment:
binect_attachment_id: string
binect_document_id: string
attachment_file_ref: ResourceRef
file_type: pdf | rtf | txt | png | jpg | jpeg | bmp | gif | ps | unknown
file_size_bytes: integer?
starts_on_new_sheet: boolean?
provider_status: string?
validation_result: BinectValidationResult?
created_at: timestamp
metadata: object?
```
### Attachment Handling Rule
The Binect flavor SHOULD default `starts_on_new_sheet` to `true` if no explicit instruction is provided, because the public FAQ states that attachments start on a new sheet by default.
If duplex printing is used and the primary document has an odd number of pages, the adapter SHOULD be prepared for provider-side blank-page insertion semantics. Blank pages may affect sheet count and preview/status display, but should not be treated as billable unless the provider reports otherwise.
## 7.4 BinectSending
```yaml
BinectSending:
binect_sending_id: string
binect_document_id: string?
hybridmail_letter_id: string
coordination_case_id: string?
participant_id: string?
provider_status: string?
normalized_status: string
shipping_options: BinectShippingOptions?
print_options: BinectPrintOptions?
submitted_at: timestamp?
status_checked_at: timestamp?
child_document_statuses:
- BinectChildDocumentStatus
metadata: object?
```
## 7.5 BinectChildDocumentStatus
For serial documents or bulk processing, child document statuses MUST be represented individually.
```yaml
BinectChildDocumentStatus:
parent_document_id: string
child_document_id: string
participant_id: string?
provider_status: string?
normalized_status: string
evidence_event_refs:
- string
updated_at: timestamp?
metadata: object?
```
Batch-level success MUST NOT be treated as success for every child document unless each child status supports that interpretation.
## 8. Binect Validation Model
Binect validation results MUST be mapped into the generic `HybridmailValidationResult`.
The public material indicates validation of:
* address position
* address format
* restricted areas
* upload/print suitability
```yaml
BinectValidationResult:
document_id: string
provider_validation_state: string?
validation_state: pending | passed | action_required | failed | unknown
issues:
- BinectValidationIssue
price_estimate: MoneyAmount?
validated_at: timestamp?
raw_provider_response_ref: string?
```
```yaml
BinectValidationIssue:
provider_issue_code: string?
issue_code: string
severity: info | warning | action_required | fatal
category: format | page_size | address | address_position | address_format | restricted_area | margins | file_size | page_count | attachment | postage | country | provider_policy | unknown
message: string
page_number: integer?
bounding_box: object?
fixable: boolean?
```
## 9. Binect Validation Issue Mapping
| Binect validation concern | Generic validation category | Normalized issue code |
| ------------------------- | --------------------------- | --------------------------- |
| Address position invalid | `address_position` | `address_position_invalid` |
| Address format invalid | `address_format` | `address_format_invalid` |
| Restricted area violation | `restricted_area` | `restricted_area_violation` |
| Unsupported file type | `format` | `unsupported_file_type` |
| File too large | `file_size` | `file_too_large` |
| Attachment invalid | `attachment` | `attachment_invalid` |
| Postal option invalid | `postage` | `unsupported_product` |
| Provider policy rejection | `provider_policy` | `provider_policy_rejected` |
| Unknown validation issue | `unknown` | `unknown_validation_issue` |
Validation failure MUST emit:
```text
payload.validation_failed
```
Validation success MUST emit:
```text
payload.validation_passed
```
Validation warnings MAY emit `payload.validation_passed` with warning metadata if the provider still allows sending.
## 10. Binect Print and Shipping Options
The Binect flavor MUST map Binect options into the generic `HybridmailOptions`.
```yaml
BinectPrintOptions:
color_mode: color | grayscale | provider_default | unknown
print_sides: simplex | duplex | provider_default | unknown
attachment_starts_on_new_sheet: boolean?
paper_type: provider_specific?
metadata: object?
```
```yaml
BinectShippingOptions:
postage_product: standard | provider_specific
country_scope: domestic | international | unknown
dispatch_mode: manual_review | auto_send | submit_later | scheduled
desired_dispatch_date: date?
sender_profile_ref: string?
return_mail_handling: none | provider_processed | physical_return | digital_return_info | unknown
metadata: object?
```
Provider-native option names MUST be preserved in metadata.
The normalized model MUST avoid assuming support for a product unless the live provider capability descriptor confirms it.
## 11. Binect Preview Model
Binect preview retrieval MUST map to `HybridmailPreview`.
```yaml
BinectPreviewRef:
preview_id: string
binect_document_id: string
preview_type: pdf | png | image | metadata | unknown
preview_uri: string?
generated_at: timestamp
expires_at: timestamp?
raw_provider_response_ref: string?
```
Preview availability MUST emit an operational event, normally:
```text
delivery.payload.available
```
Preview availability MUST NOT be interpreted as postal delivery evidence.
## 12. Binect Status Model
Because provider-native statuses may differ across endpoints, the Binect flavor MUST preserve raw provider status and map it to normalized status.
```yaml
BinectStatusRecord:
status_record_id: string
binect_document_id: string?
binect_sending_id: string?
child_document_id: string?
provider_status: string
normalized_status: string
status_scope: document | sending | child_document | shipping | unknown
observed_at: timestamp
raw_provider_response_ref: string?
```
## 13. Normalized Binect Status Categories
The Binect flavor SHOULD map native statuses into these normalized categories:
```text
document.created
document.uploaded
document.validation_pending
document.validation_passed
document.validation_failed
document.preview_available
document.ready_for_sending
sending.submitted
sending.processing
sending.production_started
sending.production_completed
sending.handed_to_postal_service
sending.failed
sending.cancelled
sending.status_unknown
shipping.status_unknown
shipping.undeliverable
shipping.return_received
```
Where Binect status granularity is insufficient, the adapter MUST use the nearest weaker event and preserve the raw status in metadata.
Example:
```text
If the provider status only says "sent" and does not distinguish production completion from postal handover,
the adapter SHOULD map it conservatively and document the chosen interpretation.
```
## 14. Binect-to-Generic Event Mapping
| Binect workflow event | Generic event | Evidence interpretation |
| --------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------- |
| Document upload accepted | `delivery.payload.accepted` | Digital submission accepted |
| Document rejected on upload | `delivery.payload.rejected` | Attempt failed before validation/send |
| Validation passed | `payload.validation_passed` | Document is provider-processable |
| Validation failed | `payload.validation_failed` | Document/action must be corrected |
| Price calculated on upload | metadata on validation/upload event | Cost signal, not delivery evidence |
| Attachment added | `delivery.payload.accepted` with attachment metadata | Attachment accepted into document context |
| Attachment rejected | `payload.validation_failed` | Attachment must be corrected |
| Preview generated | `delivery.payload.available` | Operational review evidence |
| Options set | metadata event or `delivery.payload.available` | Operational readiness |
| Sending submitted | `delivery.payload.submitted` | Provider instructed to send |
| Document/sending processing | `delivery.production.started` | Provider production chain began |
| Production completed | `delivery.production.completed` | Printed/enveloped/franked if provider status supports this |
| Handover to post | `delivery.postal.handed_over` | Strong dispatch evidence |
| Shipping status unknown | `delivery.postal.status_unknown` | Final delivery unclear |
| Undeliverable/returned | `delivery.postal.undeliverable` or `delivery.postal.return_received` | Strong negative evidence |
| Child document status | per-child mapped event | Required for serial/bulk cases |
## 15. Evidence Grading Rules
### 15.1 Document Upload Accepted
```yaml
event_type: delivery.payload.accepted
evidence_grade:
strength: weak
actor_certainty: none
authority_certainty: none
payload_certainty: medium
interaction_certainty: none
timing_certainty: medium
channel_certainty: medium
non_repudiation_strength: low
notes:
- Binect accepted the document upload or document creation step.
- This does not prove validation, sending, production, postal handover, or delivery.
```
### 15.2 Binect Validation Passed
```yaml
event_type: payload.validation_passed
evidence_grade:
strength: medium
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: low
notes:
- Document passed Binect validation for further processing.
- This does not prove sending or postal handover.
```
### 15.3 Binect Validation Failed
```yaml
event_type: payload.validation_failed
evidence_grade:
strength: negative
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: low
notes:
- Document is not processable without correction or replacement.
- The validation issue category should be included.
```
### 15.4 Preview Available
```yaml
event_type: delivery.payload.available
evidence_grade:
strength: weak
actor_certainty: none
authority_certainty: none
payload_certainty: medium
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: low
notes:
- Binect preview is available for review.
- Preview availability is operational evidence, not postal dispatch evidence.
```
### 15.5 Sending Submitted
```yaml
event_type: delivery.payload.submitted
evidence_grade:
strength: medium
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: low
notes:
- Binect sending was submitted.
- This does not prove production completion or postal handover.
```
### 15.6 Production Started
```yaml
event_type: delivery.production.started
evidence_grade:
strength: medium
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: medium
channel_certainty: high
non_repudiation_strength: low
notes:
- Binect status indicates processing/production has started.
- The exact native status should be preserved in metadata.
```
### 15.7 Postal Handover
```yaml
event_type: delivery.postal.handed_over
evidence_grade:
strength: strong
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: medium
notes:
- Binect status indicates handover into the physical postal delivery chain.
- This is strong dispatch evidence.
- It does not prove recipient receipt or reading.
```
### 15.8 Return or Undeliverable
```yaml
event_type: delivery.postal.return_received
evidence_grade:
strength: negative
actor_certainty: none
authority_certainty: none
payload_certainty: high
interaction_certainty: none
timing_certainty: high
channel_certainty: high
non_repudiation_strength: medium
notes:
- Binect or downstream status indicates the physical letter was returned or undeliverable.
- This is strong negative delivery evidence.
```
## 16. Binect Evidence Assessment
The Binect flavor SHOULD provide a Binect-native evidence assessment.
```yaml
BinectEvidenceAssessment:
hybridmail_letter_id: string
binect_document_id: string?
binect_sending_id: string?
participant_id: string?
category: success | fail | undef
subclass: string
confidence: low | medium | high
strongest_signal: string?
evidence_summary:
- string
recommended_coordination_interpretation: string?
```
### 16.1 Binect Adapter Success Subclasses
```text
success.document_uploaded
success.validation_passed
success.preview_available
success.sending_submitted
success.production_started
success.production_completed
success.handed_to_postal_service
success.return_info_processed
```
### 16.2 Binect Adapter Fail Subclasses
```text
fail.upload_rejected
fail.validation_failed
fail.address_position_invalid
fail.address_format_invalid
fail.restricted_area_violation
fail.attachment_invalid
fail.unsupported_file_type
fail.file_too_large
fail.options_invalid
fail.sending_rejected
fail.production_failed
fail.cancelled
fail.return_received
fail.undeliverable
```
### 16.3 Binect Adapter Undef Subclasses
```text
undef.pending
undef.uploaded_only
undef.validation_pending
undef.ready_but_not_sent
undef.preview_available_only
undef.submitted_for_sending
undef.processing
undef.production_status_unknown
undef.handed_to_postal_service_but_delivery_unproven
undef.shipping_status_unknown
undef.no_final_status_expected
undef.child_status_partial
undef.conflicting_evidence
undef.channel_degraded
```
## 17. Binect Workflow States
The Binect flavor SHOULD support these normalized workflow states:
```text
created
upload_requested
uploaded
upload_failed
validation_pending
validation_passed
validation_failed
attachment_pending
attachment_added
attachment_failed
options_pending
options_set
preview_pending
preview_available
ready_for_sending
send_requested
sending_submitted
processing
production_started
production_completed
handed_to_postal_service
shipping_status_unknown
return_received
undeliverable
cancelled
failed
unknown
```
These states are Binect-flavor states, not coordination result states.
## 18. Binect Idempotency and Duplicate Send Prevention
Duplicate physical send prevention is mandatory.
If the Binect endpoint used does not provide native idempotency, `hybridmail-connect` MUST implement adapter-managed idempotency.
Idempotency scope SHOULD include:
```text
coordination_case_id
participant_id
delivery_id
payload_id
payload_integrity_hash
provider_flavor
target postal recipient
shipping options
```
A repeated `delivery.submit_letter` request with the same idempotency key MUST NOT create a second physical send.
If the repeated request refers to a changed payload or changed address, the adapter MUST reject it as an idempotency conflict unless a new idempotency key is provided.
## 19. Binect Attachments
The Binect flavor MUST support attachments according to provider capability.
Supported attachment formats from public FAQ:
```text
pdf
rtf
txt
png
jpg
jpeg
bmp
gif
ps
```
Maximum attachment size from public FAQ:
```text
20 MB
```
The adapter SHOULD validate attachment file type and size before submission where possible.
Attachment events SHOULD be mapped as:
| Attachment event | Generic event |
| ----------------------------- | ---------------------------------------------------- |
| Attachment accepted | `delivery.payload.accepted` with attachment metadata |
| Attachment rejected | `payload.validation_failed` |
| Attachment validation warning | `payload.validation_passed` with warning metadata |
## 20. Binect Cost and Price Handling
The public Binect FAQ states that price calculation occurs when uploading the letter.
The Binect flavor SHOULD capture provider cost information when available.
```yaml
BinectCostEstimate:
binect_document_id: string
amount_net: number?
amount_gross: number?
currency: string?
tax_amount: number?
page_count: integer?
sheet_count: integer?
postage_product: string?
calculated_at: timestamp?
raw_provider_response_ref: string?
```
Cost calculation is operational metadata and MUST NOT be treated as delivery evidence.
## 21. Binect Status Polling and Webhooks
The Binect flavor MUST support polling if status endpoints are available.
The Binect flavor MAY support webhooks if available in the provider configuration.
```yaml
BinectStatusPollingConfig:
enabled: boolean
initial_delay_seconds: integer
interval_seconds: integer
max_duration_seconds: integer
terminal_statuses:
- string
```
Polling MUST be idempotent and MUST preserve status history.
Late status changes MUST be recorded.
## 22. Binect Raw Event Preservation
The Binect flavor SHOULD preserve raw provider responses or references to them.
```yaml
RawBinectEventRef:
raw_event_id: string
source: api_response | status_poll | webhook | preview | validation | operator
endpoint: string?
storage_ref: string?
received_at: timestamp
redacted: boolean
```
Normalized events SHOULD reference raw Binect event data where available.
## 23. Binect Channel Health
```yaml
BinectChannelHealth:
provider_name: binect
provider_account_ref: string?
status: healthy | degraded | failing | unknown
authentication_status: valid | expired | missing | insufficient | unknown
upload_status: healthy | degraded | unavailable | unknown
validation_status: healthy | degraded | unavailable | unknown
preview_status: healthy | degraded | unavailable | unknown
sending_status: healthy | delayed | unavailable | unknown
status_api_status: healthy | degraded | unavailable | unknown
cutoff_status: before_cutoff | after_cutoff | no_production_day | unknown
known_degradations:
- string
```
Health events SHOULD map to:
```text
system.provider.degraded
system.provider.unavailable
system.adapter.health_changed
```
## 24. Security Requirements
The Binect flavor MUST:
* protect Binect API credentials.
* use secure transport.
* avoid logging document contents.
* protect postal recipient data.
* preserve idempotency.
* prevent duplicate physical sends.
* separate test and production configuration.
* protect previews, because previews may contain full document content.
* validate file type and size before upload where possible.
* apply tenant/account separation where applicable.
## 25. Privacy Requirements
The Binect flavor SHOULD:
* store payload references instead of payload content where possible.
* support metadata-only mode after provider submission.
* mask postal address data in logs.
* support configurable retention of raw provider responses.
* support configurable retention of previews.
* separate operational diagnostics from coordination evidence.
* document provider-side retention limitations.
* support deletion or anonymization workflows where legally possible.
## 26. Reliability Requirements
The Binect flavor MUST support:
* idempotent submit requests.
* duplicate status event detection.
* out-of-order status handling.
* polling-based status recovery.
* retryable upload failures.
* non-retryable validation failures.
* provider timeout handling.
* validation issue preservation.
* preview retrieval failure handling.
* child-document partial-status handling.
* correlation preservation.
* dead-letter handling for unprocessable provider responses.
## 27. Minimal API Surface
The Binect flavor SHOULD implement or expose these conceptual operations through `hybridmail-connect`.
### 27.1 Adapter Contract Operations
```text
GET /adapter/descriptor
GET /adapter/health
POST /adapter/actions
POST /adapter/events/provider
GET /adapter/events
GET /adapter/letters/{id}/timeline
GET /adapter/letters/{id}/assessment
```
### 27.2 Binect Flavor Operations
```text
POST /binect/documents
POST /binect/documents/{id}/attachments
PUT /binect/documents/{id}/options
GET /binect/documents/{id}/preview
POST /binect/sendings
GET /binect/documents/{id}/status
GET /binect/sendings/{id}/status
GET /binect/letters/{id}/timeline
GET /binect/letters/{id}/assessment
GET /binect/channel-health
```
The exact provider endpoint names MUST be implemented according to the live Binect Swagger/API. The conceptual operations above define the adapter-facing semantic model.
## 28. Example End-to-End Flow
### 28.1 Single Binect Letter
1. `coordination-engine` creates a coordination case.
2. A PDF payload is registered.
3. Policy selects `hybridmail-connect` with provider flavor `binect`.
4. `coordination-engine` sends `delivery.submit_letter`.
5. `hybridmail-connect` creates a Binect document upload operation.
6. Binect accepts the document.
7. The adapter emits `delivery.payload.accepted`.
8. Binect validates the document.
9. If validation passes, the adapter emits `payload.validation_passed`.
10. Optional attachments are uploaded.
11. Print and shipping options are set or confirmed.
12. A preview is requested if policy requires review.
13. The adapter emits `delivery.payload.available` for preview availability.
14. The sending is submitted.
15. The adapter emits `delivery.payload.submitted`.
16. Status polling reports processing/production.
17. The adapter emits `delivery.production.started` and later stronger production or postal events if supported.
18. If status indicates postal handover, the adapter emits `delivery.postal.handed_over`.
19. `coordination-engine` evaluates whether handover is sufficient for the case policy.
### 28.2 Validation Failure
1. Binect rejects the document due to address position, address format, or restricted-area violation.
2. The adapter emits `payload.validation_failed`.
3. The validation issue is preserved with category and severity.
4. `coordination-engine` marks the participant delivery as action-required or failed for the attempt.
5. Policy requests correction, alternate generation, or fallback channel.
### 28.3 Serial / Bulk Document
1. A serial or bulk document is submitted.
2. Binect returns parent and child statuses.
3. The adapter records parent status.
4. The adapter creates or updates `BinectChildDocumentStatus` records.
5. The adapter emits per-child evidence events.
6. `coordination-engine` aggregates participant-level completion and does not treat parent-level acceptance as universal delivery success.
## 29. Binect MVP Scope
The first Binect flavor implementation should include:
1. Binect provider flavor descriptor.
2. Adapter descriptor integration.
3. Binect credential/config handling.
4. Document upload.
5. Attachment upload.
6. Print/shipping option setting.
7. Preview retrieval.
8. Sending submission.
9. Document status polling.
10. Sending/shipping status polling.
11. Validation result mapping.
12. Child document status mapping where exposed.
13. Evidence event generation.
14. Letter timeline.
15. Binect evidence assessment.
16. Adapter-managed idempotency.
### MVP Required Binect Events
```text
delivery.payload.accepted
delivery.payload.rejected
payload.validation_passed
payload.validation_failed
delivery.payload.available
delivery.payload.submitted
delivery.production.started
delivery.production.completed
delivery.postal.handed_over
delivery.postal.status_unknown
delivery.postal.undeliverable
delivery.postal.return_received
system.provider.degraded
system.provider.unavailable
```
Where a provider status is unavailable or not semantically clear, the adapter MUST emit the weakest safe event and preserve the raw status.
## 30. Binect MVP Acceptance Criteria
The Binect flavor MVP is acceptable when it can:
1. Accept a coordination-compatible `delivery.submit_letter` request.
2. Upload or simulate upload of a Binect document.
3. Preserve correlation and idempotency.
4. Prevent duplicate physical sends for duplicate idempotency keys.
5. Add supported attachments.
6. Set or preserve print/shipping options.
7. Retrieve or simulate a preview.
8. Submit sending.
9. Poll and normalize document status.
10. Poll and normalize sending/shipping status.
11. Map validation success to `payload.validation_passed`.
12. Map address/layout validation failure to `payload.validation_failed`.
13. Map sending submission to `delivery.payload.submitted`.
14. Map postal handover only when semantically supported by provider status.
15. Provide a Binect letter timeline.
16. Provide a Binect evidence assessment.
17. Integrate with `coordination-engine` without overclaiming physical delivery or human awareness.
## 31. Open Questions
1. Which exact Binect native statuses should map to `delivery.production.started`, `delivery.production.completed`, and `delivery.postal.handed_over`?
2. Does the relevant Binect account/API configuration expose webhooks, or is polling the required baseline?
3. Which postal products are available for the target Binect customer/account?
4. Which cancellation states are possible after upload but before sending or production?
5. Which fields in the live Swagger/API represent child-document status for serial documents?
6. How should provider price calculation be represented when a document is uploaded but not yet sent?
7. Which preview formats are available in the target environment?
8. Are return-mail or undeliverable events available through API status, manual import, or a separate process?
9. Are registered-mail or delivery-confirmation products available in the target Binect configuration?
10. Should Binect-specific validation issues update a central contact/address quality registry?
## 32. Non-Goals
The Binect flavor is not:
* a document authoring system.
* a PDF renderer by default.
* a legal notice system by itself.
* a postal carrier.
* a general Binect UI replacement.
* the owner of coordination case success.
* the owner of contract, payment, or signature result semantics.
It integrates Binect hybrid-mail capabilities into the coordination framework.
## 33. Summary
`HybridmailBinectSpecification.md` defines the Binect provider flavor for `hybridmail-connect`.
The Binect flavor models Binect as a document-centric hybrid-mail provider with:
* document upload
* validation
* attachments
* print and shipping options
* preview
* sending
* document and shipping status
* serial/child document status
* production and postal evidence mapping
The key rule is:
> Binect events are provider, document, production, and postal-chain evidence. They are not automatic coordination result satisfaction. hybridmail-connect reports Binect-channel facts and uncertainty. coordination-engine evaluates intended results.