# Watchdog Seed Write Contract v1

## 1. Purpose / Audience

- Audience:
  - downstream watchdog
  - regression seed importer
  - API-first test-data builders
- Goal:
  - provide a stable write contract for test-data import
  - describe current service behavior, not static schema alone

## 2. Source Of Truth And Limits

- Truth priority:
  1. runtime behavior on the downstream local stack
  2. runtime `describe`
  3. server write-path code
  4. pack object JSON
- Runtime used for this doc:
  - bootstrap date: `2026-05-07`
  - pack root: `packs/NOT-EDIT-final-merged-packs`
  - API base: `/services/data/v63.0`
- Read paths used:
  - `POST /services/data/v63.0/sobjects/:object`
  - `PATCH /services/data/v63.0/sobjects/:object/:id`
  - `PATCH /services/data/v63.0/sobjects/:object/:fieldName/:fieldValue`
  - `GET /services/data/v63.0/sobjects/:object/describe`
- Important limits:
  - `describe` tells field existence, `createable`, `updateable`, picklist candidates.
  - final writability still depends on runtime behavior.
  - current upsert path is not true Salesforce external-id-only behavior.
  - current downstream runtime loaded `4` flows but `0` validation rules during probe bootstrap; this doc follows the observed runtime result.

## 3. Recommended Write Paths

- Single record / small batch:
  - sObject CRUD
- Relationship-aware batch:
  - Composite
- Large ingest:
  - Bulk

### Global write rules

- Safe class:
  - field exists
  - `describe.createable/updateable == true`
  - runtime probe succeeded
- Conditional class:
  - field exists
  - `describe` allows it
  - runtime acceptance depends on object graph / picklist / pack drift
- Forbidden class:
  - audit/system fields
  - formula / rollup / auto-number / derived fields
  - compound parent projections
  - fields not present on the runtime object

### Upsert contract

- Endpoint:
  - `PATCH /services/data/v63.0/sobjects/:object/:fieldName/:fieldValue`
- Current behavior:
  - accepts any existing field name, not just a real external-id field
  - service does read-then-write by that field
  - no uniqueness enforcement at handler level
- Seeding recommendation:
  - only use a synthetic unique field value under your control
  - treat upsert on non-unique fields as `unsafe`

### Common forbidden/system-managed fields

- Do not write:
  - `Id`
  - `CreatedDate`
  - `CreatedById`
  - `LastModifiedDate`
  - `LastModifiedById`
  - `SystemModstamp`
  - `IsDeleted`
- Observed runtime result:
  - sending `CreatedDate` returns `400 INVALID_FIELD`

## 4. Object-By-Object Contract

### Lead

- object API name:
  - `Lead`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Name`
- required on create:
  - `Company`
  - `Status`
- writable core fields:
  - `Name`
  - `Company`
  - `Status`
  - common business fields exposed as `createable/updateable` in `describe`
- system-managed / forbidden:
  - common system fields
  - `LastName` is not a valid field on this runtime object
- reference contract:
  - optional refs include `CampaignId`, `AssociateAccount__c`, `AssociateLead__c`
- enum / picklist contract:
  - tested `Status`: `Open - Not Contacted`
- runtime validators / business rules:
  - pack contains a post-convert readonly validation rule
  - tested runtime bootstrap loaded `0` validation rules
  - treat converted-lead immutability as `not runtime-proven`
- minimal valid payload:
```json
{
  "Name": "WD Lead 001",
  "Company": "WD Co 001",
  "Status": "Open - Not Contacted"
}
```
- common linked payload:
```json
{
  "Name": "WD Lead 001",
  "Company": "WD Co 001",
  "Status": "Open - Not Contacted",
  "CampaignId": "<campaignId>"
}
```
- related-link expectations:
  - for campaign attribution, create `CampaignMember` after `Lead`

### Account

- object API name:
  - `Account`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Name`
- required on create:
  - `Name`
- writable core fields:
  - `Name`
  - `Description`
  - `ParentId`
  - common account business fields from `describe`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `ParentId -> Account`
  - `OperatingHoursId -> OperatingHours`
- enum / picklist contract:
  - examples from pack:
    - `AccountSource`
    - `AccountStatus__c`
- runtime validators / business rules:
  - none observed beyond generic field validation
- minimal valid payload:
```json
{
  "Name": "WD Account 001"
}
```
- common linked payload:
```json
{
  "Name": "WD Child Account 001",
  "ParentId": "<accountId>",
  "Description": "seeded by watchdog"
}
```
- related-link expectations:
  - base parent for `Contact`, `Opportunity`, `Contract`, `Quote`, `Order`

### Contact

- object API name:
  - `Contact`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Name`
- required on create:
  - none marked required by pack
- writable core fields:
  - `Name`
  - `AccountId`
  - `Title`
- system-managed / forbidden:
  - common system fields
  - `LastName` is not a valid field on this runtime object
- reference contract:
  - `AccountId -> Account`
- enum / picklist contract:
  - optional picklists exist, but no create-time mandatory picklist observed
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Name": "WD Contact 001"
}
```
- common linked payload:
```json
{
  "Name": "WD Contact 001",
  "AccountId": "<accountId>",
  "Title": "QA"
}
```
- related-link expectations:
  - use `WhoId` on `Task` / `Event`
  - use `ContactId` on `OpportunityContactRole`

### Campaign

- object API name:
  - `Campaign`
- create / update / upsert:
  - create: yes
  - update: inferred from generic CRUD path
  - upsert: inferred from generic upsert path
- required on create:
  - `Name`
  - `IsActive`
- writable core fields:
  - `Name`
  - `IsActive`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - none required for minimal create
- enum / picklist contract:
  - use runtime `describe` if campaign-type fields matter
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Name": "WD Campaign 001",
  "IsActive": true
}
```
- common linked payload:
```json
{
  "Name": "WD Campaign 001",
  "IsActive": true
}
```
- related-link expectations:
  - parent for `CampaignMember`

### CampaignMember

- object API name:
  - `CampaignMember`
- create / update / upsert:
  - create: yes
  - update: inferred from generic CRUD path
  - upsert: inferred but not runtime-probed
- required on create:
  - `CampaignId`
- writable core fields:
  - `CampaignId`
  - `LeadId` or `ContactId`
  - `Status`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `CampaignId -> Campaign`
  - `LeadId -> Lead`
  - `ContactId -> Contact`
  - create one side only: `LeadId` or `ContactId`
- enum / picklist contract:
  - tested `Status`: `Sent`
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "CampaignId": "<campaignId>",
  "LeadId": "<leadId>"
}
```
- common linked payload:
```json
{
  "CampaignId": "<campaignId>",
  "LeadId": "<leadId>",
  "Status": "Sent"
}
```
- related-link expectations:
  - needed for campaign related-list visibility

### CampaignMemberStatus

- object API name:
  - `CampaignMemberStatus`
- create / update / upsert:
  - standalone sObject REST create: no
  - `describe`: `404 NOT_FOUND`
  - correct entry: currently `unsupported as standalone runtime sObject`
- required on create:
  - n/a
- writable fields:
  - n/a through standard sObject REST in current runtime
- system-managed / forbidden:
  - treat all standalone writes as unsupported
- reference contract:
  - n/a
- enum / picklist contract:
  - n/a
- runtime validators / business rules:
  - object drift vs requested Salesforce surface
- minimal valid payload:
```json
{}
```
- common linked payload:
```json
{}
```
- related-link expectations:
  - campaign-member status management needs a later dedicated contract

### Opportunity

- object API name:
  - `Opportunity`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Name`
- required on create:
  - `Name`
  - `StageName`
  - `CloseDate`
- writable core fields:
  - `Name`
  - `StageName`
  - `CloseDate`
  - `AccountId`
  - `Pricebook2Id`
  - `Description`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `AccountId -> Account`
  - `Pricebook2Id -> Pricebook2`
- enum / picklist contract:
  - tested `StageName`: `Prospecting`
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Name": "WD Opportunity 001",
  "StageName": "Prospecting",
  "CloseDate": "2026-05-31"
}
```
- common linked payload:
```json
{
  "Name": "WD Opportunity 001",
  "StageName": "Prospecting",
  "CloseDate": "2026-05-31",
  "AccountId": "<accountId>",
  "Pricebook2Id": "<pricebook2Id>"
}
```
- related-link expectations:
  - base parent for `OpportunityContactRole`
  - base parent for `OpportunityLineItem`

### OpportunityContactRole

- object API name:
  - `OpportunityContactRole`
- create / update / upsert:
  - create: inferred from generic CRUD path
  - update: inferred
  - upsert: inferred
- required on create:
  - `OpportunityId`
  - `ContactId`
  - `IsPrimary`
- writable core fields:
  - `OpportunityId`
  - `ContactId`
  - `IsPrimary`
  - `Role`
  - `Relationship__c`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `OpportunityId -> Opportunity`
  - `ContactId -> Contact`
- enum / picklist contract:
  - example `Relationship__c`: `Ally`, `Supporter`, `Neutral`, `Opponent`
- runtime validators / business rules:
  - pack includes `Std_SyncOpportunityContactRole` flow for lead-convert path
  - direct CRUD contract still exists
- minimal valid payload:
```json
{
  "OpportunityId": "<opportunityId>",
  "ContactId": "<contactId>",
  "IsPrimary": true
}
```
- common linked payload:
```json
{
  "OpportunityId": "<opportunityId>",
  "ContactId": "<contactId>",
  "IsPrimary": true,
  "Relationship__c": "Supporter"
}
```
- related-link expectations:
  - create at least one primary OCR if UI/test expects contact-role presence

### OpportunityLineItem

- object API name:
  - `OpportunityLineItem`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - `OpportunityId`
  - `Quantity`
- writable core fields:
  - `OpportunityId`
  - `Product2Id`
  - `Quantity`
  - `UnitPrice`
- system-managed / forbidden:
  - common system fields
  - `PricebookEntryId` is not a valid field on this runtime object
- reference contract:
  - `OpportunityId -> Opportunity`
  - `Product2Id -> Product2`
  - recommended parent graph:
    - `Pricebook2`
    - `Product2`
    - `Opportunity.Pricebook2Id`
    - `OpportunityLineItem.Product2Id`
- enum / picklist contract:
  - none required for minimal create
- runtime validators / business rules:
  - current runtime differs from Salesforce-style `PricebookEntryId` contract
- minimal valid payload:
```json
{
  "OpportunityId": "<opportunityId>",
  "Product2Id": "<product2Id>",
  "Quantity": 1,
  "UnitPrice": 123
}
```
- common linked payload:
```json
{
  "OpportunityId": "<opportunityId>",
  "Product2Id": "<product2Id>",
  "Quantity": 2,
  "UnitPrice": 123
}
```
- related-link expectations:
  - opportunity-product related pages expect at least one line item

### Pricebook2

- object API name:
  - `Pricebook2`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - none runtime-required in tested stack
- writable core fields:
  - `Name`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - none
- enum / picklist contract:
  - none required
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Name": "WD Pricebook 001"
}
```
- common linked payload:
```json
{
  "Name": "WD Pricebook 001"
}
```
- related-link expectations:
  - parent for `PricebookEntry`
  - link from `Opportunity`, `Contract`, `Order`

### Product2

- object API name:
  - `Product2`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - `Name`
- writable core fields:
  - `Name`
  - `Family`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - none required for minimal create
- enum / picklist contract:
  - example `Family`: `None`
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Name": "WD Product 001"
}
```
- common linked payload:
```json
{
  "Name": "WD Product 001",
  "Family": "None"
}
```
- related-link expectations:
  - parent for `PricebookEntry`
  - direct product reference for line items in current runtime

### PricebookEntry

- object API name:
  - `PricebookEntry`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - `Pricebook2Id`
  - `Product2Id`
  - `UnitPrice`
- writable core fields:
  - `Pricebook2Id`
  - `Product2Id`
  - `UnitPrice`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `Pricebook2Id -> Pricebook2`
  - `Product2Id -> Product2`
- enum / picklist contract:
  - none required
- runtime validators / business rules:
  - object exists and is writeable
  - downstream line-item objects do not currently consume `PricebookEntryId` directly
- minimal valid payload:
```json
{
  "Pricebook2Id": "<pricebook2Id>",
  "Product2Id": "<product2Id>",
  "UnitPrice": 123
}
```
- common linked payload:
```json
{
  "Pricebook2Id": "<pricebook2Id>",
  "Product2Id": "<product2Id>",
  "UnitPrice": 123
}
```
- related-link expectations:
  - keep creating it for pricebook realism even if current line-item CRUD uses `Product2Id`

### Quote

- object API name:
  - `Quote`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Name`
- required on create:
  - `Name`
  - `How_will_the_customer_place_an_order__c`
  - `Payment_Term__c`
  - `Payment_Type__c`
  - `Status`
- writable core fields:
  - required fields above
  - `AccountId`
  - `OpportunityId`
  - `ContactId`
  - `ContractId`
  - `Description`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `AccountId -> Account`
  - `OpportunityId -> Opportunity`
  - `ContactId -> Contact`
  - `ContractId -> Contract`
- enum / picklist contract:
  - tested `How_will_the_customer_place_an_order__c`: `Directly with PingCAP`
  - `Status` is currently a string field, not a frozen picklist contract
  - tested `Status`: `Draft`
- runtime validators / business rules:
  - none observed beyond required field checks
- minimal valid payload:
```json
{
  "Name": "WD Quote 001",
  "How_will_the_customer_place_an_order__c": "Directly with PingCAP",
  "Payment_Term__c": "Net 30",
  "Payment_Type__c": "Wire",
  "Status": "Draft"
}
```
- common linked payload:
```json
{
  "Name": "WD Quote 001",
  "AccountId": "<accountId>",
  "OpportunityId": "<opportunityId>",
  "ContactId": "<contactId>",
  "ContractId": "<contractId>",
  "How_will_the_customer_place_an_order__c": "Directly with PingCAP",
  "Payment_Term__c": "Net 30",
  "Payment_Type__c": "Wire",
  "Status": "Draft"
}
```
- related-link expectations:
  - quote page normally expects parent relationship to account/opportunity
  - add `QuoteLineItem` for product-related quote pages

### QuoteLineItem

- object API name:
  - `QuoteLineItem`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - `QuoteId`
  - `Quantity`
  - `UnitPrice`
- writable core fields:
  - `QuoteId`
  - `Product2Id`
  - `Quantity`
  - `UnitPrice`
- system-managed / forbidden:
  - common system fields
  - `PricebookEntryId` is not a valid field on this runtime object
- reference contract:
  - `QuoteId -> Quote`
  - `Product2Id -> Product2`
- enum / picklist contract:
  - none required for minimal create
- runtime validators / business rules:
  - runtime object shape differs from Salesforce-style `PricebookEntryId`
- minimal valid payload:
```json
{
  "QuoteId": "<quoteId>",
  "Product2Id": "<product2Id>",
  "Quantity": 1,
  "UnitPrice": 123
}
```
- common linked payload:
```json
{
  "QuoteId": "<quoteId>",
  "Product2Id": "<product2Id>",
  "Quantity": 1,
  "UnitPrice": 123
}
```
- related-link expectations:
  - required for quote line-item related lists

### Order

- object API name:
  - `Order`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `AccountId` in probe; not recommended for stable multi-row imports
- required on create:
  - `AccountId`
  - `CurrencyIsoCode`
  - `EffectiveDate`
  - `Status`
- writable core fields:
  - required fields above
  - `OpportunityId`
  - `QuoteId`
  - `ContractId`
  - `Pricebook2Id`
  - `Description`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `AccountId -> Account`
  - `OpportunityId -> Opportunity`
  - `QuoteId -> Quote`
  - `ContractId -> Contract`
  - `Pricebook2Id -> Pricebook2`
- enum / picklist contract:
  - tested `CurrencyIsoCode`: `USD`
  - `Status` is currently a string field in pack/runtime surface
  - tested `Status`: `Draft`
- runtime validators / business rules:
  - pack contains order-activation validation rules
  - tested runtime bootstrap loaded `0` validation rules
  - observed behavior: `PATCH Status=Activated` succeeded even with a `Draft` contract
  - treat activation guardrails as `drift / not enforced in current runtime`
- minimal valid payload:
```json
{
  "AccountId": "<accountId>",
  "CurrencyIsoCode": "USD",
  "EffectiveDate": "2026-05-07",
  "Status": "Draft"
}
```
- common linked payload:
```json
{
  "AccountId": "<accountId>",
  "OpportunityId": "<opportunityId>",
  "QuoteId": "<quoteId>",
  "ContractId": "<contractId>",
  "Pricebook2Id": "<pricebook2Id>",
  "CurrencyIsoCode": "USD",
  "EffectiveDate": "2026-05-07",
  "Status": "Draft"
}
```
- related-link expectations:
  - add `OrderItem` for order-product related lists

### OrderItem

- object API name:
  - `OrderItem`
- create / update / upsert:
  - create: yes
  - update: inferred
  - upsert: inferred
- required on create:
  - `OrderId`
  - `Quantity`
  - `UnitPrice`
- writable core fields:
  - `OrderId`
  - `Product2Id`
  - `Quantity`
  - `UnitPrice`
  - `QuoteLineItemId`
- system-managed / forbidden:
  - common system fields
  - `PricebookEntryId` is not a valid field on this runtime object
- reference contract:
  - `OrderId -> Order`
  - `Product2Id -> Product2`
  - optional `QuoteLineItemId -> QuoteLineItem`
- enum / picklist contract:
  - none required
- runtime validators / business rules:
  - runtime object shape differs from Salesforce-style `PricebookEntryId`
- minimal valid payload:
```json
{
  "OrderId": "<orderId>",
  "Product2Id": "<product2Id>",
  "Quantity": 1,
  "UnitPrice": 123
}
```
- common linked payload:
```json
{
  "OrderId": "<orderId>",
  "Product2Id": "<product2Id>",
  "QuoteLineItemId": "<quoteLineItemId>",
  "Quantity": 1,
  "UnitPrice": 123
}
```
- related-link expectations:
  - required for order line-item related lists

### Contract

- object API name:
  - `Contract`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `AccountId`; use a unique synthetic key instead if available
- required on create:
  - `AccountId`
  - `ContractTerm`
  - `StartDate`
  - `Status`
- writable core fields:
  - required fields above
  - `Pricebook2Id`
  - `Opportunity__c`
  - `Description`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `AccountId -> Account`
  - `Pricebook2Id -> Pricebook2`
  - `Opportunity__c -> Opportunity`
- enum / picklist contract:
  - tested `Status`: `Draft`
  - pack options also include `InApproval`, `Activated`, `Effective`
- runtime validators / business rules:
  - no activation/effective validator was runtime-proven in this stack
- minimal valid payload:
```json
{
  "AccountId": "<accountId>",
  "ContractTerm": 12,
  "StartDate": "2026-05-01",
  "Status": "Draft"
}
```
- common linked payload:
```json
{
  "AccountId": "<accountId>",
  "Pricebook2Id": "<pricebook2Id>",
  "Opportunity__c": "<opportunityId>",
  "ContractTerm": 12,
  "StartDate": "2026-05-01",
  "Status": "Draft"
}
```
- related-link expectations:
  - common parent for `Quote` and `Order`

### Task

- object API name:
  - `Task`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Subject`
- required on create:
  - none runtime-required in tested stack
- writable core fields:
  - `Subject`
  - `Status`
  - `Priority`
  - `WhoId`
  - `WhatId`
  - `Type`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `WhoId -> Contact | Lead`
  - `WhatId -> Account | Campaign | Contract | Opportunity | Order | Product2 | Quote | ...`
- enum / picklist contract:
  - tested `Status`: `Open`
  - tested `Priority`: `Normal`
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Subject": "WD Task 001"
}
```
- common linked payload:
```json
{
  "Subject": "WD Task 001",
  "WhatId": "<accountId>",
  "WhoId": "<contactId>",
  "Status": "Open",
  "Priority": "Normal"
}
```
- related-link expectations:
  - use `WhatId` / `WhoId` if activity related lists are asserted

### Event

- object API name:
  - `Event`
- create / update / upsert:
  - create: yes
  - update: yes
  - upsert: yes
  - tested upsert key: `Subject`; unsafe if non-unique
- required on create:
  - none runtime-required in tested stack
- writable core fields:
  - `Subject`
  - `StartDateTime`
  - `EndDateTime`
  - `WhoId`
  - `WhatId`
  - `Location`
- system-managed / forbidden:
  - common system fields
- reference contract:
  - `WhoId -> Contact | Lead`
  - `WhatId -> Account | Campaign | Contract | Opportunity | Order | Product2 | Quote | ...`
- enum / picklist contract:
  - tested `Subject`: `Meeting`
  - pack also exposes picklist subjects like `Call`, `Email`, `Other`
- runtime validators / business rules:
  - none observed
- minimal valid payload:
```json
{
  "Subject": "Meeting"
}
```
- common linked payload:
```json
{
  "Subject": "Meeting",
  "WhatId": "<accountId>",
  "WhoId": "<contactId>",
  "StartDateTime": "2026-05-07T09:00:00Z",
  "EndDateTime": "2026-05-07T10:00:00Z"
}
```
- related-link expectations:
  - use `WhatId` / `WhoId` if activity related lists are asserted

## 5. Known Gaps / Unsupported Paths

- High-confidence drifts vs Salesforce-like expectations:
  - `Lead` uses `Name`; `LastName` is invalid
  - `Contact` uses `Name`; `LastName` is invalid
  - `OpportunityLineItem` uses `Product2Id`; `PricebookEntryId` is invalid
  - `QuoteLineItem` uses `Product2Id`; `PricebookEntryId` is invalid
  - `OrderItem` uses `Product2Id`; `PricebookEntryId` is invalid
  - `CampaignMemberStatus` has no standalone `describe` / sObject REST surface
- Validation-rule drift:
  - pack contains `Lead` and `Order` validation rules
  - tested runtime loaded `0` validation rules
  - do not assume pack-side validation JSON is active until re-probed
- Upsert caution:
  - handler accepts arbitrary existing fields
  - non-unique keys are unsafe for stable imports

### Future scope

- not covered in v1:
  - setup-family objects
  - approval-family objects
  - reporting-family objects
  - integration-family objects
- those families likely need:
  - special entry points
  - separate runtime probes
  - machine-readable contract later

## 6. Verification Method

- Code-derived:
  - generic record CRUD handler
  - external-field upsert handler
  - runtime `describe`
  - pack object JSON
  - pack validation / flow payload
- Runtime-probed objects:
  - `Account`
  - `Contact`
  - `Lead`
  - `Campaign`
  - `CampaignMember`
  - `Opportunity`
  - `OpportunityLineItem`
  - `Pricebook2`
  - `Product2`
  - `PricebookEntry`
  - `Quote`
  - `QuoteLineItem`
  - `Order`
  - `OrderItem`
  - `Contract`
  - `Task`
  - `Event`
- Probe types:
  - minimal create
  - update by record id
  - upsert by field path
  - forbidden field injection
  - relation-chain create

## 7. Change Policy

- Update this doc when any of these change:
  - pack object shape
  - runtime `describe`
  - validation/flow install behavior
  - write handler semantics
- Merge policy for future revisions:
  - runtime behavior wins over pack intent
  - if pack intent and runtime behavior diverge, document both and mark `drift`
  - add probe evidence before claiming a field/object is stable for seed import
