# Job: Create an Instagram post

This is the first implemented Social Media Management Job. A Job is a named Markdown playbook, not a new record or runtime.

## Sequence

1. **Ground the request.** Inspect the business website and available public context through the existing read-only workspace/browser capability. Identify the offer, audience, useful source facts, and any claim that needs a caveat.
2. **Ask at most one question.** Ask one concise question only when the offer or audience is still missing. If the answer is not available, return an honest partial result with the missing input and a useful next step; do not turn the Job into an interview.
3. **Verify capabilities and create value before connection.** Verify the active `openai.generate-image`, `instagram.create-media-post`, and durable receipt schemas/capabilities. If any required action, schema, or receipt capability is unavailable or incompatible, report a partial result, identify the missing runtime evidence, and stop. Make exactly one `openai.generate-image` attempt for this Job to produce a grounded Instagram-native caption, one public 1080x1350 JPEG image artifact, an alt text draft, and a short rationale. Do not retry automatically; another generation attempt requires explicit user authorization. Verify those exact returned-artifact facts; a concept, prompt, storyboard, or unverified-size image is not Draft ready. Report a partial result and do not ask for connection when the exact public JPEG evidence is absent.
4. **Connect only after the draft is useful.** Ask the user to connect and select one exact Business or Creator account only after the returned image and text artifact are ready for review. Existing connection, scope, approval, and permission surfaces remain authoritative; listing or recommending an app or action grants no permission or authority.
5. **Review bounded owned evidence after connection.** For the selected account, call `instagram.list-recent-media` once for one bounded recent-media page. Choose an explicit sample of at most three returned media IDs or permalinks, then call `instagram.get-media-insights` only for that sample and its supported media-product insights. Revise the candidate only when that evidence changes the recommendation; otherwise preserve the grounded candidate. If `instagram_manage_insights` or analytics evidence is unavailable, preserve the grounded draft, report the gap, and do not block the first approved static post or request comments/moderation scope solely for analytics. Require reconnect, exact-account, and scope proof when the connection is stale or ambiguous.
6. **Freeze and approve the exact write.** The existing AgentLed approval input freezes the full strict normalized `instagram.create-media-post` input: `accountId`, `mediaUrl`, `caption`, `altText`, `imageProfile=instagram_post_portrait`, `mediaType=IMAGE`, and any connection selector present. Any input or destination change invalidates approval. Do not fall back to legacy non-strict input. Require existing AgentLed approval and authority, then make one bounded public-write attempt. Full comments and moderation permissions are deferred and are not a first-post dependency.
7. **Respect durable receipt states.** The existing receipt records `pending`, `claimed`, `container_dispatching`, `container_created`, `publish_dispatching`, `published`, `complete`, `permalink_pending`, `failed`, or `outcome_unknown` states. An ambiguous provider outcome is partial or unproven and must never invite an automatic retry; reconcile the durable receipt before another attempt.
8. **Prove the result.** Call the post published only when one unambiguous execution/audit result contains both the external media ID and the public permalink. If either proof value is missing, or the provider outcome is ambiguous, report a partial or unproven result and say what runtime evidence is still missing.
9. **Offer recurrence after proof.** Offer **Make this weekly** only after public permalink/media-ID proof from that unambiguous result. Claim **Paused recurrence** only from an authoritative existing paused routine record. Generic paused-routine infrastructure exists, but this Job does not automatically configure a routine; any activation remains a separate existing routine action and approval boundary.

## Honest result contract

Report these states distinctly:

- **Draft ready:** public 1080x1350 JPEG, caption, alt text draft, rationale, sources, and any caveats are present; no connection or public write is implied. A concept or unverified-size image is partial.
- **Awaiting connection:** the user has a useful draft and must connect/select one exact Business or Creator account before approval can bind a destination; stale connection, exact-account, and scope proof require reconnect.
- **Owned evidence reviewed:** bounded recent owned media and supported media-product insights were read for the selected account; revise the candidate only when that evidence changes the recommendation.
- **Awaiting exact approval:** the full strict normalized `instagram.create-media-post` input is frozen in one existing AgentLed approval input: `accountId`, `mediaUrl`, `caption`, `altText`, `imageProfile=instagram_post_portrait`, `mediaType=IMAGE`, and any connection selector present. Any input or destination change invalidates approval; existing approval and authority are still required before a public write.
- **Receipt in progress or unresolved:** durable receipt states identify the attempt; an ambiguous or `outcome_unknown` state is not a retry invitation.
- **Published proof:** the exact approved artifact has one unambiguous execution result containing an external media ID and public permalink.
- **Paused recurrence:** an authoritative existing routine record says the routine is paused; do not infer this state from a recurrence offer.
- **Partial or unproven:** some work exists, but a missing input, artifact, approval, execution result, media ID, or permalink prevents the stronger claim.

Never claim that an image was generated, an account was connected, approval was granted, alt text was published, a post was published, or a routine was activated unless the existing service returned evidence for that exact fact. If an active capability is unavailable, return a partial result, identify the missing runtime evidence, and stop.
