No. Slack Web API returns a success response when it accepts the request. The message then holds one of 3 states. Only bot_message is terminal success. Provely proves posted_to_user and posted as separate promises.

Skill facts from the signed manifest.
FactValue
Skill version0.1.0
PublisherBuilt and signed by Provely.
CertificationProvisional (score 49 of 100)
Last conformance run2026-09-05T12:00:00Z: 26 of 26 cases passed, 0 critical false VERIFIED
Provider API versionsfp_2026_09
Default provider API versionfp_2026_09
Compiled2026-09-05T12:00:00Z by compiler 0.1.0
Manifest hash79be37dad2c03c4f
Manifest hash checkthe document hashes to the value the manifest states
Signaturevalid, key provely-skill-2026-09, trusted by this build

What does this page prove?

ClaimProven byEvidenceStatus
The post event states the channel_type im, so the message reached a direct message conversation and not a public channel. It does not prove which person.slack.direct_message.postedE2 + E3proven
The conversation holds one message with the intended text at the ts that Slack returned. It does not prove that a person read the message.slack.message.postedE2 + E3proven
An outcome outside Slack Web API, such as a bank credit or a person who read a messagenot provenno E5 channelnot proven
The agent report that the action workednever countsE0not proven

Which completion levels does the Slack Web API skill expose?

Each level is one promise with one contract. An agent picks the level that matches the promise it makes. It cannot upgrade a level. Read the completion level definition.

LevelContractPromiseEvidenceCertification
posted_to_userslack.direct_message.posted v1.0.0The post event states the channel_type im, so the message reached a direct message conversation and not a public channel. It does not prove which person.E2 + E3Provisional
postedslack.message.posted v1.0.0The conversation holds one message with the intended text at the ts that Slack returned. It does not prove that a person read the message.E2 + E3Provisional

What is the Slack Web API lifecycle?

Which states can a slack.message be in?

StateClassVerdictMeaningSource
bot_messageterminal successVERIFIEDAn integration posted the message, and Slack holds it in the conversation. The subtype table states that bot_message means a message that an integration posted.slack.openapi
message_changedterminal neutralFAILEDA person or an app changed the message. The record is hidden, so conversations.history returns it no longer.slack.openapi
message_deletedterminal neutralFAILEDA person or an app deleted the message. The record is hidden, so conversations.history returns it no longer.slack.openapi

In slack.message under provider API version fp_2026_09, bot_message is the only state that means terminal success. Every other state gives PENDING, FAILED, or UNVERIFIABLE.

Source: slack.openapi · retrieved 2026-09-08

How does Provely tie the evidence to this exact operation?

A matching state that already existed must not verify. Every contract names the correlation keys that bind the evidence to the operation, and the idempotency key that stops a duplicate side effect.

StrategyAssuranceKeysRequiredWindow
resource_idstrongmessage_ts from $action.result.tsyesnone
fingerprintweakchannel from $input.channel_id; text from $input.textno600000 ms
The skill reads the channels below. It prefers the ones furthest from the action.
In words
  • E0 agent assertion: never sufficient.
  • E1 action response: the provider acknowledged the request.
  • E2 provider readback: the runtime read the resource back.
  • E3 provider event: the provider reported the change.
  • E4 independent system: a system outside the action path agrees.
  • E5 external outcome: the result is observable in the world.

Which evidence channels does the skill read?

The runtime prefers the channel that is more independent from the action path. Read the evidence level definition. An acknowledgement from Slack Web API is E1 and never terminal success.

ChannelLevelIndependenceVerifierDeterministicTypical latency
direct_message_posted_eventE3provider eventwebhookno2000 ms
message_action_responseE1same responseaction_resultyesnot stated
message_conversation_postsE3provider eventwebhookno2000 ms
message_posted_eventE3provider eventwebhookno2000 ms
message_readbackE2provider readbackhttpyes300 ms

Which ways can a Slack Web API action look done and not be?

ContractCaseRuleVerdict
slack.direct_message.postedwrong subjectSlack holds a different text than the intent stated. Ask a person.CONTRADICTED
slack.direct_message.postedpre existing stateThe message is older than the operation. It proves nothing.CONTRADICTED
slack.direct_message.postedduplicate side effectSlack holds more than one message of this text in this conversation since the operation started. Do not retry.CONTRADICTED
slack.direct_message.postedobserved stateSlack answered the read with the status code 200 and the member ok false. The answer is a refusal and it is no evidence.UNVERIFIABLE
slack.message.postedwrong subjectSlack holds a different text than the intent stated. Ask a person.CONTRADICTED
slack.message.postedpre existing stateThe message is older than the operation. It proves nothing.CONTRADICTED
slack.message.postedduplicate side effectSlack holds more than one message of this text in this conversation since the operation started. Do not retry.CONTRADICTED
slack.message.postedobserved stateSlack answered the read with the status code 200 and the member ok false. The answer is a refusal and it is no evidence.UNVERIFIABLE

What did the last conformance run show?

The six confidence dimensions of the signed manifest.
DimensionScoreMaximum
Documentation1420
Schema alignment12.2715
Lifecycle certainty2020
Evidence strength1620
Causal correlation1515
Sandbox conformance1010
Raw score87.27100
Score after the caps49100

The raw score is 87.27. 2 hard caps apply, so the score is 49 and the level is Provisional.

Why the score is capped.
ReasonHighest score it allows
8 uncertainty records are open. The lowest cap is 49.49
2 mandatory cases are missing. Example: slack.direct_message.posted:terminal_failure.74
The score and the level of each contract.
ContractRaw scoreScore after the capsCertification
slack.direct_message.posted87.2749Provisional
slack.message.posted87.2749Provisional

The weakest contract is slack.direct_message.posted. It scores 49 and reaches Provisional. The package level is Provisional, because a package level never rises above its weakest contract. Read the level of the contract you use.

The last conformance run on 2026-09-05T12:00:00Z passed 26 of 26 cases with 0 critical false VERIFIED. One critical false VERIFIED rejects a skill.

The conformance result by case class.
Case classPassedTotal
duplicate side effect22
error after execution22
error before execution22
evidence unavailable22
pre existing state22
stale readback22
still transitional22
terminal success22
timeout after commit22
version mismatch22
webhook duplicate22
webhook out of order22
wrong subject22

The conformance artifact digest is 93b0aad442916550. The harness signs the run, so a reader can check that these numbers come from that run.

What remains uncertain?

The level is Provisional because of it. 8 uncertainty records are open. The lowest cap is 49. Provely does not guess a rule that a source does not state.

Where do these facts come from?

Every claim above cites a source assertion in the skill provenance. The compiler records the source, its hash, and the retrieval date. A page never states a provider rule without one.

SourceKindRetrievedExcerpt
slack.docs.conversationsdocs2026-09-08authored
slack.docs.eventsdocs2026-09-08authored
slack.docs.post_messagedocs2026-09-08authored
slack.docs.web_apidocs2026-09-08authored
slack.eventsevent sample2026-09-08authored
slack.openapiopenapi2026-09-08authored

How do I verify a Slack Web API action?

Verify a Slack Web API action with Provely

  1. Begin the operation.Call begin with the contract slack.direct_message.posted and the input. Keep the operation id.
  2. Make the Slack Web API call you make today.Send the request with the correlation metadata that begin returned.
  3. Submit the acknowledgement.Call action_result with the Slack Web API response. This is evidence level E1. It is not completion.
  4. Verify.Call verify. The runtime reads direct_message_posted_event, message_action_response, message_conversation_posts, message_posted_event and message_readback and evaluates the contract.
  5. Report the verdict exactly as returned.VERIFIED comes with a signed receipt. PENDING comes with the operation id. CONTRADICTED and UNVERIFIABLE are not success.

Questions developers ask

Does the posted_to_user level prove the posted level?

No. The post event states the channel_type im, so the message reached a direct message conversation and not a public channel. It does not prove which person. The conversation holds one message with the intended text at the ts that Slack returned. It does not prove that a person read the message. Use slack.message.posted to prove posted.

Which Slack Web API API versions does the skill support?

fp_2026_09. An operation on another version returns UNVERIFIABLE with the reason version_unsupported. The runtime never guesses.

Does Provely need write access to Slack Web API?

No. The agent keeps its write key. The verifier reads with a separate read-only credential where Slack Web API permits it, and it never shares that credential with the agent.