| Avow cannot trade without swearing a note in the same transaction. | swear() is the agent's only route to the HSKSwap router | test_honouredLong |
| No note is larger than the denomination Avow has earned. | swear(): notional ≤ min(tier cap, maxNotional) | test_denominationCapsProbation |
| Stops stay inside the mandate, and every note must stand to win more than it risks. | swear(): stop ≤ maxStopBps, reward/risk ≥ minRewardRisk | test_stopTooWideAndRewardTooSmall |
| One note per asset, a pause between notes, and a hard horizon. | swear(): cooldown, one outstanding per asset, expiry ≤ maxHorizon | test_cooldownOnePerAssetAndHorizon |
| No note is sworn into a price spike. | swear(): |spot − 5-minute TWAP| ≤ maxSpotDevBps | test_noSwearingIntoASpike |
| No note can be fulfilled by its own trade. | swear(): after the swap, spot is still short of the target | test_aNoteCannotBeFulfilledByItsOwnSwap |
| Avow cannot swear a note that loses at the odds it publicly states; overstated odds are punished by the Brier grade and keep it on Probation. | swear(): p·reward > (1 − p)·risk, odds 50–99% | test_noNegativeExpectancyNotes |
| Anyone can stop a losing note. The stop needs no keeper and no permission. | settle(id) is public | test_voidLongIsThePermissionlessStopLoss |
| A spike cannot trigger a stop or a target. | settle(): both the TWAP and the live price must be past the level | test_aSpikeDoesNotTriggerTheStop |
| A level the price has already left again does not count. | settle(): reads the current TWAP and spot, not a past touch | test_aLevelThePriceLeftAgainDoesNotCount |
| Every note ends: at expiry anyone may settle it, and it is graded a miss. | settle(): now ≥ expiry → Lapsed, outcome 0 | test_lapsedNoteSettlesByAnyoneAndIsGradedAMiss |
| An honoured short buys back the asset and books its gain in USDT. | settle(): closing swap with an exit slippage bound | test_honouredShortEarnsUsdt |
| Retreating never improves the record: a retracted note is a miss and counts toward the void streak. | retract() grades 0 and extends the streak | test_fixed_L1_retractCountsTowardTheStreak |
| A stop can only move toward the entry, never away from it. | tightenStop(): new void between old void and entry | test_tightenStopOnlyTowardEntry |
| Autonomy is earned: five calibrated notes lift Avow from Probation to Apprentice. | tier rule: Brier below 0.25 and honoured notes ≥ 80% of the hits its odds claimed | test_aCalibratedRecordEarnsApprentice |
| Overconfidence is punished: a poorly calibrated record stays on Probation. | tier rule: Brier below 0.25 to leave Probation | test_overconfidenceKeepsTheAgentOnProbation |
| Coin-flip odds earn nothing: stating 50% and hitting less than claimed keeps Avow on Probation. | tier rule: Brier strictly below 0.25, hits ≥ 80% of those claimed | test_coinFlipsWithOneHitStayOnProbation |
| A note's settlement terms are fixed when it is sworn; a later amendment cannot change them. | swear() stores spot-deviation and exit-slippage bounds in the note | test_amendHasBoundsAndSwornNotesKeepTheirTerms |
| Avow can tighten its own mandate but never loosen it. | tighten(): every field equal or stricter, assets a subset | test_agentCanOnlyTighten |
| A paused vault swears nothing; a removed asset cannot be traded. | swear(): not paused, asset allowed | test_pausedAndDisallowedAssets |
| A drawdown past the limit freezes the vault until the owner unfreezes it. | NAV < HWM × (1 − maxDrawdown) → frozen | test_drawdownFreezesTheVault |
| After the daily loss limit, nothing new is sworn until the next day. | swear(): dailyLoss < dailyLossLimit | test_dailyLossLimit |
| Funds inside an outstanding note cannot be withdrawn, even by the owner. | withdraw(): amount ≤ free balance | test_ownerCannotWithdrawLockedFunds |
| No note may be sworn that loses at its own odds after the 0.60% round-trip pool fee. | swear(): p·(reward − fee) > (1 − p)·(risk + fee) | test_aTargetInsideTheFeeIsRefused |
| The owner cannot launder a loss: a revoked note is graded as a miss and marked at the TWAP. | revoke() → _grade(miss), P&L marked to market | test_retractAndRevokeAreBothGradedAsMisses |
| No one can settle a target or an expiry into a price spike; a stop never waits. | settleable(): live price within maxSpotDevBps of the TWAP, except for a void | test_aLapsedNoteWaitsForACalmPool |
| Only the agent's realised losses count toward the drawdown freeze, not the owner's inventory price moves. | _close(): realised equity vs its high-water mark | test_inventoryPriceMovesDoNotFreezeTheAgent |
| A stop fills in a fast crash: priced at the worse of the 5-minute TWAP and the live price, never more than 4× the exit slippage beyond the TWAP. | _close(): void floor | test_theStopExecutesInAFastCrash |