Posts
Stored LinkedIn and X post performance, and the Publishing Community queue for public comments on owned posts.
Posts published through Oxygen's LinkedIn and X Publishing paths are stored as Posts data, and recent posts created directly on a connected LinkedIn account are discovered into the same store. The latest cumulative metric snapshots back Publishing → Analytics; public comments on recent owned LinkedIn posts back the durable, oldest-first Publishing → Community queue.
Three things that look alike and are not: a public comment and its thread belong to Posts; a private DM is a Message in the Unibox; draft text, assignment, and notes attached to a public comment are local workspace state that saving never posts.
Analytics
oxygen publishing analytics summary --range 30d --json
oxygen publishing analytics summary --channel x --range 30d --json
oxygen publishing analytics post <post-id> --jsonThe summary defaults to owned LinkedIn posts recorded in Oxygen, including recently discovered posts created directly on LinkedIn. --channel x instead covers X posts published through Oxygen. Both paths read stored snapshots and never call the selected provider when opened or queried. snapshotted_posts counts posts with a stored background sync pass; its legacy alias measured_posts does not mean every engagement value was populated. Use coverage.<metric>.measured_posts to see how many posts reported a non-null value for each metric. A null is unknown or unavailable, never zero. Stale and pending snapshots retry automatically; there is no manual provider retry to run.
The current LinkedIn rail can supply reactions, comments, and reposts but not trustworthy impressions, saves, or sends. X ordinary post lookup maps impressions, likes, replies, reposts, bookmarks, conditional link clicks, and conditional video views into the same canonical fields; it exposes no send counter. LinkedIn's richer member-post analytics and X account analytics remain separate, unregistered capabilities.
Publishing Community
oxygen publishing comments list --view unanswered --json
oxygen publishing comments list --view all --json
oxygen publishing comments get <comment-id> --jsonunanswered is an operating queue, not one database state: it spans needs_reply, draft, awaiting_approval, and action_unavailable. all adds replied, resolved, ignored, and spam, still bounded to the rolling 30-day recent-owned-post scope — not lifetime LinkedIn history. For one exact state pass --status <state> instead; --view and --status cannot be combined.
Opening this queue is a local tenant-database read. It uses 0 Oxygen credits and makes no provider call. A background worker discovers and polls recent owned posts 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 | Recent owned 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 |
counts_trustworthy | true only when discovery and comment polling are current |
automatic_retry_at | Scheduled automatic retry while backing off |
manual_retry_available | Always false; the worker owns quota-safe retry timing |
guidance | Self-contained degraded-state instruction, or null when none is needed |
If an empty response has empty_queue_is_current: false, do not conclude that LinkedIn has no comments. freshness.counts_trustworthy remains false and freshness.guidance names the automatic retry time and exact failure. There is deliberately no manual sync button or retry command: the worker retries automatically, while a user-triggered retry loop could consume the same LinkedIn account quota that caused the backoff.
A reply written directly on LinkedIn is reconciled by the next successful provider sync. Oxygen recognizes the connected account as the author and moves only that reply's exact parent comment to replied; local drafts, notes, and reply receipts remain available for inspection. Creating or approving a reply through Oxygen is refused if the bound LinkedIn sender is no longer active.
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.
CLI, MCP, and the web workspace run the same contract. Over MCP it is oxygen_publishing_comments, which is not in a fresh client's default set — reconnect with ?toolset=publishing. LinkedIn is the only channel in Community today.