Mailbox is file-backed communications infrastructure.
Authoritative operational truth:
- intake envelopes
- inbox/outbox copies
- tracker files
- ack files
- JSONL ledgers
Assistive only:
- recent-session discovery
- live notify nudges
Do not blur them:
- discovery is not delivery
- nudges are not delivery
- this repo does not claim verified direct shell session injection
Supported notifier modes in runtime code:
nonediscover-onlyagent-turn-nudge
Meaning:
none— durable mailbox onlydiscover-only— keep discovery context, no runtime nudgeagent-turn-nudge— useopenclaw agent --agent ... --message ...as an assistive new-turn nudgesession-inject— reserved for future use only if runtime support is verified
bin/send_mail.py— author envelopesbin/haiku_mailman.py— durable intake processing + tracker lifecyclebin/receipt_watcher.py— ack reconciliationbin/smart_mailman.py— recent-session discovery and honest assistive reportingbin/mailbox_status.py— operator status viewbin/session_mailman.py— non-authoritative helper / future adapter placeholder
Preferred modern completion shape:
type=responseresponse_type=resultstatus=completed- linked via
parent_idplus normalwork_item_id/thread_id
This is the primary way to represent completed work.
It keeps work completion inside the shared task/response model instead of preserving work_complete as a forever-parallel type.
Legacy compatibility:
send_mail.py --type work_completeis accepted as a compatibility alias- it is normalized at authoring time into
type=response,response_type=result,status=completed - if legacy callers omit
parent_id, authoring falls back tothread_idand thenwork_item_idso the envelope still lands inside the structured response path - agents and docs should prefer the structured response shape in new work
Sender follow-up semantics:
- delivery/ack receipts stay receipt/ack semantics only
- when a completed result envelope is durably delivered, the runtime now records a distinct result-arrival event and sends a nudge that explicitly says follow-up is needed
- that follow-up owner is the envelope recipient, typically the requester or current task owner reviewing the result
Trackers are moving toward explicit separation of:
delivery_stateack_statelive_notify_state
Older tracker files may still contain legacy fields such as ack_status; operator reporting treats those as migration compatibility only while the schema converges.
Notify mode and recent-session discovery are reported as assistive context, not mailbox delivery truth.
Legacy live_notify_state=attempted_legacy history is preserved in tracker records; operator views normalize those raw values into clearer legacy classifications such as legacy_nudge_attempted or legacy_discovery_only without rewriting tracker provenance.
A bounded legacy backfill tool is available:
python3 bin/migrate_trackers.py --writeIt normalizes legacy trackers toward v3, preserves legacy fields under legacy_fields_preserved, and records inferred/backfilled values under migration_inference plus migration lineage fields.
Human-readable:
python3 bin/mailbox_status.pyMachine-readable:
python3 bin/mailbox_status.py --jsonRecent-session discovery view:
python3 bin/smart_mailman.py --presence --active-minutes 120