LinkedIn posts and public comments
Read posting performance and operate the durable public-comment queue without confusing local state, live provider reads, or private inbox messages.
Oxygen stores posts published through its LinkedIn Publishing path as Posts data. Their latest cumulative metric snapshots power Publishing → Performance; their public comments flow into a durable, oldest-first queue at Publishing → Comments.
Public comments are not private LinkedIn inbox messages and are not workspace review notes. A public comment and its thread belong to Posts. A private DM becomes a Message in Unibox. Draft text, assignment, and notes attached to a public comment are local workspace state and are never posted by saving them.
Performance
oxygen publishing analytics summary --range 30d --json
oxygen publishing analytics post <post-id> --jsonThe summary covers LinkedIn posts published through Oxygen. Unsupported provider metrics remain null, not zero. Read the response's metric coverage and freshness before comparing totals; the current connected-account rail supplies reactions, comments, and reposts but not impressions, saves, or sends.
Durable comments queue
oxygen publishing comments list --status needs_reply --json
oxygen publishing comments get <comment-id> --jsonOpening this queue is a local tenant-database read. It uses 0 Oxygen credits and makes no provider call. A background worker polls each eligible Oxygen-published post with a six-hour freshness target.
Every list response includes empty_queue_is_current beside the count and a freshness block:
| Field | Meaning |
|---|---|
status | current, awaiting_first_sync, partial, stale, backing_off, or no_targets |
sync_target_posts | Eligible Oxygen-published posts the worker should poll |
completed_posts | Posts that have completed at least one pass |
current_posts | Posts with a successful pass inside the six-hour target |
failed_posts | Posts whose latest pass failed and is waiting to retry |
last_completed_at | Latest successful pass, or null before the first success |
next_sync_at | Next scheduled attempt or retry |
last_error | Exact provider/quota failure when polling is backing off |
If an empty response has empty_queue_is_current: false, do not conclude that LinkedIn has no comments. Wait for next_sync_at and inspect last_error. There is deliberately no manual sync button or retry command: a retry loop could consume the same LinkedIn account quota that caused the backoff.
Local queue versus live provider reads
oxygen posts get|comments|reactions are a separate low-level path for one known LinkedIn post. Each is a live provider read. It uses 0 Oxygen credits but consumes the connected sender's metered account-read allowance, and it does not populate or refresh the durable queue. Do not use that path when a task forbids provider calls.
Safe public reply flow
oxygen publishing comments update <comment-id> --draft "Exact reply" --json
oxygen publishing comments reply <comment-id> --text "Exact reply" --json
oxygen publishing comments approve <action-id> --content-hash <sha256> --approved --jsonupdate saves only local workspace state. reply freezes an exact unsent preview and returns its immutable action id plus SHA-256 content hash; it makes no provider call. Only approve performs the public LinkedIn write, and only for the newest preview with the exact hash. Never retry an effect_unknown action automatically—open the returned comment deep-link and verify the public thread first.
The same provider-neutral contract powers CLI, MCP (oxygen_publishing_comments), its widget, and the web workspace. LinkedIn is the only admitted channel today; later channels must pass the same capability, pagination, freshness, idempotency, approval, and receipt contract before appearing.