Drift checks
developerpaper modeThe drift report schema. Proposals are previews that require human confirmation.
What a drift check does
buildDriftReport(coil, currentWeightsBps, nowIso) compares the Coil’s target weights against weights you supply (from a paper simulation, or from your own agent’s read-only account snapshot) and flags every position whose drift meets the Coil’s rebalance threshold. When at least one entry breaches, the report attaches a rebalance proposal.
Report schema
| Field | Type | Required | Description |
|---|---|---|---|
| coilId | string | yes | The Coil being checked. |
| manifestHash | string | yes | Canonical hash of the allocation manifest at check time. |
| generatedAt | string (ISO) | yes | Explicit clock input — deterministic and replayable. |
| thresholdBps | number | yes | The Coil policy's driftThresholdBps. |
| entries | DriftEntry[] | yes | Per symbol: targetWeightBps, currentWeightBps, driftBps, breachesThreshold. |
| breachCount | number | yes | How many entries breach the threshold. |
| proposal | RebalanceProposal? | no | Present only when breachCount > 0. Always previews; requiresHumanConfirmation is hard-typed true. |
| disclaimer | string | yes | The fixed no-execution disclaimer, embedded in every report. |
Proposals are previews
Every intent inside a proposal has status: "preview" — there is no other value in the type. Notional and quantity are deliberately left undefined: sizing happens in the user’s own agent against live buying power, inside the fuses. Each intent carries its fuse checklist and three abort conditions, including “User has not confirmed this specific order.”
{
"coilId": "coil_7f31…",
"manifestHash": "9b41c8…",
"generatedAt": "2026-07-07T00:00:00.000Z",
"thresholdBps": 500,
"entries": [
{ "symbol": "AMD", "targetWeightBps": 2500, "currentWeightBps": 3200,
"driftBps": 700, "breachesThreshold": true },
{ "symbol": "MU", "targetWeightBps": 2500, "currentWeightBps": 2400,
"driftBps": -100, "breachesThreshold": false }
],
"breachCount": 1,
"proposal": {
"status": "proposal",
"requiresHumanConfirmation": true,
"intents": [
{
"status": "preview",
"symbol": "AMD",
"side": "sell",
"orderType": "market",
"timeInForce": "day",
"maxPositionWeightBps": 4000,
"maxDailyTurnoverBps": 2000,
"reason": "Drift +7.00% vs target 25.00%.",
"fuseChecks": ["maxPositionWeight", "maxSingleOrderNotional", "…"],
"abortConditions": [
"Any fuse breach",
"Stale or missing account data",
"User has not confirmed this specific order"
]
}
]
},
"disclaimer": "Drift computed from supplied weights. Proposals are previews requiring human confirmation — HISS never sends orders. Not investment advice."
}Where drift checks run
POST /api/tools/drift-check— the HTTP surface; see Agent tools API.hiss_drift_check— the MCP tool; see MCP server.- Inside every compiled runbook’s session protocol, between the read-only snapshot and the confirmation step.