Last reviewed 2026-09-05Skill version 0.1.0Provisional
Prove that the deal sits in the stage that the person authorised. A created deal is not a deal in the right stage. HubSpot sets the stage from the create request, so another stage is a wrong value.
Create the deal in the pipeline stage that I name.
What is the subject and the action?
Member
Value
Subject type
hubspot.deal
Subject identity
deal_id = $action.result.id
Canonical effect
crm.deal_create
Provider operation
POST /crm/objects/2026-03/deals
Idempotency
none, retry is not safe
How does the evidence correlate with this operation?
Strategy
Assurance
Keys
Required
resource_id
strong
deal_id from $action.result.id
yes
fingerprint
weak
dealname from $input.dealname; pipeline from $input.pipeline
no
Which evidence does the contract require?
Minimum evidence level E2. An independent channel is required. Minimum channels: 1.
Channel
Level
Independence
Verifier
Description
deal_readback
E2
provider readback
http
Read the deal from the provider. A condition path is $observed.deal_readback.properties.dealstage.
deal_creation_events
E3
provider event
webhook
The deal.creation notifications of this deal. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A condition reads $observed.deal_creation_events.count.
deal_creation_events_in_account
E3
provider event
webhook
The deal.creation notifications of the account since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A count above one shows a second deal, and HubSpot states no idempotency key to stop it.
Which conditions must all hold for VERIFIED?
Condition
Meaning
Path
Operator
Expected
Evidence
deal_present
The provider holds the deal with the identifier of the answer.
$observed.deal_readback.id
eq
$action.result.id
deal_readback
deal_name_matches
The name of the deal equals the requested name.
$observed.deal_readback.properties.dealname
eq
$input.dealname
deal_readback
deal_pipeline_matches
The pipeline of the deal equals the requested pipeline.
$observed.deal_readback.properties.pipeline
eq
$input.pipeline
deal_readback
deal_amount_matches
The amount of the deal equals the requested amount. HubSpot states every property value as a string.
$observed.deal_readback.properties.amount
eq
$input.amount
deal_readback
deal_created_in_window
The provider created the deal after the operation started.
$observed.deal_readback.createdAt
time_after
$operation.created_at
deal_readback
deal_creation_event
At least one deal.creation notification names this deal. The duplicate guard reads the account channel, so an account with no event endpoint cannot verify and cannot miss a second deal either.
$observed.deal_creation_events.count
gte
1
deal_creation_events
deal_in_the_authorised_stage
The deal sits in the requested stage of the requested pipeline, and no archive removed it.
—
all_of
The rows below state the members.
deal_readback
deal_stage_matches
The stage identifier of the deal equals the requested identifier.
$observed.deal_readback.properties.dealstage
eq
$input.dealstage
deal_readback
deal_stage_pipeline_matches
The stage belongs to the requested pipeline.
$observed.deal_readback.properties.pipeline
eq
$input.pipeline
deal_readback
deal_is_archived
$observed.deal_readback.archived
eq
true
deal_readback
Which conditions give CONTRADICTED?
Condition
Class
Reason
Path
Operator
Expected
deal_in_wrong_pipeline
wrong subject
The deal sits in a different pipeline than the intent named.
$observed.deal_readback.properties.pipeline
ne
$input.pipeline
deal_with_another_name
wrong subject
The deal carries a different name than the intent named.
$observed.deal_readback.properties.dealname
ne
$input.dealname
deal_with_another_amount
wrong amount
The deal carries a different amount than the intent stated.
$observed.deal_readback.properties.amount
ne
$input.amount
deal_predates_operation
pre existing state
The deal is older than the operation. It proves nothing.
$observed.deal_readback.createdAt
time_before
$operation.created_at
duplicate_deal_present
duplicate side effect
HubSpot created more than one deal in the account since the operation started. Do not retry.
$observed.deal_creation_events_in_account.count
gt
1
deal_in_another_stage
wrong subject
The deal sits in a different stage than the intent named. HubSpot sets the stage from the create request, so no wait changes it. Stop and ask a person.
$observed.deal_readback.properties.dealstage
ne
$input.dealstage
Which observed states map to a verdict before completion?
Rule
Match
Verdict
Reason
deal_archived
$observed.deal_readback.archived eq true
CONTRADICTED
The deal is archived. The record left the pipeline. Ask a person.
How long does the runtime observe?
Timing member
Value
Initial delay
1000 ms
Poll interval
5000 ms
Backoff
exponential factor 2, max 60000 ms
Maximum attempts
40
Timeout
900000 ms
Stale read window
20000 ms
On timeout
UNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person