@shirudo/ddd-kit 2.2.0 → 3.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/array/is-built-in.ts","../src/utils/array/deep-equal.ts","../src/testing/contract-assertions.ts","../src/testing/es-repository-contract.ts","../src/testing/repository-contract.ts"],"names":["tagA","tagB","len"],"mappings":";;;;AAcA,IAAM,aAAA,uBAAyC,GAAA,CAAI;AAAA,EAClD,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,4BAAA;AAAA,EACA;AACD,CAAC,CAAA;AAMD,SAAS,eAAA,CACR,OACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA,EAAG,GAAA;AAG1D,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAA;AAChE,EAAA,OAAO,GAAA;AACR;AATS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAWT,IAAM,WAAA,GAAc,KAAK,SAAA,CAAU,OAAA;AACnC,IAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AACxD,IAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AACxD,IAAM,UAAA,GAAa,QAAQ,SAAA,CAAU,GAAA;AACrC,IAAM,UAAA,GAAa,QAAQ,SAAA,CAAU,GAAA;AACrC,IAAM,qBAAA,GAAwB,eAAA,CAAgB,QAAA,CAAS,SAAA,EAAW,YAAY,CAAA;AAC9E,IAAM,wBAAA,GAA2B,eAAA;AAAA,EAChC,WAAA,CAAY,SAAA;AAAA,EACZ;AACD,CAAA;AACA,IAAM,8BAAA,GACL,OAAO,iBAAA,KAAsB,WAAA,GAC1B,SACA,eAAA,CAAgB,iBAAA,CAAkB,WAAW,YAAY,CAAA;AAC7D,IAAM,eAAA,GAAkB,eAAA,CAAgB,MAAA,CAAO,SAAA,EAAW,QAAQ,CAAA;AAClE,IAAM,cAAA,GAAiB,QAAQ,SAAA,CAAU,OAAA;AACzC,IAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,OAAA;AACvC,IAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,OAAA;AACvC,IAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,OAAA;AACvC,IAAM,gBAAA,GAAmB,SAAS,SAAA,CAAU,QAAA;AAC5C,IAAM,YAAY,EAAC;AAEnB,IAAM,2BAAA,GAA8B;AAAA,EACnC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAA;AAEA,IAAM,8BAA2D,IAAI,GAAA;AAAA,EACpE,2BAAA,CAA4B,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,wBAAA,CAAyB,UAAA,EAAY,IAAI,CAAA;AACnE,IAAA,MAAM,YAAY,UAAA,EAAY,KAAA;AAC9B,IAAA,OAAO,OAAO,SAAA,KAAc,UAAA,GACzB,CAAC,CAAC,IAAA,EAAM,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAC,CAAU,CAAA,GAClD,EAAC;AAAA,EACL,CAAC;AACF,CAAA;AACA,IAAM,gCAAqD,IAAI,GAAA;AAAA,EAC9D,4BAA4B,MAAA;AAC7B,CAAA;AACA,IAAM,qBAAA,GAAwB;AAAA,EAC7B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACD,CAAA;AAEO,SAAS,+BAAA,CACf,WACA,YAAA,EACU;AACV,EAAA,MAAM,wBAAwB,MAAA,CAAO,wBAAA;AAAA,IACpC,SAAA;AAAA,IACA;AAAA,GACD;AACA,EAAA,MAAM,uBAAuB,qBAAA,EAAuB,KAAA;AACpD,EAAA,IACC,0BAA0B,MAAA,IAC1B,EAAE,WAAW,qBAAA,CAAA,IACb,OAAO,yBAAyB,UAAA,EAC/B;AACD,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI;AACH,IAAA,eAAA,GAAkB,gBAAA,CAAiB,KAAK,oBAAoB,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACA,EAAA,MAAM,iBACL,YAAA,KAAiB,MAAA,GACd,MAAA,GACA,2BAAA,CAA4B,IAAI,YAAY,CAAA;AAChD,EAAA,IACE,cAAA,KAAmB,MAAA,IAAa,eAAA,KAAoB,cAAA,IACpD,cAAA,KAAmB,UACnB,CAAC,6BAAA,CAA8B,GAAA,CAAI,eAAe,CAAA,EAClD;AACD,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,iBAAiB,MAAA,CAAO,wBAAA;AAAA,IAC7B,oBAAA;AAAA,IACA;AAAA,GACD;AACA,EAAA,MAAM,aAAA,GACL,cAAA,KAAmB,MAAA,IACnB,OAAA,IAAW,cAAA,IACX,OAAO,cAAA,CAAe,KAAA,KAAU,QAAA,GAC7B,cAAA,CAAe,KAAA,GACf,MAAA;AACJ,EAAA,MAAM,gBAAgB,YAAA,IAAgB,aAAA;AACtC,EAAA,MAAM,kBACL,aAAA,KAAkB,MAAA,GACf,MAAA,GACA,2BAAA,CAA4B,IAAI,aAAa,CAAA;AACjD,EAAA,OACC,aAAA,KAAkB,aAAA,IAClB,eAAA,KAAoB,MAAA,IACpB,eAAA,KAAoB,eAAA,IACpB,MAAA,CAAO,wBAAA,CAAyB,oBAAA,EAAsB,WAAW,CAAA,EAC9D,KAAA,KAAU,SAAA;AAEf;AAzDgB,MAAA,CAAA,+BAAA,EAAA,iCAAA,CAAA;AA0LhB,SAAS,kBAAA,CAAmB,OAAe,YAAA,EAA+B;AACzE,EAAA,MAAM,OAAA,uBAAc,OAAA,EAAgB;AACpC,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAE3C,EAAA,OAAO,cAAc,IAAA,IAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACrD,IAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,IAAA,IAAI,+BAAA,CAAgC,SAAA,EAAW,YAAY,CAAA,EAAG;AAC7D,MAAA,OAAO,IAAA;AAAA,IACR;AACA,IAAA,SAAA,GAAY,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,KAAA;AACR;AAZS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAoBT,SAAS,QAAA,CAAS,KAAa,GAAA,EAAsB;AACpD,EAAA,IAAI;AACH,IAAA,QAAQ,GAAA;AAAK,MACZ,KAAK,eAAA;AACJ,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,iBAAA;AACJ,QAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,cAAA;AACJ,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,cAAA;AACJ,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,kBAAA;AACJ,QAAA,UAAA,CAAW,IAAA,CAAK,KAAK,SAAS,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,kBAAA;AACJ,QAAA,UAAA,CAAW,IAAA,CAAK,KAAK,SAAS,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,mBAAA;AACJ,QAAA,qBAAA,CAAsB,KAAK,GAAG,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,sBAAA;AACJ,QAAA,wBAAA,CAAyB,KAAK,GAAG,CAAA;AACjC,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,4BAAA;AACJ,QAAA,IAAI,CAAC,gCAAgC,OAAO,KAAA;AAC5C,QAAA,8BAAA,CAA+B,KAAK,GAAG,CAAA;AACvC,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,kBAAA;AACJ,QAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,iBAAA;AACJ,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,iBAAA;AACJ,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,iBAAA;AACJ,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,QAAA,OAAO,IAAA;AAAA,MACR,KAAK,kBAAA;AACJ,QAAA,OAAO,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAAA,MACzC,KAAK,gBAAA;AACJ,QAAA,OAAO,qBAAA,CAAsB,IAAA;AAAA,UAAK,CAAC,IAAA,KAClC,kBAAA,CAAmB,GAAA,EAAK,IAAI;AAAA,SAC7B;AAAA,MACD;AACC,QAAA,OAAO,KAAA;AAAA;AACT,EACD,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACD;AAvDS,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAoEF,SAAS,eAAA,CAAgB,KAAa,GAAA,EAAsB;AAGlE,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,KAAA;AACnC,EAAA,OAAO,cAAc,GAAA,CAAI,GAAG,CAAA,IAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACnD;AAPgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;AClZhB,IAAM,WAAW,MAAA,CAAO,SAAA;AACxB,IAAM,cAAc,QAAA,CAAS,QAAA;AAC7B,IAAM,YAAY,QAAA,CAAS,cAAA;AAO3B,SAAS,aAAA,CAAc,GAAY,CAAA,EAAqB;AACvD,EAAA,OACC,CAAA,KAAM,KAAM,MAAA,CAAO,KAAA,CAAM,CAAW,CAAA,IAAK,MAAA,CAAO,MAAM,CAAW,CAAA;AAEnE;AAJS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAgCF,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAC1D,EAAA,OAAO,cAAA,CAAe,CAAA,EAAG,CAAA,kBAAG,IAAI,SAAkC,CAAA;AACnE;AAFgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAqBhB,SAAS,cAAA,CACR,CAAA,EACA,CAAA,EACA,OAAA,EACU;AAEV,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AAEpB,EAAA,MAAM,QAAQ,OAAO,CAAA;AACrB,EAAA,MAAM,QAAQ,OAAO,CAAA;AAGrB,EAAA,IAAI,UAAU,QAAA,IAAY,CAAA,KAAM,QAAQ,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAM;AAEzE,IAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAA,EAAU;AAC7C,MAAA,OAAO,OAAO,KAAA,CAAM,CAAW,CAAA,IAAK,MAAA,CAAO,MAAM,CAAW,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,KAAA;AAAA,EACR;AAIA,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AAGb,EAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC/B,EAAA,IAAI,QAAA,EAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAIxB,IAAA,OAAO,IAAA;AAAA,EACR;AACA,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,QAAA,uBAAe,OAAA,EAAQ;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,QAAQ,CAAA;AAAA,EAC3B;AACA,EAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AAGjB,EAAA,IAAI,YAAY,MAAA,CAAO,IAAI,KAAK,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,EAAG;AACzD,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,EAAG,OAAO,KAAA;AAEnE,IAAA,MAAMA,KAAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,MAAMC,KAAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,IAAID,KAAAA,KAASC,OAAM,OAAO,KAAA;AAG1B,IAAA,IAAID,UAAS,mBAAA,EAAqB;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,KAAA,CAAM,UAAA,EAAY,OAAO,KAAA;AAElD,MAAA,MAAME,OAAM,KAAA,CAAM,UAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC7B,QAAA,IAAI,KAAA,CAAM,SAAS,CAAC,CAAA,KAAM,MAAM,QAAA,CAAS,CAAC,GAAG,OAAO,KAAA;AAAA,MACrD;AACA,MAAA,OAAO,IAAA;AAAA,IACR;AAIA,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,IAAA,GAAO,IAAA;AAEb,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,IAAA,IAAI,GAAA,KAAQ,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AAEhC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC7B,MAAA,IAAI,CAAC,cAAc,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAKA,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAA;AACzD,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AAExC,IAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,CAAQ,IAAI,EAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,QAAQ,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,CAAQ,IAAI,EAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,QAAQ,CAAA;AACpE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAE1C,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,GAAG,GAAG,OAAO,KAAA;AAQvC,MAAA,IAAI,CAAC,eAAe,IAAA,CAAK,GAAG,GAAG,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AACnD,QAAA,OAAO,KAAA;AAAA,MACR;AAAA,IACD;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAKA,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,IAAI,IAAA,KAAS,MAAM,OAAO,KAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAE3C,EAAA,IAAI,QAAA,KAAa,UAAU,OAAO,KAAA;AAElC,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,OAAO,mBAAA,CAAoB,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,EAC/C;AAEA,EAAA,QAAQ,IAAA;AAAM,IACb,KAAK,cAAA,EAAgB;AACpB,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,MAAM,IAAA,GAAO,IAAA;AAEb,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AAEpC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,IAAA,EAAM;AAE/B,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,OAAO,KAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,OAAO,GAAG,OAAO,KAAA;AAAA,MAClD;AACA,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,IAEA,KAAK,cAAA,EAAgB;AACpB,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,MAAM,IAAA,GAAO,IAAA;AAEb,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AAGpC,MAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,OAAO,KAAA;AAAA,MAC9B;AACA,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,IAEA,KAAK,eAAA,EAAiB;AAGrB,MAAA,OAAO,cAAe,IAAA,CAAc,OAAA,EAAQ,EAAI,IAAA,CAAc,SAAS,CAAA;AAAA,IACxE;AAAA,IAEA,KAAK,iBAAA,EAAmB;AACvB,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,OAAO,KAAK,MAAA,KAAW,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA;AAAA,IAC3D;AAAA,IAEA,KAAK,kBAAA;AAAA,IACL,KAAK,iBAAA;AAAA,IACL,KAAK,iBAAA;AAAA,IACL,KAAK,iBAAA,EAAmB;AAGvB,MAAA,OAAO,aAAA;AAAA,QACL,KAAgC,OAAA,EAAQ;AAAA,QACxC,KAAgC,OAAA;AAAQ,OAC1C;AAAA,IACD;AAAA,IAEA,SAAS;AAOR,MAAA,OAAO,IAAA,KAAS,IAAA;AAAA,IACjB;AAAA;AAEF;AAvLS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA8LT,SAAS,mBAAA,CACR,IAAA,EACA,IAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,MAAM,IAAA,GAAO,IAAA;AAMb,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,mBAAA,CAAoB,IAAI,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,mBAAA,CAAoB,IAAI,CAAA;AACnD,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAEtD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,qBAAA,CAAsB,IAAI,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,qBAAA,CAAsB,IAAI,CAAA;AACrD,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAItD,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAY,WAAW,CAAA;AAElD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC9B,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,GAAG,GAAG,OAAO,KAAA;AAAA,EACxC;AACA,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC9B,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,GAAG,OAAO,KAAA;AAAA,EACtC;AAEA,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC9B,IAAA,IAAI,CAAC,eAAe,IAAA,CAAK,GAAG,GAAG,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AACnD,MAAA,OAAO,KAAA;AAAA,IACR;AAAA,EACD;AACA,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC9B,IAAA,IAAI,CAAC,eAAe,IAAA,CAAK,GAAG,GAAG,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AACnD,MAAA,OAAO,KAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,OAAO,IAAA;AACR;AA3CS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;;;ACjPT,eAAsB,wBAAA,CAGrB,mBACA,IAAA,EACgB;AAChB,EAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACH,IAAA,MAAM,KAAK,GAAG,CAAA;AAAA,EACf,SAAS,KAAA,EAAO;AACf,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,SAAA,GAAY,KAAA;AAAA,EACb;AACA,EAAA,IAAI;AACH,IAAA,MAAM,IAAI,QAAA,IAAW;AAAA,EACtB,SAAS,aAAA,EAAe;AACvB,IAAA,IAAI,CAAC,UAAA,EAAY;AAChB,MAAA,MAAM,aAAA;AAAA,IACP;AAAA,EACD;AACA,EAAA,IAAI,UAAA,EAAY;AACf,IAAA,MAAM,SAAA;AAAA,EACP;AACD;AAzBsB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AA4Bf,SAAS,iBAAiB,OAAA,EAA6C;AAC7E,EAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACd,MAAM,MAAA;AAAA,IACN,CAAC,KAAA,KAAmB;AAAA,GACrB;AACD;AALgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAYhB,eAAsB,mBAAA,CACrB,UAAA,EACA,EAAA,EACA,WAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAC1C,EAAA,MAAA;AAAA,IACC,MAAA,KAAW,IAAA;AAAA,IACX,CAAA,QAAA,EAAW,MAAA,CAAO,EAAE,CAAC,qDAAqD,WAAW,CAAA;AAAA,GACtF;AACA,EAAA,OAAO,MAAA;AACR;AAXsB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAkBf,SAAS,mBAAA,CACf,MACA,UAAA,EAKC;AACD,EAAA,OAAO;AAAA,IACN,IAAA;AAAA,IACA,OAAA,EAAS,EAAE,UAAA,EAAW;AAAA,IACtB,qBAAK,MAAA,CAAA,YAAY;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACT,yDAAyD,UAAU,CAAA,mKAAA;AAAA,OAGpE;AAAA,IACD,CAAA,EANK,KAAA;AAAA,GAON;AACD;AAnBgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAqBT,SAAS,MAAA,CAAO,WAAoB,OAAA,EAAoC;AAC9E,EAAA,IAAI,CAAC,SAAA,EAAW;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3D;AACD;AAJgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAMT,SAAS,WAAA,CACf,MAAA,EACA,QAAA,EACA,OAAA,EACO;AACP,EAAA,IAAI,WAAW,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACT,CAAA,8BAAA,EAAiC,OAAO,CAAA,WAAA,EAAc,MAAA,CAAO,QAAQ,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,KAC9F;AAAA,EACD;AACD;AAVgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA2BT,SAAS,uBAAA,CAAwB,OAAgB,IAAA,EAAuB;AAC9E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAa;AAC9B,EAAA,IAAI,OAAA,GAAmB,KAAA;AACvB,EAAA,OAAO,OAAA,KAAY,QAAQ,OAAA,KAAY,MAAA,IAAa,CAAC,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACvE,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAChC,MAAA,OAAO,KAAA;AAAA,IACR;AACA,IAAA,IAAI,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACR;AACA,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,IAAI;AACH,MAAA,OAAA,GAAW,OAAA,CAAgC,KAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,KAAA;AAAA,IACR;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAlBgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAqBT,SAAS,4BAAA,CACf,OACA,KAAA,EACU;AACV,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,SAAS,uBAAA,CAAwB,KAAA,EAAO,IAAI,CAAC,CAAA;AACjE;AALgB,MAAA,CAAA,4BAAA,EAAA,8BAAA,CAAA;AAOhB,SAAS,gBAAA,CAAiB,WAAmB,IAAA,EAAuB;AACnE,EAAA,IAAI;AACH,IAAA,IAAK,SAAA,CAAiC,SAAS,IAAA,EAAM;AACpD,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD,CAAA,CAAA,MAAQ;AAAA,EAER;AAIA,EAAA,IAAI;AACH,IAAA,IAAI,KAAA,GAAuB,MAAA,CAAO,cAAA,CAAe,SAAS,CAAA;AAC1D,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,KAAU,IAAA,IAAQ,KAAA,GAAQ,IAAI,KAAA,EAAA,EAAS;AAC1D,MAAA,IACE,KAAA,CAAM,WAAA,EAAgD,IAAA,KAAS,IAAA,EAC/D;AACD,QAAA,OAAO,IAAA;AAAA,MACR;AACA,MAAA,KAAA,GAAQ,MAAA,CAAO,eAAe,KAAK,CAAA;AAAA,IACpC;AAAA,EACD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACR;AAzBS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AA2BF,SAAS,cAAc,KAAA,EAAwB;AACrD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC3B,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACpB;AALgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;;;ACxBT,SAAS,gCAIf,OAAA,EAC6B;AAK7B,EAAA,MAAM,eAAA,2BAAmB,IAAA,KACxB,wBAAA,CAAyB,MAAM,OAAA,CAAQ,iBAAA,EAAkB,EAAG,IAAI,CAAA,EADzC,iBAAA,CAAA;AAGxB,EAAA,MAAM,UAAA,mBAAa,MAAA,CAAA,CAClB,UAAA,EACA,EAAA,KAEA,mBAAA;AAAA,IACC,UAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACD,EARkB,YAAA,CAAA;AAWnB,EAAA,eAAe,KAAK,GAAA,EAAyB;AAC5C,IAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,MAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,OAAO,SAAA;AAAA,EACR;AANe,EAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAQf,EAAA,eAAe,MAAA,CAAO,KAAU,EAAA,EAA+B;AAC9D,IAAA,OAAO,GAAA,CAAI,IAAI,CAAC,EAAE,YAAW,KAAM,UAAA,CAAW,UAAA,EAAY,EAAE,CAAC,CAAA;AAAA,EAC9D;AAFe,EAAA,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAOf,EAAA,MAAM,UAAA,2BAAc,MAAA,KACnB,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,CAAA,EADjB,YAAA,CAAA;AAEnB,EAAA,MAAM,4BAAY,MAAA,CAAA,CAAC,MAAA,KAClB,WAAW,MAAM,CAAA,CAAE,MAAK,EADP,WAAA,CAAA;AAIlB,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,wBAAwB,OAAA,CAAQ,qBAAA;AAEtC,EAAA,MAAM,8BAAc,MAAA,CAAA,CACnB,IAAA,EACA,eAC8B,mBAAA,CAAoB,IAAA,EAAM,UAAU,CAAA,EAH/C,aAAA,CAAA;AAKpB,EAAA,MAAM,KAAA,GAAoC;AAAA,IACzC;AAAA,MACC,IAAA,EAAM,sHAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,qBAAA,CAAsB,OAAO,EAAE,CAAA;AAC5D,QAAA,MAAA;AAAA,UACC,WAAW,MAAA,GAAS,CAAA;AAAA,UACpB;AAAA,SACD;AAIA,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AAG1C,QAAA,MAAM,aAAa,MAAM,GAAA,CAAI,IAAI,OAAO,EAAE,YAAW,KAAM;AAC1D,UAAA,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AAChD,UAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,UAAA,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AACvB,UAAA,OAAO,CAAA;AAAA,QACR,CAAC,CAAA;AACD,QAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,qBAAA,CAAsB,OAAO,EAAE,CAAA;AAC9D,QAAA,MAAA;AAAA,UACC,YAAA,CAAa,MAAA,KAAW,UAAA,CAAW,MAAA,GAAS,CAAA;AAAA,UAC5C;AAAA,SACD;AAMA,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,UAC7B,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,SAAA,KAAc,MAAA;AAAA,UACd;AAAA,SACD;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,0BAA0B,CAAA;AAAA,UAC7D,CAAA,oGAAA,EAAuG,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,SAChI;AAIA,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,qBAAA,CAAsB,OAAO,EAAE,CAAA;AAC7D,QAAA,MAAA;AAAA,UACC,UAAU,UAAA,CAAW,WAAW,CAAA,EAAG,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA,UAC3D;AAAA,SACD;AAGA,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,UAAA,CAAW,OAAA;AAAA,UACX;AAAA,SACD;AACA,QAAA,IAAI,aAAA,EAAe;AAClB,UAAA,MAAA;AAAA,YACC,SAAA;AAAA,cACC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,cACjC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,UAAU;AAAA,aACvC;AAAA,YACA;AAAA,WACD;AAAA,QACD;AAIA,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,qBAAA,EAAsB;AAC/C,QAAA,MAAA;AAAA,UACC,UAAU,SAAA,CAAU,MAAM,CAAA,EAAG,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,UACpD;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA9EG,KAAA;AAAA,KA+EN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,oFAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,aAAa,CAAA;AACrD,QAAA,WAAA;AAAA,UACC,UAAA,CAAW,MAAA;AAAA,UACX,CAAA;AAAA,UACA;AAAA,SACD;AAEA,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,qBAAA,CAAsB,UAAU,EAAE,CAAA;AAC3D,QAAA,MAAA;AAAA,UACC,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAAG,UAAU,CAAA;AAAA,UACxC;AAAA,SACD;AAGA,QAAA,WAAA;AAAA,UACC,UAAU,aAAA,CAAc,MAAA;AAAA,UACxB,CAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,SAAA,CAAU,gBAAA;AAAA,UACV,SAAA,CAAU,OAAA;AAAA,UACV;AAAA,SACD;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,EAAK,UAAU,EAAE,CAAA;AAC/C,QAAA,WAAA;AAAA,UACC,QAAA,CAAS,OAAA;AAAA,UACT,SAAA,CAAU,OAAA;AAAA,UACV;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,QAAA,CAAS,gBAAA;AAAA,UACT,QAAA,CAAS,OAAA;AAAA,UACT;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,SAAS,aAAA,CAAc,MAAA;AAAA,UACvB,CAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,IAAI,aAAA,EAAe;AAClB,UAAA,MAAA;AAAA,YACC,SAAA;AAAA,cACC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,cACpC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,SAAS;AAAA,aACtC;AAAA,YACA;AAAA,WACD;AAAA,QACD;AAAA,MACD,CAAC,CAAA,EA7DG,KAAA;AAAA,KA8DN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,uDAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,KAAA,GAAQ,QAAQ,eAAA,EAAgB;AACtC,QAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,GAAA;AAAA,UAAI,CAAC,EAAE,UAAA,OAC9B,UAAA,CAAW,OAAA,CAAQ,MAAM,EAAE;AAAA,SAC5B;AACA,QAAA,MAAA;AAAA,UACC,KAAA,KAAU,IAAA;AAAA,UACV;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAVG,KAAA;AAAA,KAWN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,8EAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjD,UAAA,MAAA;AAAA,YACC,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AAAA,YAC5B;AAAA,WACD;AAAA,QACD,CAAC,CAAA;AAAA,MACF,CAAC,CAAA,EAZG,KAAA;AAAA,KAaN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,2GAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,MAAM,aAAA,GAAgB,UAAU,aAAA,CAAc,MAAA;AAE9C,QAAA,MAAM,gBAAA;AAAA,UACL,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAC/B,YAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,UAC1C,CAAC;AAAA,SACF;AAEA,QAAA,WAAA;AAAA,UAAA,CACE,MAAM,GAAA,CAAI,qBAAA,CAAsB,SAAA,CAAU,EAAE,CAAA,EAAG,MAAA;AAAA,UAChD,CAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UAAA,CACE,MAAM,GAAA,CAAI,qBAAA,EAAsB,EAAG,MAAA;AAAA,UACpC,CAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,UAAU,aAAA,CAAc,MAAA;AAAA,UACxB,aAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,MAAA;AAAA,UACC,UAAU,gBAAA,KAAqB,MAAA;AAAA,UAC/B;AAAA,SACD;AAIA,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AACD,QAAA,WAAA;AAAA,UAAA,CACE,MAAM,GAAA,CAAI,qBAAA,CAAsB,SAAA,CAAU,EAAE,CAAA,EAAG,MAAA;AAAA,UAChD,aAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,SAAA,CAAU,gBAAA;AAAA,UACV,SAAA,CAAU,OAAA;AAAA,UACV;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAhDG,KAAA;AAAA,KAiDN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,yGAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AAED,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,qBAAA,CAAsB,UAAU,EAAE,CAAA;AACzD,QAAA,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,sCAAsC,CAAA;AAElE,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,qBAAA,CAAsB,SAAA,CAAU,IAAI,CAAC,CAAA;AAChE,QAAA,MAAA;AAAA,UACC,SAAA,CAAU,WAAW,QAAQ,CAAA,EAAG,WAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,UACzD;AAAA,SACD;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,qBAAA;AAAA,UAC1B,SAAA,CAAU,EAAA;AAAA,UACV,IAAA,CAAK;AAAA,SACN;AACA,QAAA,WAAA;AAAA,UACC,QAAA,CAAS,MAAA;AAAA,UACT,CAAA;AAAA,UACA;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA3BG,KAAA;AAAA;AA4BN,GACD;AAEA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,qBAAA,GACG;AAAA,MACA,IAAA,EAAM,8GAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,qBAAA,CAAsB,OAAO,EAAE,CAAA;AAE5D,QAAA,MAAM,YAAY,qBAAA,CAAsB,IAAA;AAAA,UACvC,OAAA;AAAA,UACA,MAAA,CAAO;AAAA,SACR;AACA,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,UAChC,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,6BAA6B,SAAA,EAAW;AAAA,YACvC,0BAAA;AAAA,YACA;AAAA,WACA,CAAA;AAAA,UACD,CAAA,8JAAA,EAAiK,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,SAC1L;AAEA,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,qBAAA,CAAsB,OAAO,EAAE,CAAA;AAC7D,QAAA,MAAA;AAAA,UACC,UAAU,UAAA,CAAW,WAAW,CAAA,EAAG,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,UACzD;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA3BG,KAAA;AAAA,KA4BN,GACC,WAAA;AAAA,MACA,8GAAA;AAAA,MACA;AAAA;AACD,GACH;AAEA,EAAA,OAAO,KAAA;AACR;AApWgB,MAAA,CAAA,+BAAA,EAAA,iCAAA,CAAA;;;AC4HT,SAAS,8BAGd,OAAA,EAAyE;AAK1E,EAAA,MAAM,eAAA,2BAAmB,IAAA,KACxB,wBAAA,CAAyB,MAAM,OAAA,CAAQ,iBAAA,EAAkB,EAAG,IAAI,CAAA,EADzC,iBAAA,CAAA;AAGxB,EAAA,MAAM,UAAA,mBAAa,MAAA,CAAA,CAClB,UAAA,EACA,EAAA,KAEA,mBAAA;AAAA,IACC,UAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACD,EARkB,YAAA,CAAA;AAWnB,EAAA,eAAe,KAAK,GAAA,EAAyB;AAC5C,IAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,IAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,MAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,OAAO,SAAA;AAAA,EACR;AAPe,EAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AASf,EAAA,eAAe,MAAA,CAAO,KAAU,EAAA,EAA+B;AAC9D,IAAA,OAAO,GAAA,CAAI,IAAI,CAAC,EAAE,YAAW,KAAM,UAAA,CAAW,UAAA,EAAY,EAAE,CAAC,CAAA;AAAA,EAC9D;AAFe,EAAA,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAOf,EAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,CAAC,MAAA,KACjB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA,EAAK,EAD1B,UAAA,CAAA;AAMjB,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,oBAAoB,OAAA,CAAQ,iBAAA;AAClC,EAAA,MAAM,wBAAwB,OAAA,CAAQ,qBAAA;AACtC,EAAA,MAAM,wBAAwB,OAAA,CAAQ,qBAAA;AACtC,EAAA,MAAM,wBAAA,GAA2B,QAAQ,wBAAA,KAA6B,IAAA;AAEtE,EAAA,MAAM,0BAAA,GACL,QAAQ,0BAAA,KAA+B,KAAA;AAExC,EAAA,MAAM,8BAAc,MAAA,CAAA,CACnB,IAAA,EACA,eAC4B,mBAAA,CAAoB,IAAA,EAAM,UAAU,CAAA,EAH7C,aAAA,CAAA;AAKpB,EAAA,MAAM,KAAA,GAAkC;AAAA,IACvC;AAAA,MACC,IAAA,EAAM,sGAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,qBAAA,EAAsB;AACnD,QAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAI7D,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AAG1C,QAAA,MAAM,aAAa,MAAM,GAAA,CAAI,IAAI,OAAO,EAAE,YAAW,KAAM;AAC1D,UAAA,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AAChD,UAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,UAAA,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AACvB,UAAA,OAAO,CAAA;AAAA,QACR,CAAC,CAAA;AACD,QAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,qBAAA,EAAsB;AACrD,QAAA,MAAA;AAAA,UACC,YAAA,CAAa,SAAS,UAAA,CAAW,MAAA;AAAA,UACjC;AAAA,SACD;AAKA,QAAA,MAAM,eAAe,YAAA,CAAa,MAAA;AAAA,UACjC,CAAC,KAAA,KAAU,CAAC,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO;AAAA,SAC3C;AACA,QAAA,MAAA;AAAA,UACC,YAAA,CAAa,MAAA,GAAS,CAAA,IACrB,YAAA,CAAa,KAAA;AAAA,YACZ,CAAC,KAAA,KAAU,KAAA,CAAM,gBAAA,KAAqB,UAAA,CAAW;AAAA,WAClD;AAAA,UACD,CAAA,mEAAA,EAAsE,WAAW,OAAO,CAAA,yUAAA;AAAA,SAIzF;AAGA,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,UAC7B,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,SAAA,KAAc,MAAA;AAAA,UACd;AAAA,SACD;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,0BAA0B,CAAA;AAAA,UAC7D,CAAA,oGAAA,EAAuG,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,SAChI;AAGA,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,UAAA,CAAW,OAAA;AAAA,UACX;AAAA,SACD;AACA,QAAA,IAAI,aAAA,EAAe;AAClB,UAAA,MAAA;AAAA,YACC,SAAA;AAAA,cACC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,cACjC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,UAAU;AAAA,aACvC;AAAA,YACA;AAAA,WAGD;AAAA,QACD;AAIA,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,qBAAA,EAAsB;AACpD,QAAA,MAAA;AAAA,UACC,UAAU,QAAA,CAAS,WAAW,CAAA,EAAG,QAAA,CAAS,YAAY,CAAC,CAAA;AAAA,UACvD;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAlFG,KAAA;AAAA,KAmFN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,mFAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,MAAA;AAAA,UACC,UAAU,gBAAA,KAAqB,MAAA;AAAA,UAC/B;AAAA,SACD;AAIA,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAExB,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AAED,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,EAAK,UAAU,EAAE,CAAA;AAC7C,QAAA,WAAA;AAAA,UACC,MAAA,CAAO,OAAA;AAAA,UACP,SAAA,CAAU,OAAA;AAAA,UACV;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAvBG,KAAA;AAAA,KAwBN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,wEAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AAExB,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,UAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,UAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,UAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,QAC7B,CAAC,CAAA;AAED,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,QAAA,GAAW,CAAA;AAAA,UACX;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,gBAAA;AAAA,UACN,KAAA,CAAM,OAAA;AAAA,UACN;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAvBG,KAAA;AAAA,KAwBN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,iEAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,gBAAgB,MAAA,CAAO,OAAA;AAC7B,QAAA,MAAM,YAAA,GAAA,CAAgB,MAAM,GAAA,CAAI,qBAAA,EAAsB,EAAG,MAAA;AACzD,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,yBAAyB,CAAA;AAEjD,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,YAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,YAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAC5B,YAAA,MAAM,KAAA;AAAA,UACP,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,SAAA,KAAc,MAAA;AAAA,UACd;AAAA,SACD;AAEA,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,aAAA;AAAA,UACA;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UAAA,CACE,MAAM,GAAA,CAAI,qBAAA,EAAsB,EAAG,MAAA;AAAA,UACpC,YAAA;AAAA,UACA;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA/BG,KAAA;AAAA,KAgCN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,8EAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjD,UAAA,MAAA;AAAA,YACC,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AAAA,YAC5B;AAAA,WACD;AAAA,QACD,CAAC,CAAA;AAAA,MACF,CAAC,CAAA,EAZG,KAAA;AAAA,KAaN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,4EAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,UAAA,MAAM,UAAA,CAAW,OAAO,MAAM,CAAA;AAC9B,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChD,UAAA,MAAA;AAAA,YACC,KAAA,KAAU,IAAA;AAAA,YACV;AAAA,WACD;AAAA,QACD,CAAC,CAAA;AAED,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChD,UAAA,MAAA;AAAA,YACC,KAAA,KAAU,IAAA;AAAA,YACV;AAAA,WACD;AAAA,QACD,CAAC,CAAA;AAAA,MACF,CAAC,CAAA,EArBG,KAAA;AAAA,KAsBN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,uGAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,YAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,YAAA,MAAM,UAAA,CAAW,OAAO,MAAM,CAAA;AAC9B,YAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,UAC7B,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,uBAAuB,CAAA;AAAA,UAC1D,CAAA,yEAAA,EAA4E,aAAA,CAAc,SAAS,CAAC,CAAA,oHAAA;AAAA,SAErG;AAAA,MACD,CAAC,CAAA,EAjBG,KAAA;AAAA,KAkBN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,6EAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,MAAA;AAAA,UACC,SAAA,CAAU,cAAc,MAAA,GAAS,CAAA;AAAA,UACjC;AAAA,SACD;AACA,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AACD,QAAA,WAAA;AAAA,UACC,UAAU,aAAA,CAAc,MAAA;AAAA,UACxB,CAAA;AAAA,UACA;AAAA,SACD;AAEA,QAAA,MAAM,UAAA,GAAa,QAAQ,eAAA,EAAgB;AAC3C,QAAA,OAAA,CAAQ,OAAO,UAAU,CAAA;AACzB,QAAA,MAAM,aAAA,GAAgB,WAAW,aAAA,CAAc,MAAA;AAC/C,QAAA,MAAM,gBAAA;AAAA,UACL,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,UAAU,CAAA;AAChC,YAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,UAC1C,CAAC;AAAA,SACF;AACA,QAAA,WAAA;AAAA,UACC,WAAW,aAAA,CAAc,MAAA;AAAA,UACzB,aAAA;AAAA,UACA;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA/BG,KAAA;AAAA,KAgCN;AAAA,IACA;AAAA,MACC,IAAA,EAAM,uDAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAM9B,QAAA,MAAM,SAAA,GAAY,QAAQ,eAAA,EAAgB;AAC1C,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAExB,QAAA,MAAM,gBAAA;AAAA,UACL,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAC/B,YAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,UAC1C,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,UAAU,gBAAA,KAAqB,MAAA;AAAA,UAC/B;AAAA,SACD;AAEA,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAChC,CAAC,CAAA;AACD,QAAA,WAAA;AAAA,UACC,SAAA,CAAU,gBAAA;AAAA,UACV,SAAA,CAAU,OAAA;AAAA,UACV;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EA7BG,KAAA;AAAA;AA8BN,GACD;AAMA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,iBAAA,GACG;AAAA,MACA,IAAA,EAAM,iFAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AAExB,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,UAAA,iBAAA,CAAkB,IAAA,CAAK,SAAS,MAAM,CAAA;AACtC,UAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,QAC7B,CAAC,CAAA;AAED,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,QAAA,GAAW,CAAA;AAAA,UACX;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAjBG,KAAA;AAAA,KAkBN,GACC,WAAA;AAAA,MACA,iFAAA;AAAA,MACA;AAAA;AACD,GACH;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,qBAAA,GACG;AAAA,MACA,IAAA,EAAM,iEAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7B,QAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AAExB,QAAA,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACvC,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,UAAA,qBAAA,CAAsB,IAAA,CAAK,SAAS,MAAM,CAAA;AAC1C,UAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,QAC7B,CAAC,CAAA;AAED,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,MAAA;AAAA,UACC,MAAM,OAAA,GAAU,QAAA;AAAA,UAChB;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAhBG,KAAA;AAAA,KAiBN,GACC,WAAA;AAAA,MACA,iEAAA;AAAA,MACA;AAAA;AACD,GACH;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,qBAAA,GACG;AAAA,MACA,IAAA,EAAM,6FAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AACrD,YAAA,MAAM,UAAA,CAAW,OAAO,MAAM,CAAA;AAC9B,YAAA,MAAM,cAAc,qBAAA,CAAsB,IAAA;AAAA,cACzC,OAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACR;AACA,YAAA,OAAA,CAAQ,OAAO,WAAW,CAAA;AAC1B,YAAA,MAAM,UAAA,CAAW,KAAK,WAAW,CAAA;AAAA,UAClC,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,uBAAuB,CAAA;AAAA,UAC1D,CAAA,2GAAA,EAA8G,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,SACvI;AAAA,MACD,CAAC,CAAA,EApBG,KAAA;AAAA,KAqBN,GACC,WAAA;AAAA,MACA,6FAAA;AAAA,MACA;AAAA;AACD,GACH;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,yBAAyB,0BAAA,GACtB;AAAA,MACA,IAAA,EAAM,yGAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAU7B,QAAA,MAAM,YAAY,qBAAA,CAAsB,IAAA;AAAA,UACvC,OAAA;AAAA,UACA,MAAA,CAAO;AAAA,SACR;AACA,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,UAChC,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,yBAAyB,CAAA;AAAA,UAC5D,CAAA,mQAAA,EAEyD,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,SAClF;AAIA,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AACzC,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,MAAA,CAAO,OAAA;AAAA,UACP;AAAA,SACD;AACA,QAAA,IAAI,aAAA,EAAe;AAClB,UAAA,MAAA;AAAA,YACC,SAAA;AAAA,cACC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,cACjC,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,MAAM;AAAA,aACnC;AAAA,YACA;AAAA,WACD;AAAA,QACD;AAAA,MACD,CAAC,CAAA,EA/CG,KAAA;AAAA,KAgDN,GACC,WAAA;AAAA,MACA,yGAAA;AAAA;AAAA;AAAA;AAAA,MAIA,wBACG,4BAAA,GACA;AAAA;AACJ,GACH;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACL,wBAAA,GACG;AAAA,MACA,IAAA,EAAM,wFAAA;AAAA,MACN,GAAA,kBAAK,MAAA,CAAA,MACJ,eAAA,CAAgB,OAAO,GAAA,KAAQ;AAC9B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAG,CAAA;AAK7B,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,EAAK,OAAO,EAAE,CAAA;AAC1C,QAAA,MAAM,aAAA,GAAgB,MAAM,GAAA,CAAI,GAAA;AAAA,UAC/B,OAAO,EAAE,UAAA,EAAW,KAAM;AACzB,YAAA,MAAM,CAAA,GAAI,MAAM,UAAA,CAAW,UAAA,EAAY,OAAO,EAAE,CAAA;AAChD,YAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,YAAA,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AACvB,YAAA,OAAO,CAAA,CAAE,OAAA;AAAA,UACV;AAAA,SACD;AAEA,QAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,UACvB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAE,YAAW,KAAM;AACjC,YAAA,MAAM,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,UAC/B,CAAC;AAAA,SACF;AACA,QAAA,MAAA;AAAA,UACC,uBAAA,CAAwB,WAAW,0BAA0B,CAAA;AAAA,UAC7D,CAAA,yEAAA,EAA4E,aAAA,CAAc,SAAS,CAAC,CAAA,0EAAA;AAAA,SACrG;AAIA,QAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,GAAA;AAAA,UAAI,CAAC,EAAE,UAAA,OAC9B,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE;AAAA,SAC7B;AACA,QAAA,MAAA;AAAA,UACC,KAAA,KAAU,IAAA;AAAA,UACV;AAAA,SACD;AACA,QAAA,WAAA;AAAA,UACC,KAAA,CAAM,OAAA;AAAA,UACN,aAAA;AAAA,UACA;AAAA,SACD;AAAA,MACD,CAAC,CAAA,EAzCG,KAAA;AAAA,KA0CN,GACC,WAAA;AAAA,MACA,wFAAA;AAAA,MACA;AAAA;AACD,GACH;AAEA,EAAA,OAAO,KAAA;AACR;AA7jBgB,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA","file":"testing.js","sourcesContent":["/**\n * Set of `Object.prototype.toString.call(x)` tags that the library treats\n * as built-in atomic types. Members of this set are compared/cloned by\n * reference (or with type-specific logic) rather than walked structurally.\n *\n * Detection is tag-based, since `Object.prototype.toString` gives the same\n * answer across realms (an iframe's `Date` has the same tag as the main\n * window's `Date`), and then brand-verified via internal-slot probes,\n * because `Symbol.toStringTag` lets any plain object claim a built-in tag.\n * The previous strategy also checked `globalThis[name] === constructor`\n * and a `proto !== Object.prototype` heuristic; both broke for cross-realm\n * objects and the latter additionally misclassified ordinary user classes\n * as built-ins.\n */\nconst BUILT_IN_TAGS: ReadonlySet<string> = new Set([\n\t\"[object Date]\",\n\t\"[object RegExp]\",\n\t\"[object Map]\",\n\t\"[object Set]\",\n\t\"[object WeakMap]\",\n\t\"[object WeakSet]\",\n\t\"[object Promise]\",\n\t\"[object Error]\",\n\t\"[object Boolean]\",\n\t\"[object Number]\",\n\t\"[object String]\",\n\t\"[object BigInt]\",\n\t\"[object ArrayBuffer]\",\n\t\"[object SharedArrayBuffer]\",\n\t\"[object DataView]\",\n]);\n\n// Intrinsic probes for brand verification. Each one reads an internal slot\n// and throws a TypeError when `this` is not a genuine instance, the only\n// check a plain object cannot spoof via `Symbol.toStringTag`. Captured once\n// so a tampered prototype cannot redirect the probe later.\nfunction intrinsicGetter(\n\tproto: object,\n\tprop: string,\n): (this: unknown) => unknown {\n\tconst get = Object.getOwnPropertyDescriptor(proto, prop)?.get;\n\t// Spec-guaranteed accessors on intrinsic prototypes: unreachable\n\t// unless the environment itself is broken.\n\tif (!get) throw new Error(`missing intrinsic getter for ${prop}`);\n\treturn get;\n}\n\nconst dateGetTime = Date.prototype.getTime;\nconst mapSizeGet = intrinsicGetter(Map.prototype, \"size\");\nconst setSizeGet = intrinsicGetter(Set.prototype, \"size\");\nconst weakMapHas = WeakMap.prototype.has;\nconst weakSetHas = WeakSet.prototype.has;\nconst dataViewByteLengthGet = intrinsicGetter(DataView.prototype, \"byteLength\");\nconst arrayBufferByteLengthGet = intrinsicGetter(\n\tArrayBuffer.prototype,\n\t\"byteLength\",\n);\nconst sharedArrayBufferByteLengthGet =\n\ttypeof SharedArrayBuffer === \"undefined\"\n\t\t? undefined\n\t\t: intrinsicGetter(SharedArrayBuffer.prototype, \"byteLength\");\nconst regExpSourceGet = intrinsicGetter(RegExp.prototype, \"source\");\nconst booleanValueOf = Boolean.prototype.valueOf;\nconst numberValueOf = Number.prototype.valueOf;\nconst stringValueOf = String.prototype.valueOf;\nconst bigIntValueOf = BigInt.prototype.valueOf;\nconst functionToString = Function.prototype.toString;\nconst PROBE_KEY = {};\n\nconst INTRINSIC_CONSTRUCTOR_NAMES = [\n\t\"Object\",\n\t\"Array\",\n\t\"Date\",\n\t\"RegExp\",\n\t\"Map\",\n\t\"Set\",\n\t\"WeakMap\",\n\t\"WeakSet\",\n\t\"Promise\",\n\t\"Error\",\n\t\"EvalError\",\n\t\"RangeError\",\n\t\"ReferenceError\",\n\t\"SyntaxError\",\n\t\"TypeError\",\n\t\"URIError\",\n\t\"AggregateError\",\n\t\"Boolean\",\n\t\"Number\",\n\t\"String\",\n\t\"BigInt\",\n\t\"ArrayBuffer\",\n\t\"SharedArrayBuffer\",\n\t\"DataView\",\n\t\"Int8Array\",\n\t\"Uint8Array\",\n\t\"Uint8ClampedArray\",\n\t\"Int16Array\",\n\t\"Uint16Array\",\n\t\"Int32Array\",\n\t\"Uint32Array\",\n\t\"Float32Array\",\n\t\"Float64Array\",\n\t\"BigInt64Array\",\n\t\"BigUint64Array\",\n] as const;\n\nconst intrinsicConstructorSources: ReadonlyMap<string, string> = new Map(\n\tINTRINSIC_CONSTRUCTOR_NAMES.flatMap((name) => {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(globalThis, name);\n\t\tconst intrinsic = descriptor?.value;\n\t\treturn typeof intrinsic === \"function\"\n\t\t\t? [[name, functionToString.call(intrinsic)] as const]\n\t\t\t: [];\n\t}),\n);\nconst intrinsicConstructorSourceSet: ReadonlySet<string> = new Set(\n\tintrinsicConstructorSources.values(),\n);\nconst ERROR_INTRINSIC_NAMES = [\n\t\"Error\",\n\t\"EvalError\",\n\t\"RangeError\",\n\t\"ReferenceError\",\n\t\"SyntaxError\",\n\t\"TypeError\",\n\t\"URIError\",\n\t\"AggregateError\",\n] as const;\n\nexport function isIntrinsicConstructorPrototype(\n\tprototype: object,\n\texpectedName?: string,\n): boolean {\n\tconst constructorDescriptor = Object.getOwnPropertyDescriptor(\n\t\tprototype,\n\t\t\"constructor\",\n\t);\n\tconst candidateConstructor = constructorDescriptor?.value;\n\tif (\n\t\tconstructorDescriptor === undefined ||\n\t\t!(\"value\" in constructorDescriptor) ||\n\t\ttypeof candidateConstructor !== \"function\"\n\t) {\n\t\treturn false;\n\t}\n\n\tlet candidateSource: string;\n\ttry {\n\t\tcandidateSource = functionToString.call(candidateConstructor);\n\t} catch {\n\t\treturn false;\n\t}\n\tconst expectedSource =\n\t\texpectedName === undefined\n\t\t\t? undefined\n\t\t\t: intrinsicConstructorSources.get(expectedName);\n\tif (\n\t\t(expectedSource !== undefined && candidateSource !== expectedSource) ||\n\t\t(expectedSource === undefined &&\n\t\t\t!intrinsicConstructorSourceSet.has(candidateSource))\n\t) {\n\t\treturn false;\n\t}\n\n\tconst nameDescriptor = Object.getOwnPropertyDescriptor(\n\t\tcandidateConstructor,\n\t\t\"name\",\n\t);\n\tconst candidateName =\n\t\tnameDescriptor !== undefined &&\n\t\t\"value\" in nameDescriptor &&\n\t\ttypeof nameDescriptor.value === \"string\"\n\t\t\t? nameDescriptor.value\n\t\t\t: undefined;\n\tconst intrinsicName = expectedName ?? candidateName;\n\tconst intrinsicSource =\n\t\tintrinsicName === undefined\n\t\t\t? undefined\n\t\t\t: intrinsicConstructorSources.get(intrinsicName);\n\treturn (\n\t\tcandidateName === intrinsicName &&\n\t\tintrinsicSource !== undefined &&\n\t\tcandidateSource === intrinsicSource &&\n\t\tObject.getOwnPropertyDescriptor(candidateConstructor, \"prototype\")\n\t\t\t?.value === prototype\n\t);\n}\n\n/**\n * Accepts an intrinsic prototype, optionally behind transparent\n * `Symbol.toStringTag` override layers. A user-defined subclass has its own\n * non-native constructor and is therefore rejected before reaching the\n * intrinsic prototype.\n */\nexport function hasIntrinsicPrototypeChain(\n\tvalue: object,\n\texpectedName?: string,\n): boolean {\n\tconst visited = new WeakSet<object>();\n\tlet prototype = Object.getPrototypeOf(value);\n\n\twhile (prototype !== null && !visited.has(prototype)) {\n\t\tvisited.add(prototype);\n\t\tif (Object.hasOwn(prototype, \"constructor\")) {\n\t\t\treturn isIntrinsicConstructorPrototype(prototype, expectedName);\n\t\t}\n\t\tconst ownKeys = Reflect.ownKeys(prototype);\n\t\tif (ownKeys.length !== 1 || ownKeys[0] !== Symbol.toStringTag) {\n\t\t\treturn false;\n\t\t}\n\t\tprototype = Object.getPrototypeOf(prototype);\n\t}\n\n\treturn false;\n}\n\n/**\n * Tags that `deepEqual` compares BY REFERENCE (its unhandled-built-in\n * fallback) and that `deepOmit` must therefore ALIAS rather than clone:\n * a clone would break `deepEqualExcept(x, x)` reflexivity. Single source\n * of truth so the two modules cannot drift: if `deepEqual` ever learns a\n * by-value comparison for one of these, remove it here and add a clone\n * case in `deepOmit`'s `cloneBuiltIn` in the same change.\n */\nexport const REFERENCE_COMPARED_TAGS: ReadonlySet<string> = new Set([\n\t\"[object Error]\",\n\t\"[object ArrayBuffer]\",\n\t\"[object SharedArrayBuffer]\",\n\t\"[object Promise]\",\n\t\"[object WeakMap]\",\n\t\"[object WeakSet]\",\n]);\n\nexport function findPropertyDescriptor(\n\tvalue: object,\n\tkey: PropertyKey,\n): PropertyDescriptor | undefined {\n\tconst visited = new WeakSet<object>();\n\tlet current: object | null = value;\n\n\twhile (current !== null && !visited.has(current)) {\n\t\tvisited.add(current);\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(current, key);\n\t\tif (descriptor !== undefined) return descriptor;\n\t\tcurrent = Object.getPrototypeOf(current);\n\t}\n\n\treturn undefined;\n}\n\nexport function objectTagWithoutInvokingAccessors(value: object): string {\n\tconst descriptor = findPropertyDescriptor(value, Symbol.toStringTag);\n\treturn descriptor !== undefined && !(\"value\" in descriptor)\n\t\t? \"[object Object]\"\n\t\t: Object.prototype.toString.call(value);\n}\n\nexport type MutableBuiltInTag =\n\t| \"[object Date]\"\n\t| \"[object Map]\"\n\t| \"[object Set]\";\n\nexport function builtInTagWithoutInvokingAccessors(\n\tvalue: object,\n): string | undefined {\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn hasBrand(value, \"[object DataView]\")\n\t\t\t? \"[object DataView]\"\n\t\t\t: \"[object TypedArray]\";\n\t}\n\n\tconst descriptor = findPropertyDescriptor(value, Symbol.toStringTag);\n\tif (descriptor !== undefined && !(\"value\" in descriptor)) {\n\t\treturn builtInTagFromBrand(value);\n\t}\n\n\tconst tag = Object.prototype.toString.call(value);\n\tif (BUILT_IN_TAGS.has(tag) && hasBrand(value, tag)) {\n\t\treturn tag;\n\t}\n\treturn descriptor === undefined ? undefined : builtInTagFromBrand(value);\n}\n\nexport function mutableBuiltInTagWithoutInvokingAccessors(\n\tvalue: object,\n): MutableBuiltInTag | undefined {\n\tconst tag = builtInTagWithoutInvokingAccessors(value);\n\treturn tag === \"[object Date]\" ||\n\t\ttag === \"[object Map]\" ||\n\t\ttag === \"[object Set]\"\n\t\t? tag\n\t\t: undefined;\n}\n\nfunction builtInTagFromBrand(value: object): string | undefined {\n\tif (hasBrand(value, \"[object Date]\")) return \"[object Date]\";\n\tif (hasBrand(value, \"[object RegExp]\")) return \"[object RegExp]\";\n\tif (hasBrand(value, \"[object Map]\")) return \"[object Map]\";\n\tif (hasBrand(value, \"[object Set]\")) return \"[object Set]\";\n\tif (hasBrand(value, \"[object WeakMap]\")) return \"[object WeakMap]\";\n\tif (hasBrand(value, \"[object WeakSet]\")) return \"[object WeakSet]\";\n\tif (hasBrand(value, \"[object DataView]\")) return \"[object DataView]\";\n\tif (hasBrand(value, \"[object ArrayBuffer]\")) return \"[object ArrayBuffer]\";\n\tif (hasBrand(value, \"[object SharedArrayBuffer]\")) {\n\t\treturn \"[object SharedArrayBuffer]\";\n\t}\n\tif (hasBrand(value, \"[object Boolean]\")) return \"[object Boolean]\";\n\tif (hasBrand(value, \"[object Number]\")) return \"[object Number]\";\n\tif (hasBrand(value, \"[object String]\")) return \"[object String]\";\n\tif (hasBrand(value, \"[object BigInt]\")) return \"[object BigInt]\";\n\tif (hasNativePrototype(value, \"Promise\")) return \"[object Promise]\";\n\tif (hasNativePrototype(value, \"Error\")) return \"[object Error]\";\n\treturn undefined;\n}\n\nfunction hasNativePrototype(value: object, expectedName: string): boolean {\n\tconst visited = new WeakSet<object>();\n\tlet prototype = Object.getPrototypeOf(value);\n\n\twhile (prototype !== null && !visited.has(prototype)) {\n\t\tvisited.add(prototype);\n\t\tif (isIntrinsicConstructorPrototype(prototype, expectedName)) {\n\t\t\treturn true;\n\t\t}\n\t\tprototype = Object.getPrototypeOf(prototype);\n\t}\n\treturn false;\n}\n\n/**\n * Verifies that `obj` genuinely is the type its tag claims, via an\n * internal-slot probe. Promise and Error have no side-effect-free standard\n * probe, so their visible tags remain conservative; masked instances are\n * identified separately through their native prototype chain.\n */\nfunction hasBrand(obj: object, tag: string): boolean {\n\ttry {\n\t\tswitch (tag) {\n\t\t\tcase \"[object Date]\":\n\t\t\t\tdateGetTime.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object RegExp]\":\n\t\t\t\tregExpSourceGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Map]\":\n\t\t\t\tmapSizeGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Set]\":\n\t\t\t\tsetSizeGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object WeakMap]\":\n\t\t\t\tweakMapHas.call(obj, PROBE_KEY);\n\t\t\t\treturn true;\n\t\t\tcase \"[object WeakSet]\":\n\t\t\t\tweakSetHas.call(obj, PROBE_KEY);\n\t\t\t\treturn true;\n\t\t\tcase \"[object DataView]\":\n\t\t\t\tdataViewByteLengthGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object ArrayBuffer]\":\n\t\t\t\tarrayBufferByteLengthGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object SharedArrayBuffer]\":\n\t\t\t\tif (!sharedArrayBufferByteLengthGet) return false;\n\t\t\t\tsharedArrayBufferByteLengthGet.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Boolean]\":\n\t\t\t\tbooleanValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Number]\":\n\t\t\t\tnumberValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object String]\":\n\t\t\t\tstringValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object BigInt]\":\n\t\t\t\tbigIntValueOf.call(obj);\n\t\t\t\treturn true;\n\t\t\tcase \"[object Promise]\":\n\t\t\t\treturn hasNativePrototype(obj, \"Promise\");\n\t\t\tcase \"[object Error]\":\n\t\t\t\treturn ERROR_INTRINSIC_NAMES.some((name) =>\n\t\t\t\t\thasNativePrototype(obj, name),\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Returns `true` when `obj` is a built-in JavaScript type that should be\n * treated atomically (compared/cloned as a unit, not walked structurally).\n * Cross-realm safe, and brand-verified: a plain object spoofing a built-in\n * tag via `Symbol.toStringTag` returns `false` and is walked structurally\n * like any other plain object instead of crashing type-specific code.\n *\n * @param obj - The object to classify\n * @param tag - The result of `Object.prototype.toString.call(obj)`, passed\n * in so callers that already computed it don't pay twice\n */\nexport function isBuiltInObject(obj: object, tag: string): boolean {\n\t// ArrayBuffer views (DataView + all TypedArrays, present and future)\n\t// carry an unforgeable internal slot, the strongest brand check.\n\tif (ArrayBuffer.isView(obj)) return true;\n\t// A built-in-looking TypedArray tag WITHOUT the view brand is spoofed.\n\tif (tag.endsWith(\"Array]\")) return false;\n\treturn BUILT_IN_TAGS.has(tag) && hasBrand(obj, tag);\n}\n","import { isBuiltInObject } from \"./is-built-in\";\n\nconst objProto = Object.prototype;\nconst objToString = objProto.toString;\nconst objHasOwn = objProto.hasOwnProperty;\n\n/**\n * SameValueZero: `===` plus NaN-equals-NaN (and `+0 === -0`, unlike\n * `Object.is`). The numeric semantics `deepEqual` documents for primitives,\n * applied consistently inside TypedArrays, Dates and Number wrappers.\n */\nfunction sameValueZero(a: unknown, b: unknown): boolean {\n\treturn (\n\t\ta === b || (Number.isNaN(a as number) && Number.isNaN(b as number))\n\t);\n}\n\n/**\n * Performs a deep equality check between two values.\n *\n * This function compares values recursively, handling:\n * - Primitives (with special handling for NaN)\n * - Arrays (nested arrays supported)\n * - Objects (plain objects and class instances)\n * - TypedArrays (Uint8Array, Int32Array, etc.)\n * - DataView\n * - Maps and Sets\n * - Dates and RegExp\n * - Wrapper objects (Boolean, Number, String)\n * - Circular references (detected and handled)\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @example\n * ```ts\n * deepEqual([1, 2, 3], [1, 2, 3]); // true\n * deepEqual({ a: 1, b: [2, 3] }, { a: 1, b: [2, 3] }); // true\n * deepEqual(NaN, NaN); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn deepEqualInner(a, b, new WeakMap<object, WeakSet<object>>());\n}\n\n/**\n * Visited pair tracker for cycle detection. The cache is a pair-set:\n * for every left-hand object we keep the set of right-hand objects we\n * have already paired it with. Encountering an already-known pair returns\n * the cycle hypothesis (assume equal); a new (a, b') pair with b' ≠ any\n * previously cached b for that a is walked normally. The previous shape\n * (`WeakMap<object, object>`) could only remember one B per A, which\n * could short-circuit unrelated comparisons that happened to revisit the\n * same A with a different B.\n */\ntype VisitedPairs = WeakMap<object, WeakSet<object>>;\n\n/**\n * Internal recursive function for deep equality comparison.\n *\n * @internal\n */\nfunction deepEqualInner(\n\ta: unknown,\n\tb: unknown,\n\tvisited: VisitedPairs,\n): boolean {\n\t// 1. Fast path: reference equality\n\tif (a === b) return true;\n\n\tconst typeA = typeof a;\n\tconst typeB = typeof b;\n\n\t// 2. If one is not an object → primitive / function\n\tif (typeA !== \"object\" || a === null || typeB !== \"object\" || b === null) {\n\t\t// Special case: NaN should be equal\n\t\tif (typeA === \"number\" && typeB === \"number\") {\n\t\t\treturn Number.isNaN(a as number) && Number.isNaN(b as number);\n\t\t}\n\t\t// Everything else is directly unequal with !== (including functions)\n\t\treturn false;\n\t}\n\n\t// From here on: both are non-null objects\n\n\tconst objA = a as object;\n\tconst objB = b as object;\n\n\t// 3. Cycles: already seen this exact (a, b) pair?\n\tlet cachedBs = visited.get(objA);\n\tif (cachedBs?.has(objB)) {\n\t\t// Cycle hypothesis: pretend equal so the walk can terminate. If the\n\t\t// structure is actually unequal elsewhere, a different recursive\n\t\t// branch will surface the mismatch.\n\t\treturn true;\n\t}\n\tif (!cachedBs) {\n\t\tcachedBs = new WeakSet();\n\t\tvisited.set(objA, cachedBs);\n\t}\n\tcachedBs.add(objB);\n\n\t// 4. Handle Typed Arrays / DataView first\n\tif (ArrayBuffer.isView(objA) || ArrayBuffer.isView(objB)) {\n\t\tif (!ArrayBuffer.isView(objA) || !ArrayBuffer.isView(objB)) return false;\n\n\t\tconst tagA = objToString.call(objA);\n\t\tconst tagB = objToString.call(objB);\n\t\tif (tagA !== tagB) return false;\n\n\t\t// DataView: compare byte by byte\n\t\tif (tagA === \"[object DataView]\") {\n\t\t\tconst viewA = objA as DataView;\n\t\t\tconst viewB = objB as DataView;\n\t\t\tif (viewA.byteLength !== viewB.byteLength) return false;\n\n\t\t\tconst len = viewA.byteLength;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (viewA.getUint8(i) !== viewB.getUint8(i)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// Typed Arrays: element by element (length + numeric index access are\n\t\t// part of the TypedArray contract; the indexed read is sound).\n\t\tconst arrA = objA as unknown as Record<number, unknown> & { length: number };\n\t\tconst arrB = objB as unknown as Record<number, unknown> & { length: number };\n\n\t\tconst len = arrA.length;\n\t\tif (len !== arrB.length) return false;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tif (!sameValueZero(arrA[i], arrB[i])) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 5. Arrays: `Array.isArray` is brand-based and immune to\n\t// `Symbol.toStringTag` spoofing (a spoofed tag would otherwise route a\n\t// real array away from element comparison, or a plain object into it).\n\tif (Array.isArray(objA) || Array.isArray(objB)) {\n\t\tif (!Array.isArray(objA) || !Array.isArray(objB)) return false;\n\t\tif (objA.length !== objB.length) return false;\n\n\t\tconst keysA = Reflect.ownKeys(objA).filter((key) => key !== \"length\");\n\t\tconst keysB = Reflect.ownKeys(objB).filter((key) => key !== \"length\");\n\t\tif (keysA.length !== keysB.length) return false;\n\n\t\tconst arrA = objA as unknown as Record<PropertyKey, unknown>;\n\t\tconst arrB = objB as unknown as Record<PropertyKey, unknown>;\n\t\tfor (const key of keysA) {\n\t\t\tif (!objHasOwn.call(objB, key)) return false;\n\t\t\t// Read the element by access (invoking any getter) rather than\n\t\t\t// comparing accessor descriptors by function identity, so an array\n\t\t\t// index defined as a getter is compared by the value it yields,\n\t\t\t// matching how comparePlainObjects treats accessor properties.\n\t\t\t// Sparse holes stay observable through the key-set comparison above:\n\t\t\t// a hole leaves no own key, so two arrays that differ by a hole vs\n\t\t\t// an explicit undefined have different key sets.\n\t\t\tif (!deepEqualInner(arrA[key], arrB[key], visited)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 6. Tag-based type detection (robust across realms), brand-verified:\n\t// a plain object spoofing a built-in tag is compared as a plain object\n\t// instead of crashing type-specific code below.\n\tconst tagA = objToString.call(objA);\n\tconst tagB = objToString.call(objB);\n\tif (tagA !== tagB) return false;\n\n\tconst builtInA = isBuiltInObject(objA, tagA);\n\tconst builtInB = isBuiltInObject(objB, tagB);\n\t// A genuine built-in never equals a spoofed lookalike.\n\tif (builtInA !== builtInB) return false;\n\n\tif (!builtInA) {\n\t\treturn comparePlainObjects(objA, objB, visited);\n\t}\n\n\tswitch (tagA) {\n\t\tcase \"[object Map]\": {\n\t\t\tconst mapA = objA as Map<unknown, unknown>;\n\t\t\tconst mapB = objB as Map<unknown, unknown>;\n\n\t\t\tif (mapA.size !== mapB.size) return false;\n\n\t\t\tfor (const [key, valA] of mapA) {\n\t\t\t\t// Map keys according to JS semantics: reference / SameValueZero\n\t\t\t\tif (!mapB.has(key)) return false;\n\t\t\t\tconst valB = mapB.get(key);\n\t\t\t\tif (!deepEqualInner(valA, valB, visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Set]\": {\n\t\t\tconst setA = objA as Set<unknown>;\n\t\t\tconst setB = objB as Set<unknown>;\n\n\t\t\tif (setA.size !== setB.size) return false;\n\n\t\t\t// Set elements: same reference (JS semantics)\n\t\t\tfor (const value of setA) {\n\t\t\t\tif (!setB.has(value)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Date]\": {\n\t\t\t// SameValueZero so two invalid Dates (getTime() === NaN) compare\n\t\t\t// equal, matching the primitive NaN semantics.\n\t\t\treturn sameValueZero((objA as Date).getTime(), (objB as Date).getTime());\n\t\t}\n\n\t\tcase \"[object RegExp]\": {\n\t\t\tconst regA = objA as RegExp;\n\t\t\tconst regB = objB as RegExp;\n\t\t\treturn regA.source === regB.source && regA.flags === regB.flags;\n\t\t}\n\n\t\tcase \"[object Boolean]\":\n\t\tcase \"[object Number]\":\n\t\tcase \"[object String]\":\n\t\tcase \"[object BigInt]\": {\n\t\t\t// Wrapper objects (Boolean/Number/String/BigInt); SameValueZero so\n\t\t\t// two NaN Number wrappers compare equal.\n\t\t\treturn sameValueZero(\n\t\t\t\t(objA as { valueOf(): unknown }).valueOf(),\n\t\t\t\t(objB as { valueOf(): unknown }).valueOf(),\n\t\t\t);\n\t\t}\n\n\t\tdefault: {\n\t\t\t// Unhandled but brand-trusted built-ins: compared by reference.\n\t\t\t// Their internal structure is unknown, and this keeps new\n\t\t\t// built-ins from falling through to plain-object comparison.\n\t\t\t// This branch IS the REFERENCE_COMPARED_TAGS contract exported\n\t\t\t// from is-built-in.ts (and consumed by deepOmit's cloneBuiltIn):\n\t\t\t// adding a by-value case above means removing the tag there.\n\t\t\treturn objA === objB;\n\t\t}\n\t}\n}\n\n/**\n * Plain / custom objects: compare own enumerable string keys + own symbol\n * keys and their values. Used both as the final fallback and for objects\n * whose built-in-looking tag failed brand verification.\n */\nfunction comparePlainObjects(\n\tobjA: object,\n\tobjB: object,\n\tvisited: VisitedPairs,\n): boolean {\n\tconst recA = objA as Record<string | symbol, unknown>;\n\tconst recB = objB as Record<string | symbol, unknown>;\n\n\t// Own string keys including non-enumerable ones: symbols are already\n\t// counted through Object.getOwnPropertySymbols (which ignores\n\t// enumerability), so using Object.keys here would let two objects that\n\t// differ only by a non-enumerable string property compare equal.\n\tconst stringKeysA = Object.getOwnPropertyNames(objA);\n\tconst stringKeysB = Object.getOwnPropertyNames(objB);\n\tif (stringKeysA.length !== stringKeysB.length) return false;\n\n\tconst symbolKeysA = Object.getOwnPropertySymbols(objA);\n\tconst symbolKeysB = Object.getOwnPropertySymbols(objB);\n\tif (symbolKeysA.length !== symbolKeysB.length) return false;\n\n\t// Build the B-side symbol set once; the previous impl rebuilt the\n\t// array and ran .includes per key, which was quadratic.\n\tconst symbolKeysBSet = new Set<symbol>(symbolKeysB);\n\n\tfor (const key of stringKeysA) {\n\t\tif (!objHasOwn.call(objB, key)) return false;\n\t}\n\tfor (const key of symbolKeysA) {\n\t\tif (!symbolKeysBSet.has(key)) return false;\n\t}\n\n\tfor (const key of stringKeysA) {\n\t\tif (!deepEqualInner(recA[key], recB[key], visited)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor (const key of symbolKeysA) {\n\t\tif (!deepEqualInner(recA[key], recB[key], visited)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n","/**\n * Assertion, error-matching, and suite-runner helpers shared by the\n * repository contract suites (state-stored and event-sourced). Internal\n * to the testing entry: not re-exported from `@shirudo/ddd-kit/testing`.\n */\n\n/**\n * Runs one contract-test body against a fresh environment and tears it\n * down in a finally-like discipline with one subtle, load-bearing rule:\n * a teardown failure (dropping a schema on an aborted pool) must never\n * REPLACE the contract-violation diagnostic that is the suite's entire\n * value. It only surfaces when the body itself succeeded.\n */\nexport async function runInContractEnvironment<\n\tEnv extends { teardown?(): Promise<void> },\n>(\n\tcreateEnvironment: () => Promise<Env>,\n\tbody: (env: Env) => Promise<void>,\n): Promise<void> {\n\tconst env = await createEnvironment();\n\tlet bodyFailed = false;\n\tlet bodyError: unknown;\n\ttry {\n\t\tawait body(env);\n\t} catch (error) {\n\t\tbodyFailed = true;\n\t\tbodyError = error;\n\t}\n\ttry {\n\t\tawait env.teardown?.();\n\t} catch (teardownError) {\n\t\tif (!bodyFailed) {\n\t\t\tthrow teardownError;\n\t\t}\n\t}\n\tif (bodyFailed) {\n\t\tthrow bodyError;\n\t}\n}\n\n/** Resolves to the rejection reason, or `undefined` when the promise resolved. */\nexport function captureRejection(promise: Promise<unknown>): Promise<unknown> {\n\treturn promise.then(\n\t\t() => undefined,\n\t\t(error: unknown) => error,\n\t);\n}\n\n/**\n * Load with a contract diagnostic instead of a bare TypeError downstream.\n * `suspectHint` names the suite-specific likely cause (broken hydration\n * vs broken replay read).\n */\nexport async function loadAggregateOrFail<TAgg, TId>(\n\trepository: { getById(id: TId): Promise<TAgg | null> },\n\tid: TId,\n\tsuspectHint: string,\n): Promise<TAgg> {\n\tconst loaded = await repository.getById(id);\n\tassert(\n\t\tloaded !== null,\n\t\t`getById(${String(id)}) returned null for an aggregate that must exist: ${suspectHint}`,\n\t);\n\treturn loaded;\n}\n\n/**\n * A capability-gated test entry whose `run()` rejects loudly, so a naive\n * binding that ignores `skipped` fails instead of green-no-op'ing.\n * Structurally assignable to both suites' test-entry types.\n */\nexport function skippedContractTest(\n\tname: string,\n\tcapability: string,\n): {\n\tname: string;\n\trun: () => Promise<void>;\n\tskipped: { capability: string };\n} {\n\treturn {\n\t\tname,\n\t\tskipped: { capability },\n\t\trun: async () => {\n\t\t\tthrow new Error(\n\t\t\t\t`Repository contract test skipped: harness capability '${capability}' is not provided. ` +\n\t\t\t\t\t`Bind skipped tests with it.skip ((test.skipped ? it.skip : it)(test.name, test.run)) ` +\n\t\t\t\t\t`or provide the capability; each one closes a real OCC hole.`,\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function assert(condition: boolean, message: string): asserts condition {\n\tif (!condition) {\n\t\tthrow new Error(`Repository contract violated: ${message}`);\n\t}\n}\n\nexport function assertEqual(\n\tactual: unknown,\n\texpected: unknown,\n\tmessage: string,\n): void {\n\tif (actual !== expected) {\n\t\tthrow new Error(\n\t\t\t`Repository contract violated: ${message} (expected ${String(expected)}, got ${String(actual)})`,\n\t\t);\n\t}\n}\n\n/**\n * Walks the standard `cause` chain (cycle-safe, hostile-getter-safe)\n * looking for an Error that matches the given name. Matching is\n * deliberately by NAME, not `instanceof`: the suite ships in its own\n * bundle entry, and the adapter's errors come from the main entry's\n * copy of the kit (or even a second installed kit version) -\n * cross-copy `instanceof` is always false, name identity is the stable\n * contract. The kit's error classes pin their runtime `name` via\n * BaseError's `options.name`, so the match survives consumer-side\n * minification AND subclassing (a `PgConflictError extends\n * ConcurrencyConflictError` inherits the pinned name). For errors from\n * OLDER kit versions (no pinned name), the prototype chain's\n * constructor names are checked as a fallback, so subclasses still\n * match.\n */\nexport function chainContainsErrorNamed(error: unknown, name: string): boolean {\n\tconst seen = new Set<unknown>();\n\tlet current: unknown = error;\n\twhile (current !== null && current !== undefined && !seen.has(current)) {\n\t\tif (typeof current !== \"object\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (errorMatchesName(current, name)) {\n\t\t\treturn true;\n\t\t}\n\t\tseen.add(current);\n\t\ttry {\n\t\t\tcurrent = (current as { cause?: unknown }).cause;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Like {@link chainContainsErrorNamed}, but accepts any of several names. */\nexport function chainContainsErrorNamedAnyOf(\n\terror: unknown,\n\tnames: readonly string[],\n): boolean {\n\treturn names.some((name) => chainContainsErrorNamed(error, name));\n}\n\nfunction errorMatchesName(candidate: object, name: string): boolean {\n\ttry {\n\t\tif ((candidate as { name?: unknown }).name === name) {\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// Hostile `name` getter: treat as non-matching, keep walking.\n\t}\n\t// Fallback for errors from kit versions without a pinned runtime\n\t// name: a subclass instance's own `name` is the subclass name, but\n\t// its prototype chain still carries the base class's constructor.\n\ttry {\n\t\tlet proto: object | null = Object.getPrototypeOf(candidate);\n\t\tfor (let depth = 0; proto !== null && depth < 20; depth++) {\n\t\t\tif (\n\t\t\t\t(proto.constructor as { name?: unknown } | undefined)?.name === name\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tproto = Object.getPrototypeOf(proto);\n\t\t}\n\t} catch {\n\t\t// Hostile `constructor` getter on a prototype: non-matching.\n\t}\n\treturn false;\n}\n\nexport function describeError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn `${error.name}: ${error.message}`;\n\t}\n\treturn String(error);\n}\n","import type { IAggregateRoot } from \"../aggregate/aggregate\";\nimport type { AnyDomainEvent } from \"../aggregate/domain-event\";\nimport type { Id } from \"../core/id\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tcaptureRejection,\n\tchainContainsErrorNamed,\n\tchainContainsErrorNamedAnyOf,\n\tdescribeError,\n\tloadAggregateOrFail,\n\trunInContractEnvironment,\n\tskippedContractTest,\n} from \"./contract-assertions\";\n\n/**\n * The repository surface the event-sourced contract suite exercises.\n * Deliberately smaller than the state-stored `ContractRepository`: pure\n * event-sourced aggregates rarely have a meaningful `delete` (the\n * lifecycle ends with a `Closed` / `Terminated` event in the stream),\n * so the suite does not require one.\n */\nexport interface EsContractRepository<\n\tTAgg extends IAggregateRoot<Id<string>, AnyDomainEvent>,\n> {\n\tgetById(id: TAgg[\"id\"]): Promise<TAgg | null>;\n\tsave(aggregate: TAgg): Promise<void>;\n}\n\n/**\n * One isolated test environment: fresh event store, fresh outbox. The\n * suite creates one per test and tears it down afterwards.\n */\nexport interface EsRepositoryContractEnvironment<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\t/**\n\t * Execute one unit of work against the adapter under test. Wire this\n\t * through your real `UnitOfWork` / `withCommit` setup: the commit\n\t * boundary IS part of what the suite proves (outbox harvest,\n\t * `markPersisted`, rollback purity).\n\t */\n\trun<R>(\n\t\twork: (ctx: { repository: EsContractRepository<TAgg> }) => Promise<R>,\n\t): Promise<R>;\n\n\t/**\n\t * All events currently persisted in the outbox (committed writes\n\t * only; a rolled-back transaction's events must not appear here).\n\t */\n\tcommittedOutboxEvents(): Promise<ReadonlyArray<Evt>>;\n\n\t/**\n\t * The COMMITTED stream for the given aggregate id, in stream order,\n\t * optionally only the events after `fromVersion` (the snapshot\n\t * catch-up read). Implement this through your adapter's\n\t * `EventStore.readStream` so the suite's ordering and slicing\n\t * assertions exercise your real read path. A rolled-back\n\t * transaction's events must not appear here.\n\t */\n\tcommittedStreamEvents(\n\t\tid: TAgg[\"id\"],\n\t\tfromVersion?: number,\n\t): Promise<ReadonlyArray<Evt>>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the event-sourced contract suite.\n *\n * The harness MUST provide isolation per environment. **For SQL-backed\n * event stores this must run against a real database** (testcontainers\n * or equivalent): the mandatory two-writer test proves YOUR\n * expectedVersion guard, and an in-memory stand-in proves only itself.\n *\n * Aggregate arithmetic the suite relies on:\n * - `createAggregate()` returns a fresh aggregate with exactly ONE\n * applied creation event (version 1, `persistedVersion === undefined`).\n * - `mutate()` applies exactly ONE event (+1 version).\n */\nexport interface EsRepositoryContractHarness<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\tcreateEnvironment(): Promise<EsRepositoryContractEnvironment<TAgg, Evt>>;\n\n\t/**\n\t * A brand-new aggregate: exactly one applied creation event, unique\n\t * id, version 1, `persistedVersion === undefined`.\n\t */\n\tcreateAggregate(): TAgg;\n\n\t/** Apply exactly ONE domain event via `apply()` (+1 version). */\n\tmutate(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: construct a NEW (never-persisted) aggregate carrying a\n\t * SPECIFIC id, with its creation event applied. Enables the\n\t * duplicate-create conflict test (two creators racing on one stream).\n\t */\n\tcreateAggregateWithId?(id: TAgg[\"id\"]): TAgg;\n\n\t/**\n\t * Optional: a plain-data projection of the aggregate's state,\n\t * compared with deep equality. Enables the state assertions in the\n\t * mandatory and replay-equality tests. Must be roundtrip-stable\n\t * across your store (see the state-stored harness JSDoc for the\n\t * normalization checklist).\n\t */\n\tsnapshotState?(aggregate: TAgg): unknown;\n}\n\n/** One named contract test; see the state-stored suite for the binding pattern. */\nexport interface EsRepositoryContractTest {\n\tname: string;\n\trun: () => Promise<void>;\n\t/** Present when the harness lacks the capability this test needs. */\n\tskipped?: { capability: string };\n}\n\n/**\n * The event-sourced repository contract test suite: the proof that an\n * adapter delivers what the kit's `EventStore` port and Unit of Work\n * document. The kit is store-agnostic: the expectedVersion guard lives\n * in YOUR adapter's append. That makes stream OCC a **repository\n * contract, not a kit guarantee**; an adapter that has not passed this\n * suite (against a real store, for SQL-backed adapters) has not\n * demonstrated it.\n *\n * What each test proves:\n * - The MANDATORY two-writer test proves your append's expectedVersion\n * guard and its atomicity.\n * - The replay/lifecycle tests prove your read path (fold order,\n * identity map wiring) and the commit lifecycle (outbox harvest,\n * `markPersisted`, rollback purity).\n * - The duplicate-create and fromVersion tests prove the create race\n * and the snapshot catch-up read.\n *\n * Error matching is by NAME along the `cause` chain, not `instanceof`\n * (same rationale as the state-stored suite). Binding:\n *\n * ```ts\n * for (const test of createEsRepositoryContractTests(harness)) {\n * (test.skipped ? it.skip : it)(test.name, test.run);\n * }\n * ```\n *\n * **Known limitation:** like the state-stored suite, the two-writer\n * test is sequential-deterministic; lock interaction and raw\n * serialization failures (Postgres 40001) need adapter-specific tests\n * on top.\n */\nexport function createEsRepositoryContractTests<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n>(\n\tharness: EsRepositoryContractHarness<TAgg, Evt>,\n): EsRepositoryContractTest[] {\n\ttype Env = EsRepositoryContractEnvironment<TAgg, Evt>;\n\n\t// Runner plumbing shared with the state-stored suite; see\n\t// ./contract-assertions for the teardown-never-masks rule.\n\tconst withEnvironment = (body: (env: Env) => Promise<void>): Promise<void> =>\n\t\trunInContractEnvironment(() => harness.createEnvironment(), body);\n\n\tconst loadOrFail = (\n\t\trepository: EsContractRepository<TAgg>,\n\t\tid: TAgg[\"id\"],\n\t): Promise<TAgg> =>\n\t\tloadAggregateOrFail(\n\t\t\trepository,\n\t\t\tid,\n\t\t\t\"broken replay read or a write that did not commit\",\n\t\t);\n\n\t/** Seed one aggregate (creation event only, committed). */\n\tasync function seed(env: Env): Promise<TAgg> {\n\t\tconst aggregate = harness.createAggregate();\n\t\tawait env.run(async ({ repository }) => {\n\t\t\tawait repository.save(aggregate);\n\t\t});\n\t\treturn aggregate;\n\t}\n\n\tasync function reload(env: Env, id: TAgg[\"id\"]): Promise<TAgg> {\n\t\treturn env.run(({ repository }) => loadOrFail(repository, id));\n\t}\n\n\t// Ordered ids: streams are ordered, so stream assertions compare the\n\t// exact sequence (unlike the outbox, whose read-back order is not\n\t// part of the environment contract).\n\tconst orderedIds = (events: ReadonlyArray<Evt>): string[] =>\n\t\tevents.map((event) => event.eventId);\n\tconst sortedIds = (events: ReadonlyArray<Evt>): string[] =>\n\t\torderedIds(events).sort();\n\n\t// Capabilities are captured ONCE at suite creation.\n\tconst snapshotState = harness.snapshotState;\n\tconst createAggregateWithId = harness.createAggregateWithId;\n\n\tconst skippedTest = (\n\t\tname: string,\n\t\tcapability: string,\n\t): EsRepositoryContractTest => skippedContractTest(name, capability);\n\n\tconst tests: EsRepositoryContractTest[] = [\n\t\t{\n\t\t\tname: \"MANDATORY two-writer conflict: the stale writer's append throws ConcurrencyConflictError and the stream is untouched\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst seedStream = await env.committedStreamEvents(seeded.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tseedStream.length > 0,\n\t\t\t\t\t\t\"seeding must have appended the creation event to the stream\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Writer B loads first: its persistedVersion baseline is\n\t\t\t\t\t// now fixed at the pre-conflict stream version.\n\t\t\t\t\tconst staleB = await reload(env, seeded.id);\n\n\t\t\t\t\t// Writer A loads the same version, mutates, commits.\n\t\t\t\t\tconst committedA = await env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst a = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(a);\n\t\t\t\t\t\tawait repository.save(a);\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t});\n\t\t\t\t\tconst streamAfterA = await env.committedStreamEvents(seeded.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tstreamAfterA.length === seedStream.length + 1,\n\t\t\t\t\t\t\"writer A's event must reach the stream on commit\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Writer B appends a TWO-event batch from its stale baseline:\n\t\t\t\t\t// the exact-ids assertion below then also proves the rejected\n\t\t\t\t\t// append was atomic (no prefix of the batch landed), port\n\t\t\t\t\t// contract point 2.\n\t\t\t\t\tharness.mutate(staleB);\n\t\t\t\t\tharness.mutate(staleB);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(staleB);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t\"the second writer's commit must reject; it appended on a stale expectedVersion instead (append guard missing?)\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"ConcurrencyConflictError\"),\n\t\t\t\t\t\t`the second writer's rejection must be (or wrap, via the cause chain) ConcurrencyConflictError; got: ${describeError(rejection)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// The stream contains exactly writer A's history, in order:\n\t\t\t\t\t// nothing from the stale writer, nothing reordered.\n\t\t\t\t\tconst finalStream = await env.committedStreamEvents(seeded.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(orderedIds(finalStream), orderedIds(streamAfterA)),\n\t\t\t\t\t\t\"the stream must contain exactly the winning writer's events in order: a rejected append must leave the stream untouched\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// The reloaded fold equals writer A's aggregate.\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tcommittedA.version,\n\t\t\t\t\t\t\"the reloaded version must equal writer A's committed version (version IS the event count)\",\n\t\t\t\t\t);\n\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, committedA),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"the reloaded state must fold to writer A's state. Suspects: a partial append survived the rejection, or your snapshotState projection is not roundtrip-stable\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The outbox carries the same committed events (as stamped\n\t\t\t\t\t// copies with identical eventIds); nothing from B.\n\t\t\t\t\tconst outbox = await env.committedOutboxEvents();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(sortedIds(outbox), sortedIds(streamAfterA)),\n\t\t\t\t\t\t\"the outbox must contain exactly the committed events (compared by eventId); nothing from the stale writer\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"replay equality: a reloaded aggregate folds the committed stream in emission order\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tconst emittedIds = orderedIds(aggregate.pendingEvents);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\temittedIds.length,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"harness contract: createAggregate applies ONE creation event and mutate applies ONE event each\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\n\t\t\t\t\t// The stream holds the UNSTAMPED originals in emission order.\n\t\t\t\t\tconst stream = await env.committedStreamEvents(aggregate.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(orderedIds(stream), emittedIds),\n\t\t\t\t\t\t\"the committed stream must contain exactly the emitted events in emission order; reordering breaks every consumer's fold\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Post-commit lifecycle on the saved instance.\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.pendingEvents.length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"pending events must be cleared after a successful commit (markPersisted ran)\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.persistedVersion,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"after a successful commit, persistedVersion must equal version\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// The reload folds to the same aggregate.\n\t\t\t\t\tconst reloaded = await reload(env, aggregate.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\treloaded.version,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"the reloaded version must equal the event count\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\treloaded.persistedVersion,\n\t\t\t\t\t\treloaded.version,\n\t\t\t\t\t\t\"a reloaded aggregate's persistedVersion must equal its version\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\treloaded.pendingEvents.length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"a reloaded aggregate must not carry pending events (replay is not re-recording)\",\n\t\t\t\t\t);\n\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, reloaded),\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, aggregate),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"the reloaded aggregate must fold to the same state as the in-memory instance. Suspects: fold order (readStream must return emission order), or a snapshotState projection that is not roundtrip-stable\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"getById returns null for a stream that does not exist\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst never = harness.createAggregate();\n\t\t\t\t\tconst probe = await env.run(({ repository }) =>\n\t\t\t\t\t\trepository.getById(never.id),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tprobe === null,\n\t\t\t\t\t\t\"getById of a never-persisted id must return null (empty stream = no aggregate)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"identity map: two getById calls in one unit of work return the same instance\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst first = await repository.getById(seeded.id);\n\t\t\t\t\t\tconst second = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tfirst !== null && first === second,\n\t\t\t\t\t\t\t\"repeated loads within one unit of work must return the SAME instance (identity map); distinct instances double-harvest events\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rollback persists nothing: stream and outbox untouched, pending events survive, first save can be retried\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tconst pendingBefore = aggregate.pendingEvents.length;\n\n\t\t\t\t\tawait captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t\t\tthrow new Error(\"contract rollback probe\");\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.committedStreamEvents(aggregate.id)).length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"a rolled-back transaction must not leave events in the stream\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.committedOutboxEvents()).length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"a rolled-back transaction must not leave events in the outbox\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.pendingEvents.length,\n\t\t\t\t\t\tpendingBefore,\n\t\t\t\t\t\t\"pending events must survive a rollback (so the first save can be retried)\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\taggregate.persistedVersion === undefined,\n\t\t\t\t\t\t\"a rolled-back first save must leave persistedVersion undefined (the stream does not exist)\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Retrying the SAME never-persisted instance is the\n\t\t\t\t\t// documented carve-out: there is no row/stream to reload.\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.committedStreamEvents(aggregate.id)).length,\n\t\t\t\t\t\tpendingBefore,\n\t\t\t\t\t\t\"the retried first save must append the full pending history\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.persistedVersion,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"after the successful retry, persistedVersion must equal version\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"readStream honors fromVersion: the snapshot catch-up read returns exactly the events after the position\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst full = await env.committedStreamEvents(aggregate.id);\n\t\t\t\t\tassertEqual(full.length, 3, \"seeding must have committed 3 events\");\n\n\t\t\t\t\tconst afterOne = await env.committedStreamEvents(aggregate.id, 1);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(orderedIds(afterOne), orderedIds(full.slice(1))),\n\t\t\t\t\t\t\"fromVersion=1 must return exactly the events after stream position 1, in order; restoreFromSnapshotWithEvents replays exactly this window\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst afterAll = await env.committedStreamEvents(\n\t\t\t\t\t\taggregate.id,\n\t\t\t\t\t\tfull.length,\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tafterAll.length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"fromVersion at the stream head must return no events\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t];\n\n\ttests.push(\n\t\tcreateAggregateWithId\n\t\t\t? {\n\t\t\t\t\tname: \"duplicate create: two creators racing on one stream; the second append conflicts and the stream is untouched\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\t\t\tconst seedStream = await env.committedStreamEvents(seeded.id);\n\n\t\t\t\t\t\t\tconst duplicate = createAggregateWithId.call(\n\t\t\t\t\t\t\t\tharness,\n\t\t\t\t\t\t\t\tseeded.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tawait repository.save(duplicate);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamedAnyOf(rejection, [\n\t\t\t\t\t\t\t\t\t\"ConcurrencyConflictError\",\n\t\t\t\t\t\t\t\t\t\"DuplicateAggregateError\",\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t`the duplicate creator's append (expectedVersion 0 on an existing stream) must reject with (or wrap) ConcurrencyConflictError or DuplicateAggregateError; got: ${describeError(rejection)}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst finalStream = await env.committedStreamEvents(seeded.id);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tdeepEqual(orderedIds(finalStream), orderedIds(seedStream)),\n\t\t\t\t\t\t\t\t\"the existing stream must be untouched by the rejected duplicate create\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"duplicate create: two creators racing on one stream; the second append conflicts and the stream is untouched\",\n\t\t\t\t\t\"createAggregateWithId\",\n\t\t\t\t),\n\t);\n\n\treturn tests;\n}\n","import type { IAggregateRoot } from \"../aggregate/aggregate\";\nimport type { AnyDomainEvent } from \"../aggregate/domain-event\";\nimport type { Id } from \"../core/id\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tcaptureRejection,\n\tchainContainsErrorNamed,\n\tdescribeError,\n\tloadAggregateOrFail,\n\trunInContractEnvironment,\n\tskippedContractTest,\n} from \"./contract-assertions\";\n\n/**\n * The repository surface the contract suite exercises: the minimal\n * structural subset of the canonical `IUnitOfWorkRepository` (exported\n * from the main entry) that the tests need. `getById` is typed over\n * the aggregate's own branded id (`TAgg[\"id\"]`), so concrete adapters,\n * including arrow-function-property style repositories, which are\n * checked contravariantly, match without casts.\n */\nexport interface ContractRepository<\n\tTAgg extends IAggregateRoot<Id<string>, AnyDomainEvent>,\n> {\n\tgetById(id: TAgg[\"id\"]): Promise<TAgg | null>;\n\tsave(aggregate: TAgg): Promise<void>;\n\tdelete(aggregate: TAgg): Promise<void>;\n}\n\n/**\n * One isolated test environment: fresh storage, fresh outbox. The\n * suite creates one per test via {@link RepositoryContractHarness} and\n * tears it down afterwards (a teardown failure never masks an\n * in-flight contract violation).\n */\nexport interface RepositoryContractEnvironment<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\t/**\n\t * Execute one unit of work against the adapter under test: open the\n\t * transaction, hand the suite a tx-bound repository, commit on\n\t * resolve, roll back on throw, and run the post-commit lifecycle\n\t * (event harvest into the outbox, `markPersisted`). Wire this\n\t * through your real `UnitOfWork` / `withCommit` setup: the commit\n\t * boundary IS part of what the suite proves.\n\t */\n\trun<R>(\n\t\twork: (ctx: { repository: ContractRepository<TAgg> }) => Promise<R>,\n\t): Promise<R>;\n\n\t/**\n\t * All events currently persisted in the outbox (committed writes\n\t * only; a rolled-back transaction's events must not appear here).\n\t */\n\tcommittedOutboxEvents(): Promise<ReadonlyArray<Evt>>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the contract suite.\n *\n * The harness MUST provide isolation per environment (fresh\n * tables/keyspace or a truncate); tests assume they see only their\n * own writes. **For SQL/ORM adapters this must run against a real\n * database** (testcontainers or equivalent), not an in-memory fake:\n * the mandatory two-writer test proves YOUR `WHERE version = ?`\n * predicate, and an in-memory stand-in proves only itself.\n *\n * Optional capabilities widen the suite: tests for an absent\n * capability come back **marked `skipped`** with a `run()` that\n * rejects loudly: bind them with `it.skip` so the gap stays visible\n * in every report (see {@link RepositoryContractTest}); a naive\n * binding fails instead of green-no-op'ing. Capabilities are captured\n * once at suite creation. Provide every capability your adapter can\n * support; each one closes a real OCC hole.\n */\nexport interface RepositoryContractHarness<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n> {\n\tcreateEnvironment(): Promise<RepositoryContractEnvironment<TAgg, Evt>>;\n\n\t/**\n\t * A brand-new aggregate (never persisted, unique id,\n\t * `persistedVersion === undefined`).\n\t */\n\tcreateAggregate(): TAgg;\n\n\t/**\n\t * Apply exactly ONE version-bumping domain mutation that records at\n\t * least one domain event (a `commit()`-style state change). The\n\t * suite relies on the +1-per-call arithmetic and on the event for\n\t * its outbox assertions.\n\t */\n\tmutate(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: a version-bumping mutation whose state is deep-equal to\n\t * the previous state (`setState({...state}, true)`). Enables the\n\t * version-only-change-still-persists test: the skip-save/OCC-desync\n\t * trap.\n\t */\n\tmutateVersionOnly?(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: a mutation that changes ONLY a child collection (a\n\t * non-root-row `changedKeys` entry). Enables the\n\t * child-change-bumps-root-version test for partial-write\n\t * repositories.\n\t */\n\tmutateChildCollection?(aggregate: TAgg): void;\n\n\t/**\n\t * Optional: construct a NEW (never-persisted) aggregate instance\n\t * carrying a SPECIFIC id. Enables TWO tests: deletion-is-final-\n\t * across-instances (resurrection via a factory after delete) and\n\t * the duplicate-insert test (see\n\t * {@link insertsAreDuplicateChecked} to opt out of the latter\n\t * independently).\n\t */\n\tcreateAggregateWithId?(id: TAgg[\"id\"]): TAgg;\n\n\t/**\n\t * Semantic opt-OUT (default `true`): whether `save()`'s INSERT path\n\t * rejects an existing id with `DuplicateAggregateError` (mapping the\n\t * driver's unique-violation: Postgres `23505`, MySQL `1062`, SQLite\n\t * `SQLITE_CONSTRAINT_UNIQUE`). This is the near-mandatory contract:\n\t * `save()` is insert-or-update, never upsert. Create-idempotency\n\t * belongs in the USE CASE (load, then decide), not in the save path.\n\t * Set `false` ONLY for a deliberately upserting adapter\n\t * (idempotent-create design); the duplicate-insert test is then\n\t * reported as skipped under this capability name, without costing\n\t * the deletion-finality coverage that `createAggregateWithId` also\n\t * gates.\n\t */\n\tinsertsAreDuplicateChecked?: boolean;\n\n\t/**\n\t * Optional: a plain-data projection of the aggregate's persisted\n\t * state, compared with deep equality. Enables the mandatory test's\n\t * state assertion (without it, only the version and the outbox are\n\t * compared, and an adapter whose predicate guards the version write\n\t * but not the state write would slip through).\n\t *\n\t * **The projection must be roundtrip-stable**: it compares a\n\t * DB-reloaded aggregate against an in-memory one, so normalize\n\t * anything your store changes in transit: dates to ISO strings at\n\t * your store's precision (MySQL DATETIME truncates millis), no\n\t * `undefined`-valued keys (JSON columns drop them), decimals/bigints\n\t * to one consistent representation. A mismatch here fails the\n\t * mandatory test; the message names the projection as a suspect.\n\t */\n\tsnapshotState?(aggregate: TAgg): unknown;\n\n\t/**\n\t * Optional flag: declare it when your `delete(aggregate)` runs an\n\t * OCC predicate (`DELETE … WHERE id = ? AND version = ?`). Enables\n\t * the stale-delete conflict test. Unpredicated deletes are\n\t * last-write-wins by construction: acceptable for GC-style\n\t * cleanup, rarely for user-initiated deletion of contended\n\t * aggregates (see the repository guide).\n\t */\n\tdeletesAreVersionChecked?: boolean;\n}\n\n/**\n * One named contract test; `run` rejects with a descriptive Error on\n * violation. When the harness lacks the capability a test needs, the\n * entry is still returned with {@link skipped} set and a `run` that\n * REJECTS with an explanatory error: bind it with your runner's skip\n * (`(test.skipped ? it.skip : it)(test.name, test.run)`) so the gap is\n * visible in every test report: a missing capability must never look\n * like green coverage, and a naive binding that ignores `skipped`\n * fails loud instead of passing silently.\n */\nexport interface RepositoryContractTest {\n\tname: string;\n\trun: () => Promise<void>;\n\t/** Present when the harness lacks the capability this test needs. */\n\tskipped?: { capability: string };\n}\n\n/**\n * The repository contract test suite: the proof that an adapter\n * actually delivers the guarantees the kit's Unit of Work documents.\n *\n * The kit is ORM-agnostic: the OCC version predicate lives in YOUR\n * repository's SQL. That makes optimistic concurrency a **repository\n * contract, not a kit guarantee**: the kit ships the boundary, the\n * `persistedVersion` baseline, `ConcurrencyConflictError`, and this\n * suite; your adapter must pass it. An adapter that has not passed the\n * suite (against a real database, for SQL adapters) has not\n * demonstrated OCC.\n *\n * Framework-agnostic: assertions throw plain `Error`s, so the suite\n * binds to vitest, jest, or `node:test` the same way:\n *\n * ```ts\n * import { describe, it } from \"vitest\";\n * import { createRepositoryContractTests } from \"@shirudo/ddd-kit/testing\";\n *\n * const harness: RepositoryContractHarness<Order, OrderEvent> = {\n * createEnvironment: async () => {\n * const schema = await provisionTestSchema(); // testcontainers etc.\n * const uowDeps = {\n * scope: schema.scope,\n * outbox: schema.outbox,\n * repositories: {\n * orders: (tx, session) => new DrizzleOrderRepository(tx, session),\n * },\n * };\n * return {\n * run: (work) =>\n * new UnitOfWork(uowDeps).run(({ repositories }) =>\n * work({ repository: repositories.orders })),\n * committedOutboxEvents: () => schema.readOutboxEvents(),\n * teardown: () => schema.drop(),\n * };\n * },\n * createAggregate: () => Order.draft(orderIds.next()),\n * mutate: (order) => order.changeNote(`note-${counter++}`), // ONE bump + event\n * // provide every optional capability your adapter supports:\n * createAggregateWithId: (id) => Order.draft(id),\n * snapshotState: (order) => normalizeForRoundtrip(order.state),\n * deletesAreVersionChecked: true,\n * };\n *\n * describe(\"DrizzleOrderRepository: repository contract\", () => {\n * for (const test of createRepositoryContractTests(harness)) {\n * (test.skipped ? it.skip : it)(test.name, test.run);\n * }\n * });\n * ```\n *\n * **`env.run` must provide unit-of-work semantics.** Three core tests\n * (identity-map sameness, getById-null-after-delete, deletion\n * finality) exercise the session machinery: `session.identityMap`,\n * the `isDeleted` probe, the deleted-gate. Wiring `run` through the\n * kit's `UnitOfWork` gives you all of it; a hand-rolled `withCommit`\n * wiring must provide equivalents or those tests will fail. A\n * `withCommit`-only setup that deliberately makes no identity-map /\n * deletion-finality claims is outside this suite's scope; the suite\n * is the compliance bar for unit-of-work repositories.\n *\n * **Error matching is by NAME along the `cause` chain, not by\n * `instanceof`.** The suite ships in its own bundle entry; comparing\n * class identity would spuriously fail whenever the adapter's errors\n * come from a different copy of the kit (the main entry's bundle, or a\n * second installed version). `error.name === \"ConcurrencyConflictError\"`\n * anywhere in the chain is the contract.\n *\n * **What each test proves.** The OCC, routing, rollback, and outbox\n * tests prove YOUR adapter's SQL and transaction wiring. The\n * identity-map, deletion-finality, and event-lifecycle tests prove\n * your READ-PATH and unit-of-work WIRING (they exercise kit-provided\n * machinery, namely `session.identityMap`, the deleted-gate, and\n * `withCommit`'s harvest, and fail when your repository bypasses or\n * mis-wires it).\n * A deletion-finality failure usually means a missing\n * `identityMap.isDeleted` check or an `enrollSaved` placed after the\n * row write, not a broken DELETE statement.\n *\n * **Known limitation: no truly concurrent runs.** The mandatory\n * two-writer test is deliberately sequential-deterministic: writer B\n * loads, writer A loads/mutates/commits, then B commits its stale\n * instance. The stale `persistedVersion` baseline travels with B's\n * instance, so the version predicate is exercised exactly as in a true\n * race, without depending on lock timing, pool sizes, or\n * engine-specific blocking. The flip side: lock interaction is NOT\n * covered. A `SELECT … FOR UPDATE`-style repository that blocks\n * instead of conflicting, or a SERIALIZABLE engine surfacing raw\n * serialization failures (Postgres 40001) your adapter must map to\n * `ConcurrencyConflictError`, needs adapter-specific tests on top of\n * this suite.\n */\nexport function createRepositoryContractTests<\n\tTAgg extends IAggregateRoot<Id<string>, Evt>,\n\tEvt extends AnyDomainEvent = AnyDomainEvent,\n>(harness: RepositoryContractHarness<TAgg, Evt>): RepositoryContractTest[] {\n\ttype Env = RepositoryContractEnvironment<TAgg, Evt>;\n\n\t// Runner plumbing shared with the event-sourced suite; see\n\t// ./contract-assertions for the teardown-never-masks rule.\n\tconst withEnvironment = (body: (env: Env) => Promise<void>): Promise<void> =>\n\t\trunInContractEnvironment(() => harness.createEnvironment(), body);\n\n\tconst loadOrFail = (\n\t\trepository: ContractRepository<TAgg>,\n\t\tid: TAgg[\"id\"],\n\t): Promise<TAgg> =>\n\t\tloadAggregateOrFail(\n\t\t\trepository,\n\t\t\tid,\n\t\t\t\"broken hydration or a write that did not commit\",\n\t\t);\n\n\t/** Seed one aggregate with a single committed mutation; returns it persisted. */\n\tasync function seed(env: Env): Promise<TAgg> {\n\t\tconst aggregate = harness.createAggregate();\n\t\tharness.mutate(aggregate);\n\t\tawait env.run(async ({ repository }) => {\n\t\t\tawait repository.save(aggregate);\n\t\t});\n\t\treturn aggregate;\n\t}\n\n\tasync function reload(env: Env, id: TAgg[\"id\"]): Promise<TAgg> {\n\t\treturn env.run(({ repository }) => loadOrFail(repository, id));\n\t}\n\n\t// Sorted: eventIds are unique, so this is a multiset comparison. The\n\t// environment contract guarantees WHICH events are persisted, not the\n\t// order a `SELECT` without `ORDER BY` happens to return them in.\n\tconst eventIds = (events: ReadonlyArray<Evt>): string[] =>\n\t\tevents.map((event) => event.eventId).sort();\n\n\t// Capabilities are captured ONCE at suite creation: a harness mutated\n\t// between createRepositoryContractTests() and the run must not flip a\n\t// test's behavior mid-flight.\n\tconst snapshotState = harness.snapshotState;\n\tconst mutateVersionOnly = harness.mutateVersionOnly;\n\tconst mutateChildCollection = harness.mutateChildCollection;\n\tconst createAggregateWithId = harness.createAggregateWithId;\n\tconst deletesAreVersionChecked = harness.deletesAreVersionChecked === true;\n\t// Semantic opt-OUT, default true (the contract is near-mandatory).\n\tconst insertsAreDuplicateChecked =\n\t\tharness.insertsAreDuplicateChecked !== false;\n\n\tconst skippedTest = (\n\t\tname: string,\n\t\tcapability: string,\n\t): RepositoryContractTest => skippedContractTest(name, capability);\n\n\tconst tests: RepositoryContractTest[] = [\n\t\t{\n\t\t\tname: \"MANDATORY two-writer conflict: the stale writer throws ConcurrencyConflictError and persists nothing\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst seedEvents = await env.committedOutboxEvents();\n\t\t\t\t\tconst seedEventIds = new Set(seedEvents.map((e) => e.eventId));\n\n\t\t\t\t\t// Writer B loads first - its persistedVersion baseline is\n\t\t\t\t\t// now fixed at the pre-conflict version.\n\t\t\t\t\tconst staleB = await reload(env, seeded.id);\n\n\t\t\t\t\t// Writer A loads the same version, mutates, commits.\n\t\t\t\t\tconst committedA = await env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst a = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(a);\n\t\t\t\t\t\tawait repository.save(a);\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t});\n\t\t\t\t\tconst outboxAfterA = await env.committedOutboxEvents();\n\t\t\t\t\tassert(\n\t\t\t\t\t\toutboxAfterA.length > seedEvents.length,\n\t\t\t\t\t\t\"writer A's events must reach the outbox on commit\",\n\t\t\t\t\t);\n\t\t\t\t\t// Writer A's NEW events must carry A's ACTUAL committed\n\t\t\t\t\t// version - not merely some number. A wrong value here\n\t\t\t\t\t// (hardcoded, schema version, persistedVersion) would\n\t\t\t\t\t// poison every consumer's ordering/idempotency watermark.\n\t\t\t\t\tconst newSinceSeed = outboxAfterA.filter(\n\t\t\t\t\t\t(event) => !seedEventIds.has(event.eventId),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tnewSinceSeed.length > 0 &&\n\t\t\t\t\t\t\tnewSinceSeed.every(\n\t\t\t\t\t\t\t\t(event) => event.aggregateVersion === committedA.version,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t`writer A's committed outbox events must carry aggregateVersion === ${committedA.version} (A's commit version). ` +\n\t\t\t\t\t\t\t`Suspect #1: your outbox read-back (committedOutboxEvents) reconstructs events from an explicit column list ` +\n\t\t\t\t\t\t\t`and drops or string-types the aggregateVersion field. Suspect #2: a hand-rolled orchestration that does not ` +\n\t\t\t\t\t\t\t`stamp aggregateVersion = aggregate.version at harvest (withCommit does this automatically).`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Writer B mutates its stale instance and tries to commit.\n\t\t\t\t\tharness.mutate(staleB);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(staleB);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t\"the second writer's commit must reject - it committed on a stale version instead (OCC predicate missing?)\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"ConcurrencyConflictError\"),\n\t\t\t\t\t\t`the second writer's rejection must be (or wrap, via the cause chain) ConcurrencyConflictError; got: ${describeError(rejection)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Final persisted state equals writer A's.\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tcommittedA.version,\n\t\t\t\t\t\t\"the persisted version must equal writer A's committed version\",\n\t\t\t\t\t);\n\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, committedA),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"the persisted STATE must equal writer A's. Two suspects: \" +\n\t\t\t\t\t\t\t\t\"(a) a predicate that guards only the version write lets the stale writer's state survive; \" +\n\t\t\t\t\t\t\t\t\"(b) your snapshotState projection is not roundtrip-stable (date precision, undefined-valued keys, decimal representation) - see its JSDoc\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Outbox contains exactly the events it contained after A's\n\t\t\t\t\t// commit - same records, not merely the same count.\n\t\t\t\t\tconst outboxFinal = await env.committedOutboxEvents();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(eventIds(outboxFinal), eventIds(outboxAfterA)),\n\t\t\t\t\t\t\"the outbox must contain exactly the winning writer's events (compared by eventId) - nothing from the stale writer, nothing replaced\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"insert routing: a never-persisted aggregate INSERTs even after pre-save mutations\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tassert(\n\t\t\t\t\t\taggregate.persistedVersion === undefined,\n\t\t\t\t\t\t\"harness contract: createAggregate() must return a never-persisted aggregate (persistedVersion === undefined)\",\n\t\t\t\t\t);\n\t\t\t\t\t// Mutate BEFORE the first save: version moves past zero in\n\t\t\t\t\t// memory while no row exists. Routing on version === 0\n\t\t\t\t\t// would attempt an UPDATE that affects zero rows.\n\t\t\t\t\tharness.mutate(aggregate);\n\t\t\t\t\tharness.mutate(aggregate);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst loaded = await reload(env, aggregate.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tloaded.version,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"the INSERT must persist the in-memory version (route on persistedVersion === undefined, not version === 0)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"update writes the in-memory version and predicates on persistedVersion\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tbaseline + 2,\n\t\t\t\t\t\t\"two mutations must persist as baseline + 2 (version is a mutation sequence)\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.persistedVersion,\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\"a reloaded aggregate's persistedVersion must equal its version\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rollback persists nothing: state, version, and outbox untouched\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\tconst versionBefore = seeded.version;\n\t\t\t\t\tconst outboxBefore = (await env.committedOutboxEvents()).length;\n\t\t\t\t\tconst probe = new Error(\"contract rollback probe\");\n\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\tthrow probe;\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t\"a throwing unit of work must reject\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tversionBefore,\n\t\t\t\t\t\t\"a rolled-back write must not change the persisted version\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.committedOutboxEvents()).length,\n\t\t\t\t\t\toutboxBefore,\n\t\t\t\t\t\t\"a rolled-back transaction must not leave events in the outbox\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"identity map: two getById calls in one unit of work return the same instance\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst first = await repository.getById(seeded.id);\n\t\t\t\t\t\tconst second = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tfirst !== null && first === second,\n\t\t\t\t\t\t\t\"repeated loads within one unit of work must return the SAME instance (identity map) - distinct instances double-harvest events\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"delete: getById returns null in the same unit of work and after the commit\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\tconst probe = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tprobe === null,\n\t\t\t\t\t\t\t\"after delete, getById in the SAME unit of work must return null (isDeleted check), even if the physical delete is deferred\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tconst probe = await repository.getById(seeded.id);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tprobe === null,\n\t\t\t\t\t\t\t\"after the deleting unit of work committed, the aggregate must be gone\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"deletion is final: saving the deleted aggregate in the same unit of work throws AggregateDeletedError\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\tharness.mutate(loaded);\n\t\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"AggregateDeletedError\"),\n\t\t\t\t\t\t`save-after-delete must reject with (or wrap) AggregateDeletedError; got: ${describeError(rejection)}. ` +\n\t\t\t\t\t\t\t`If you see ConcurrencyConflictError here instead, your save() probably enrolls AFTER the row write - enroll first.`,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"events are cleared after a committed unit of work and kept after a rollback\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\tconst committed = harness.createAggregate();\n\t\t\t\t\tharness.mutate(committed);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcommitted.pendingEvents.length > 0,\n\t\t\t\t\t\t\"harness contract: mutate() must record at least one domain event\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(committed);\n\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tcommitted.pendingEvents.length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"pending events must be cleared after a successful commit\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst rolledBack = harness.createAggregate();\n\t\t\t\t\tharness.mutate(rolledBack);\n\t\t\t\t\tconst pendingBefore = rolledBack.pendingEvents.length;\n\t\t\t\t\tawait captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(rolledBack);\n\t\t\t\t\t\t\tthrow new Error(\"contract rollback probe\");\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\trolledBack.pendingEvents.length,\n\t\t\t\t\t\tpendingBefore,\n\t\t\t\t\t\t\"pending events must survive a rollback (so a fresh load + retry can re-emit them)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"persistedVersion syncs only after a successful commit\",\n\t\t\trun: () =>\n\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t// Re-saving the SAME instance after the rollback is the\n\t\t\t\t\t// documented carve-out from \"don't reuse aggregates after a\n\t\t\t\t\t// rollback\": a NEVER-persisted aggregate has no row and its\n\t\t\t\t\t// baseline is still undefined, so there is nothing to\n\t\t\t\t\t// reload - retrying its first save is the only path.\n\t\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\t\tharness.mutate(aggregate);\n\n\t\t\t\t\tawait captureRejection(\n\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t\t\tthrow new Error(\"contract rollback probe\");\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\taggregate.persistedVersion === undefined,\n\t\t\t\t\t\t\"a rolled-back first save must leave persistedVersion undefined (the aggregate is still unpersisted)\",\n\t\t\t\t\t);\n\n\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\tawait repository.save(aggregate);\n\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\taggregate.persistedVersion,\n\t\t\t\t\t\taggregate.version,\n\t\t\t\t\t\t\"after a successful commit, persistedVersion must equal version (markPersisted ran)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t},\n\t];\n\n\t// Capability-gated tests: when the harness lacks the capability, the\n\t// entry is returned WITH `skipped` set and a loudly-rejecting run() -\n\t// the gap stays visible in every test report (it.skip) and a naive\n\t// binding fails instead of green-no-op'ing.\n\ttests.push(\n\t\tmutateVersionOnly\n\t\t\t? {\n\t\t\t\t\tname: \"version-only change still persists (skip-save must not desync the OCC baseline)\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\tmutateVersionOnly.call(harness, loaded);\n\t\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tbaseline + 1,\n\t\t\t\t\t\t\t\t\"a version-only change (empty changedKeys, bumped version) must still be persisted - skipping it desyncs persistedVersion and produces false ConcurrencyConflictErrors later\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"version-only change still persists (skip-save must not desync the OCC baseline)\",\n\t\t\t\t\t\"mutateVersionOnly\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tmutateChildCollection\n\t\t\t? {\n\t\t\t\t\tname: \"a child-collection-only change bumps the persisted root version\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\t\t\t\t\t\t\tconst baseline = seeded.version;\n\n\t\t\t\t\t\t\tawait env.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\tmutateChildCollection.call(harness, loaded);\n\t\t\t\t\t\t\t\tawait repository.save(loaded);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tfinal.version > baseline,\n\t\t\t\t\t\t\t\t\"a child-collection-only change must advance the persisted ROOT version - otherwise concurrent writers interleave with collection writes undetected\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"a child-collection-only change bumps the persisted root version\",\n\t\t\t\t\t\"mutateChildCollection\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tcreateAggregateWithId\n\t\t\t? {\n\t\t\t\t\tname: \"deletion is final across instances: a re-created aggregate with the same id cannot be saved\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tconst loaded = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\t\tawait repository.delete(loaded);\n\t\t\t\t\t\t\t\t\tconst resurrected = createAggregateWithId.call(\n\t\t\t\t\t\t\t\t\t\tharness,\n\t\t\t\t\t\t\t\t\t\tseeded.id,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tharness.mutate(resurrected);\n\t\t\t\t\t\t\t\t\tawait repository.save(resurrected);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"AggregateDeletedError\"),\n\t\t\t\t\t\t\t\t`saving a re-created instance of a deleted aggregate must reject with (or wrap) AggregateDeletedError; got: ${describeError(rejection)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"deletion is final across instances: a re-created aggregate with the same id cannot be saved\",\n\t\t\t\t\t\"createAggregateWithId\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tcreateAggregateWithId && insertsAreDuplicateChecked\n\t\t\t? {\n\t\t\t\t\tname: \"duplicate insert: a second never-persisted aggregate with an existing id throws DuplicateAggregateError\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\t// A second NEVER-persisted instance with the same id:\n\t\t\t\t\t\t\t// two concurrent creators racing on a business-derived\n\t\t\t\t\t\t\t// id, or an id-generator collision. The INSERT must\n\t\t\t\t\t\t\t// surface as the kit's error class, not a raw driver\n\t\t\t\t\t\t\t// error. Mutated TWICE so its version differs from the\n\t\t\t\t\t\t\t// seeded row's - a clobbering insert is then visible\n\t\t\t\t\t\t\t// in the version check below even without a state\n\t\t\t\t\t\t\t// snapshot.\n\t\t\t\t\t\t\tconst duplicate = createAggregateWithId.call(\n\t\t\t\t\t\t\t\tharness,\n\t\t\t\t\t\t\t\tseeded.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tawait repository.save(duplicate);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"DuplicateAggregateError\"),\n\t\t\t\t\t\t\t\t`inserting a second aggregate with an existing id must reject with (or wrap) DuplicateAggregateError - ` +\n\t\t\t\t\t\t\t\t\t`map your driver's unique-violation signal (Postgres 23505, MySQL 1062, SQLite SQLITE_CONSTRAINT_UNIQUE) ` +\n\t\t\t\t\t\t\t\t\t`instead of letting the raw driver error escape; got: ${describeError(rejection)}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// The existing row is untouched by the rejected insert:\n\t\t\t\t\t\t\t// version AND (capability permitting) state.\n\t\t\t\t\t\t\tconst final = await reload(env, seeded.id);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tseeded.version,\n\t\t\t\t\t\t\t\t\"the existing row must be untouched by the rejected duplicate insert - a duplicate check that fires AFTER the write (or outside the transaction) clobbers the existing row\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\t\t\tsnapshotState.call(harness, seeded),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\"the existing row's STATE must be untouched by the rejected duplicate insert\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"duplicate insert: a second never-persisted aggregate with an existing id throws DuplicateAggregateError\",\n\t\t\t\t\t// Name the capability that is actually missing: the\n\t\t\t\t\t// mechanical one (cannot build the duplicate) or the\n\t\t\t\t\t// semantic opt-out (deliberately upserting adapter).\n\t\t\t\t\tcreateAggregateWithId\n\t\t\t\t\t\t? \"insertsAreDuplicateChecked\"\n\t\t\t\t\t\t: \"createAggregateWithId\",\n\t\t\t\t),\n\t);\n\ttests.push(\n\t\tdeletesAreVersionChecked\n\t\t\t? {\n\t\t\t\t\tname: \"stale delete conflicts: deleting from a stale instance throws ConcurrencyConflictError\",\n\t\t\t\t\trun: () =>\n\t\t\t\t\t\twithEnvironment(async (env) => {\n\t\t\t\t\t\t\tconst seeded = await seed(env);\n\n\t\t\t\t\t\t\t// Writer B loads, writer A commits an update, B deletes\n\t\t\t\t\t\t\t// from its stale baseline - the predicated DELETE must\n\t\t\t\t\t\t\t// affect zero rows and conflict, not destroy A's write.\n\t\t\t\t\t\t\tconst staleB = await reload(env, seeded.id);\n\t\t\t\t\t\t\tconst versionAfterA = await env.run(\n\t\t\t\t\t\t\t\tasync ({ repository }) => {\n\t\t\t\t\t\t\t\t\tconst a = await loadOrFail(repository, seeded.id);\n\t\t\t\t\t\t\t\t\tharness.mutate(a);\n\t\t\t\t\t\t\t\t\tawait repository.save(a);\n\t\t\t\t\t\t\t\t\treturn a.version;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\t\t\tenv.run(async ({ repository }) => {\n\t\t\t\t\t\t\t\t\tawait repository.delete(staleB);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tchainContainsErrorNamed(rejection, \"ConcurrencyConflictError\"),\n\t\t\t\t\t\t\t\t`a stale delete must reject with (or wrap) ConcurrencyConflictError; got: ${describeError(rejection)} - an unpredicated DELETE silently destroys the concurrent writer's update`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// A's write survived - load nullable on purpose: the\n\t\t\t\t\t\t\t// rejected delete must not have destroyed the row.\n\t\t\t\t\t\t\tconst final = await env.run(({ repository }) =>\n\t\t\t\t\t\t\t\trepository.getById(seeded.id),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tfinal !== null,\n\t\t\t\t\t\t\t\t\"the row must still exist after the stale delete was rejected - the predicate must PREVENT the destructive delete, not merely report it\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\t\t\tversionAfterA,\n\t\t\t\t\t\t\t\t\"the surviving row must carry writer A's version\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: skippedTest(\n\t\t\t\t\t\"stale delete conflicts: deleting from a stale instance throws ConcurrencyConflictError\",\n\t\t\t\t\t\"deletesAreVersionChecked\",\n\t\t\t\t),\n\t);\n\n\treturn tests;\n}\n\n// assert / assertEqual / chainContainsErrorNamed / describeError live in\n// ./contract-assertions, shared with the event-sourced contract suite.\n"]}
1
+ {"version":3,"file":"testing.js","names":[],"sources":["../src/testing/contract-assertions.ts","../src/testing/command-outbox-contract.ts","../src/testing/deadline-store-contract.ts","../src/testing/es-repository-contract.ts","../src/testing/event-store-contract.ts","../src/testing/idempotency-store-contract.ts","../src/testing/outbox-contract.ts","../src/testing/projection-checkpoint-contract.ts","../src/testing/repository-contract.ts","../src/testing/snapshot-store-contract.ts"],"sourcesContent":["/**\n * Assertion, error-matching, and suite-runner helpers shared by the\n * repository contract suites (state-stored and event-sourced). Internal\n * to the testing entry: not re-exported from `@shirudo/ddd-kit/testing`.\n */\nimport { isMintedEvent } from \"../aggregate/domain-event\";\n\n/**\n * One entry of a contract test suite. Every suite (repository,\n * event-sourced repository, outbox, idempotency store) returns a list\n * of these; bind them with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport interface ContractTest {\n\tname: string;\n\trun: () => Promise<void>;\n\t/** Present when the harness lacks the capability this test needs. */\n\tskipped?: { capability: string };\n}\n\n/**\n * Runs one contract-test body against a fresh environment and tears it\n * down in a finally-like discipline with one subtle, load-bearing rule:\n * a teardown failure (dropping a schema on an aborted pool) must never\n * REPLACE the contract-violation diagnostic that is the suite's entire\n * value. It only surfaces when the body itself succeeded.\n */\nexport async function runInContractEnvironment<\n\tEnv extends { teardown?(): Promise<void> },\n>(\n\tcreateEnvironment: () => Promise<Env>,\n\tbody: (env: Env) => Promise<void>,\n): Promise<void> {\n\tconst env = await createEnvironment();\n\tlet bodyFailed = false;\n\tlet bodyError: unknown;\n\ttry {\n\t\tawait body(env);\n\t} catch (error) {\n\t\tbodyFailed = true;\n\t\tbodyError = error;\n\t}\n\ttry {\n\t\tawait env.teardown?.();\n\t} catch (teardownError) {\n\t\tif (!bodyFailed) {\n\t\t\tthrow teardownError;\n\t\t}\n\t}\n\tif (bodyFailed) {\n\t\tthrow bodyError;\n\t}\n}\n\n/**\n * Binds a harness's environment factory into the per-test wrapper the\n * suites build their entries from: `inEnv(body)` yields a test `run`\n * that creates a fresh environment, runs the body, and tears down via\n * {@link runInContractEnvironment}.\n */\nexport function bindContractEnvironment<\n\tEnv extends { teardown?(): Promise<void> },\n>(\n\tcreateEnvironment: () => Promise<Env>,\n): (body: (env: Env) => Promise<void>) => () => Promise<void> {\n\treturn (body) => () => runInContractEnvironment(createEnvironment, body);\n}\n\n/** Resolves to the rejection reason, or `undefined` when the promise resolved. */\nexport function captureRejection(promise: Promise<unknown>): Promise<unknown> {\n\treturn promise.then(\n\t\t() => undefined,\n\t\t(error: unknown) => error,\n\t);\n}\n\n/**\n * Load with a contract diagnostic instead of a bare TypeError downstream.\n * `suspectHint` names the suite-specific likely cause (broken hydration\n * vs broken replay read).\n */\nexport async function loadAggregateOrFail<TAgg, TId>(\n\trepository: { findById(id: TId): Promise<TAgg | null | undefined> },\n\tid: TId,\n\tsuspectHint: string,\n): Promise<TAgg> {\n\tconst loaded = await repository.findById(id);\n\tassert(\n\t\tloaded !== null && loaded !== undefined,\n\t\t`findById(${String(id)}) returned no aggregate for an identity that must exist: ${suspectHint}`,\n\t);\n\treturn loaded;\n}\n\n/**\n * A capability-gated test entry whose `run()` rejects loudly, so a naive\n * binding that ignores `skipped` fails instead of green-no-op'ing.\n * Structurally assignable to both suites' test-entry types.\n */\nexport function skippedContractTest(\n\tname: string,\n\tcapability: string,\n): ContractTest & { skipped: { capability: string } } {\n\treturn {\n\t\tname,\n\t\tskipped: { capability },\n\t\trun: async () => {\n\t\t\tthrow new Error(\n\t\t\t\t`Contract test skipped: harness capability '${capability}' is not provided. ` +\n\t\t\t\t\t`Bind skipped tests with it.skip ((test.skipped ? it.skip : it)(test.name, test.run)) ` +\n\t\t\t\t\t`or provide the capability; each skipped capability is an unproven guarantee.`,\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Capability gate that keeps a test's NAME single-sourced: a harness\n * that satisfies the gate gets the real test, everyone else gets the\n * loud skipped entry under the same name (see\n * {@link skippedContractTest}). Nests for tests behind several gates;\n * the outermost failing gate's capability wins the skip report.\n */\nexport function gatedContractTest(\n\tgate: { capability: string; satisfiedBy: boolean },\n\ttest: ContractTest,\n): ContractTest {\n\treturn gate.satisfiedBy\n\t\t? test\n\t\t: skippedContractTest(test.name, gate.capability);\n}\n\n/**\n * Identities of an in-memory pending batch, with the shared precondition\n * that every event is recorded (minted). The `requirement` names the\n * suite-specific rule the harness violated when an event is unminted.\n */\nexport function mintedPendingEventIds(\n\tevents: ReadonlyArray<unknown>,\n\trequirement: string,\n): string[] {\n\treturn events.map((event) => {\n\t\tassert(\n\t\t\ttypeof event === \"object\" && event !== null && isMintedEvent(event),\n\t\t\trequirement,\n\t\t);\n\t\treturn (event as { readonly eventId: string }).eventId;\n\t});\n}\n\n/**\n * Sorted identities of committed outbox envelopes. Shared by both\n * repository suites so the projection cannot drift between them.\n */\nexport function sortedCommittedEventIds(\n\tcommitted: ReadonlyArray<{ readonly event: { readonly eventId: string } }>,\n): string[] {\n\treturn committed.map(({ event }) => event.eventId).sort();\n}\n\nexport function assert(condition: boolean, message: string): asserts condition {\n\tif (!condition) {\n\t\tthrow new Error(`Contract violated: ${message}`);\n\t}\n}\n\nexport function assertEqual(\n\tactual: unknown,\n\texpected: unknown,\n\tmessage: string,\n): void {\n\tif (actual !== expected) {\n\t\tthrow new Error(\n\t\t\t`Contract violated: ${message} (expected ${String(expected)}, got ${String(actual)})`,\n\t\t);\n\t}\n}\n\n/**\n * Walks the standard `cause` chain (cycle-safe, hostile-getter-safe)\n * looking for an Error that matches the given name. Matching is\n * deliberately by NAME, not `instanceof`: the suite ships in its own\n * bundle entry, and the adapter's errors come from the main entry's\n * copy of the kit (or even a second installed kit version) -\n * cross-copy `instanceof` is always false, name identity is the stable\n * contract. Since v3 the kit's errors are StructuredErrors whose\n * runtime `name` IS their SCREAMING_SNAKE code, minification-stable by\n * construction and inherited by subclasses (a `PgConflictError extends\n * ConcurrencyConflictError` keeps the code as its name). The suites\n * match ONLY the v3 codes. Failure diagnostics render the rejection's\n * cause-chain names ({@link describeError}), so an unexpected error,\n * including one from a different kit copy in the dependency graph, is\n * identifiable from the message without version-specific knowledge in\n * the suite.\n */\nexport function chainContainsErrorNamed(error: unknown, name: string): boolean {\n\tlet found = false;\n\twalkCauseChain(error, (node) => {\n\t\tfound = errorMatchesName(node, name);\n\t\treturn found;\n\t});\n\treturn found;\n}\n\n/**\n * The one cause-chain walk every chain-inspecting helper in this file\n * is expressed through (cycle-safe, hostile-cause-getter-safe): visits\n * each object node until `visit` asks to stop by returning `true`, the\n * chain ends, repeats, or advancing turns hostile. Single-sourced on\n * purpose: a hardening fix (a depth cap, a new hostile shape) must land\n * in ALL walkers at once, or the suites judge the same adapter\n * rejection inconsistently. Per-node property reads stay the visitor's\n * responsibility; only the `cause` advance is guarded here.\n */\nfunction walkCauseChain(\n\terror: unknown,\n\tvisit: (node: object) => boolean,\n): void {\n\tconst seen = new Set<unknown>();\n\tlet current: unknown = error;\n\twhile (\n\t\tcurrent !== null &&\n\t\tcurrent !== undefined &&\n\t\ttypeof current === \"object\" &&\n\t\t!seen.has(current)\n\t) {\n\t\tseen.add(current);\n\t\tif (visit(current)) return;\n\t\ttry {\n\t\t\tcurrent = (current as { cause?: unknown }).cause;\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/**\n * Asserts that the cause chain carries a kit error with one of the given\n * codes (since v3, `error.name === error.code`; the codes are the ONLY\n * accepted identity). Failure messages built with {@link describeError}\n * render the rejection's cause-chain names, so an unexpected error, e.g.\n * one from a different `@shirudo/ddd-kit` copy in the dependency graph,\n * is identifiable from the diagnostic without the suite carrying any\n * version-specific knowledge.\n */\nexport function assertChainContainsKitError(\n\trejection: unknown,\n\tcodes: readonly string[],\n\tmessage: string,\n): void {\n\tif (codes.some((code) => chainContainsErrorNamed(rejection, code))) {\n\t\treturn;\n\t}\n\tthrow new Error(`Contract violated: ${message}`);\n}\n\n/**\n * Walks the `cause` chain (cycle-safe, hostile-getter-safe) looking for\n * `retryable === true`: the same loose, property-based contract the\n * kit's retry classifier (`someChainRetryable`) applies. Suites assert\n * retryability with this instead of reading the top-level rejection, so\n * an adapter that wraps a kit error in its own error chain, which\n * {@link assertChainContainsKitError} deliberately tolerates, is judged\n * exactly the way a consumer's retry loop will judge it.\n *\n * Deliberately NOT a call to `someChainRetryable` itself: that\n * classifier throws on a circular cause chain (its callers handle\n * that), while a hardened suite must survive whatever error shape an\n * adapter rejects with and answer with a contract diagnostic, never a\n * helper crash. Same hardening discipline as\n * {@link chainContainsErrorNamed}.\n */\nexport function chainContainsRetryable(error: unknown): boolean {\n\tlet found = false;\n\twalkCauseChain(error, (node) => {\n\t\ttry {\n\t\t\tfound = (node as { retryable?: unknown }).retryable === true;\n\t\t} catch {\n\t\t\t// Hostile `retryable` getter: stop the walk, keep found=false.\n\t\t\treturn true;\n\t\t}\n\t\treturn found;\n\t});\n\treturn found;\n}\n\nfunction errorMatchesName(candidate: object, name: string): boolean {\n\ttry {\n\t\tif ((candidate as { name?: unknown }).name === name) {\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// Hostile `name` getter: treat as non-matching, keep walking.\n\t}\n\t// Fallback for errors whose own `name` was overridden (a subclass\n\t// that re-assigns `this.name` after super): the prototype chain\n\t// still carries the base class's constructor name.\n\ttry {\n\t\tlet proto: object | null = Object.getPrototypeOf(candidate);\n\t\tfor (let depth = 0; proto !== null && depth < 20; depth++) {\n\t\t\tif (\n\t\t\t\t(proto.constructor as { name?: unknown } | undefined)?.name === name\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tproto = Object.getPrototypeOf(proto);\n\t\t}\n\t} catch {\n\t\t// Hostile `constructor` getter on a prototype: non-matching.\n\t}\n\treturn false;\n}\n\nexport function describeError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst chain = causeChainNames(error);\n\t\tconst suffix =\n\t\t\tchain.length > 1 ? ` (cause chain: ${chain.join(\" -> \")})` : \"\";\n\t\treturn `${error.name}: ${error.message}${suffix}`;\n\t}\n\treturn String(error);\n}\n\n/**\n * Names along the `cause` chain (cycle-safe, hostile-getter-safe), for\n * failure diagnostics: a wrapped rejection shows WHAT it wraps, so an\n * unexpected error deep in the chain (a raw driver error, or an error\n * from a different kit copy) is identifiable from the message alone.\n */\nfunction causeChainNames(error: Error): string[] {\n\tconst names: string[] = [];\n\twalkCauseChain(error, (node) => {\n\t\ttry {\n\t\t\tconst { name } = node as { name?: unknown };\n\t\t\tnames.push(typeof name === \"string\" ? name : \"(unnamed)\");\n\t\t} catch {\n\t\t\t// Hostile `name` getter: stop with the partial chain collected.\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t});\n\treturn names;\n}\n","import type { PublishedCommand } from \"../app/command\";\nimport type {\n\tCommandOutboxCommitCandidate,\n\tCommandOutboxWriter,\n\tDurableCommandMessage,\n} from \"../app/command-outbox\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n\tgatedContractTest,\n} from \"./contract-assertions\";\n\nexport interface CommandOutboxContractEnvironment<C extends PublishedCommand> {\n\treadonly outbox: CommandOutboxWriter<C>;\n\treadonly addCommitted: (\n\t\tcommits: ReadonlyArray<CommandOutboxCommitCandidate<C>>,\n\t) => Promise<void>;\n\treadonly addRolledBack?: (\n\t\tcommits: ReadonlyArray<CommandOutboxCommitCandidate<C>>,\n\t) => Promise<void>;\n\treadonly readAll: () => Promise<\n\t\tReadonlyArray<CommandOutboxCommitCandidate<C>>\n\t>;\n\treadonly teardown?: () => Promise<void>;\n}\n\nexport interface CommandOutboxContractHarness<C extends PublishedCommand> {\n\treadonly createEnvironment: () => Promise<\n\t\tCommandOutboxContractEnvironment<C>\n\t>;\n\t/**\n\t * Builds one command for the given seed. The suite derives conflicting\n\t * commits from different seeds, so `createCommand` MUST return distinct\n\t * command content per seed (put the seed in the payload). A constant\n\t * command makes a manufactured conflict deep-equal to its original, and\n\t * the conflict tests then fail a compliant adapter that deduplicates\n\t * the exact retry.\n\t */\n\treadonly createCommand: (seed: number) => C;\n\treadonly providesRolledBackAdds?: boolean;\n}\n\nexport type CommandOutboxContractTest = ContractTest;\n\nexport function createCommandOutboxContractTests<C extends PublishedCommand>(\n\tharness: CommandOutboxContractHarness<C>,\n): ReadonlyArray<CommandOutboxContractTest> {\n\tconst inEnv = bindContractEnvironment(harness.createEnvironment);\n\tconst commit = (\n\t\tseed: number,\n\t\tcommandSeeds: ReadonlyArray<number> = [seed],\n\t): CommandOutboxCommitCandidate<C> => ({\n\t\torigin: {\n\t\t\teventId: `process-event-${seed}`,\n\t\t\tsource: {\n\t\t\t\taggregateType: \"CheckoutProcess\",\n\t\t\t\taggregateId: \"order-1\",\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\taggregateVersion: seed,\n\t\t\t\tcommitSequence: 0,\n\t\t\t\tcommitSize: 1,\n\t\t\t},\n\t\t},\n\t\tmessages: commandSeeds.map((commandSeed, index) =>\n\t\t\tmessage(seed, index, harness.createCommand(commandSeed)),\n\t\t),\n\t});\n\tconst tests: CommandOutboxContractTest[] = [\n\t\t{\n\t\t\tname: \"deduplicates an exact retry by origin event id\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit(1);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassertEqual(\n\t\t\t\t\tstored.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"an exact retry must retain one receipt, not append a duplicate\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(stored[0], original),\n\t\t\t\t\t\"an exact retry must preserve the original receipt and commands\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rejects conflicting reuse of an origin event id\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit(1);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tconst conflict = {\n\t\t\t\t\t...commit(1, [99]),\n\t\t\t\t\torigin: {\n\t\t\t\t\t\t...commit(1, [99]).origin,\n\t\t\t\t\t\teventId: original.origin.eventId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tassert(\n\t\t\t\t\t!deepEqual(conflict.messages, original.messages),\n\t\t\t\t\t\"harness contract: createCommand must return distinct content \" +\n\t\t\t\t\t\t\"per seed, or the manufactured conflict is an exact retry\",\n\t\t\t\t);\n\t\t\t\tconst rejection = await captureRejection(env.addCommitted([conflict]));\n\t\t\t\tassert(\n\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\"a reused origin event id with different messages must reject\",\n\t\t\t\t);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassertEqual(\n\t\t\t\t\tstored.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"a conflicting retry must not append another receipt\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(stored[0], original),\n\t\t\t\t\t\"a conflicting retry must not replace the original receipt\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rejects an origin event id reused with a different source\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit(1);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tconst conflicts: ReadonlyArray<{\n\t\t\t\t\treadonly fact: \"aggregateId\" | \"aggregateType\";\n\t\t\t\t\treadonly candidate: CommandOutboxCommitCandidate<C>;\n\t\t\t\t}> = [\n\t\t\t\t\t{\n\t\t\t\t\t\tfact: \"aggregateId\",\n\t\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t\t...original,\n\t\t\t\t\t\t\torigin: {\n\t\t\t\t\t\t\t\t...original.origin,\n\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t...original.origin.source,\n\t\t\t\t\t\t\t\t\taggregateId: \"order-2\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfact: \"aggregateType\",\n\t\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t\t...original,\n\t\t\t\t\t\t\torigin: {\n\t\t\t\t\t\t\t\t...original.origin,\n\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t...original.origin.source,\n\t\t\t\t\t\t\t\t\taggregateType: \"Order\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tfor (const { fact, candidate } of conflicts) {\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.addCommitted([candidate]),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t`a reused origin event id with a different source.${fact} must reject`,\n\t\t\t\t\t);\n\t\t\t\t\tconst stored = await env.readAll();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(stored, [original]),\n\t\t\t\t\t\t`a source.${fact} conflict must leave the original receipt unchanged`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rejects an origin event id reused with a different position\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit(1);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tconst positions = [\n\t\t\t\t\t{ fact: \"aggregateVersion\", change: { aggregateVersion: 2 } },\n\t\t\t\t\t{ fact: \"commitSequence\", change: { commitSequence: 1 } },\n\t\t\t\t\t{ fact: \"commitSize\", change: { commitSize: 2 } },\n\t\t\t\t] as const;\n\t\t\t\tfor (const { fact, change } of positions) {\n\t\t\t\t\tconst conflict: CommandOutboxCommitCandidate<C> = {\n\t\t\t\t\t\t...original,\n\t\t\t\t\t\torigin: {\n\t\t\t\t\t\t\t...original.origin,\n\t\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\t\t...original.origin.position,\n\t\t\t\t\t\t\t\t...change,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.addCommitted([conflict]),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\t`a reused origin event id with a different position.${fact} must reject`,\n\t\t\t\t\t);\n\t\t\t\t\tconst stored = await env.readAll();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(stored, [original]),\n\t\t\t\t\t\t`a position.${fact} conflict must leave the original receipt unchanged`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rejects a conflicting batch atomically\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit(1);\n\t\t\t\tawait env.addCommitted([original]);\n\t\t\t\tconst newCommit = commit(2);\n\t\t\t\tconst conflictingOriginal = {\n\t\t\t\t\t...commit(1, [77]),\n\t\t\t\t\torigin: {\n\t\t\t\t\t\t...commit(1, [77]).origin,\n\t\t\t\t\t\teventId: original.origin.eventId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tassert(\n\t\t\t\t\t!deepEqual(conflictingOriginal.messages, original.messages),\n\t\t\t\t\t\"harness contract: createCommand must return distinct content \" +\n\t\t\t\t\t\t\"per seed, or the manufactured conflict is an exact retry\",\n\t\t\t\t);\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenv.addCommitted([newCommit, conflictingOriginal]),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\"a batch containing a conflicting origin must reject\",\n\t\t\t\t);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassertEqual(\n\t\t\t\t\tstored.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"a rejected batch must not leave its earlier new receipt behind\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(stored[0], original),\n\t\t\t\t\t\"a rejected batch must preserve the pre-existing receipt\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"retains command and commit input order\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst first = commit(1, [10, 11]);\n\t\t\t\tconst second = commit(2, [20, 21]);\n\t\t\t\tawait env.addCommitted([first, second]);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\tstored.map(({ origin }) => origin.eventId),\n\t\t\t\t\t\t[first.origin.eventId, second.origin.eventId],\n\t\t\t\t\t),\n\t\t\t\t\t\"commit receipts must retain input order\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\tstored.map(({ messages }) =>\n\t\t\t\t\t\t\tmessages.map(({ command }) => command),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tfirst.messages.map(({ command }) => command),\n\t\t\t\t\t\t\tsecond.messages.map(({ command }) => command),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t\t\"commands inside each receipt must retain mapper order\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"retains every position in a multi-event aggregate commit\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst first = commit(10);\n\t\t\t\tconst second = commit(11);\n\t\t\t\tconst commitSize = 2;\n\t\t\t\tconst aggregateVersion = 7;\n\t\t\t\tconst multiEventCommit: ReadonlyArray<CommandOutboxCommitCandidate<C>> =\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...first,\n\t\t\t\t\t\t\torigin: {\n\t\t\t\t\t\t\t\t...first.origin,\n\t\t\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\t\t\taggregateVersion,\n\t\t\t\t\t\t\t\t\tcommitSequence: 0,\n\t\t\t\t\t\t\t\t\tcommitSize,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...second,\n\t\t\t\t\t\t\torigin: {\n\t\t\t\t\t\t\t\t...second.origin,\n\t\t\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\t\t\taggregateVersion,\n\t\t\t\t\t\t\t\t\tcommitSequence: 1,\n\t\t\t\t\t\t\t\t\tcommitSize,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\tawait env.addCommitted(multiEventCommit);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(stored, multiEventCommit),\n\t\t\t\t\t\"a multi-event commit must retain its shared version, sequence, and size for every receipt\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"retains an empty command receipt and advances the source cursor\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst empty = commit(1, []);\n\t\t\t\tconst next = commit(2);\n\t\t\t\tawait env.addCommitted([empty]);\n\t\t\t\tawait env.addCommitted([next]);\n\t\t\t\tconst stored = await env.readAll();\n\t\t\t\tassertEqual(\n\t\t\t\t\tstored.length,\n\t\t\t\t\t2,\n\t\t\t\t\t\"an empty command batch must retain its source receipt\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tstored[0]?.messages.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"the retained empty receipt must contain no invented command\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\tstored.map(({ origin }) => origin.position.aggregateVersion),\n\t\t\t\t\t\t[1, 2],\n\t\t\t\t\t),\n\t\t\t\t\t\"the source cursor must advance through the empty receipt\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t];\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesRolledBackAdds\",\n\t\t\t\tsatisfiedBy: harness.providesRolledBackAdds === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a rolled-back add leaves no receipt or command behind\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.addRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesRolledBackAdds but the environment lacks addRolledBack\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env.addRolledBack([commit(1)]);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.readAll()).length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"a rolled-back transaction must persist no command receipt\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\treturn tests;\n}\n\nfunction message<C extends PublishedCommand>(\n\tcommitSeed: number,\n\tindex: number,\n\tcommand: C,\n): DurableCommandMessage<C> {\n\treturn {\n\t\tmessageId: `process-event-${commitSeed}:command:${index}`,\n\t\trecordedAt: \"2027-04-05T06:07:08.000Z\",\n\t\tdestination: \"participant.commands\",\n\t\tcommand,\n\t\tconversationId: \"checkout-order-1\",\n\t\tcausationId: `process-event-${commitSeed}`,\n\t};\n}\n","import type {\n\tDeadlineStore,\n\tDeadLetterDeadline,\n} from \"../deadlines/deadline-store\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tgatedContractTest,\n} from \"./contract-assertions\";\n\n/** One contract test; bind with `(test.skipped ? it.skip : it)(test.name, test.run)`. */\nexport type DeadlineStoreContractTest = ContractTest;\n\n/** The plain-data payload shape the suite round-trips. */\ninterface SuitePayload {\n\tkind: string;\n\tstep?: number;\n}\n\n/**\n * One isolated test environment: a fresh deadline store. The suite\n * creates one per test and tears it down afterwards.\n */\nexport interface DeadlineStoreContractEnvironment {\n\t/** The adapter under test. */\n\tstore: DeadlineStore<SuitePayload>;\n\n\t/**\n\t * Runs `work` (schedule/cancel calls) the way production does:\n\t * inside a transaction that COMMITS. For a non-transactional store\n\t * this simply invokes `work`.\n\t */\n\trun<R>(work: () => Promise<R>): Promise<R>;\n\n\t/**\n\t * Optional capability: runs `work` inside a transaction that ROLLS\n\t * BACK. Enables the rollback tests: a rolled-back schedule must not\n\t * leave a deadline behind (a ghost input for a state change that\n\t * never happened), and a rolled-back cancel must not have removed\n\t * one. Transactional adapters should always provide this.\n\t */\n\trunRolledBack?<R>(work: () => Promise<R>): Promise<R>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the deadline-store contract suite.\n * For SQL adapters, run against a real database (testcontainers or\n * equivalent): the rollback tests prove YOUR transaction wiring, and\n * schedule/cancel joining the write transaction is the port's central\n * correctness rule.\n */\nexport interface DeadlineStoreContractHarness {\n\tcreateEnvironment(): Promise<DeadlineStoreContractEnvironment>;\n\n\t/**\n\t * The adapter's attempt ceiling: how many `markFailed` reports move\n\t * a deadline to the dead-letter set. Must be at least 2 so the\n\t * attempts-surfacing test can observe a survivor.\n\t */\n\tfailuresToDeadLetter: number;\n\n\t/**\n\t * Declare `true` when environments provide {@link\n\t * DeadlineStoreContractEnvironment.runRolledBack}. Without it, the\n\t * rollback tests are marked skipped: the honest state of an\n\t * in-memory fake, and a loud gap for a transactional adapter.\n\t */\n\tprovidesRolledBackRuns?: boolean;\n\n\t/**\n\t * Declare `true` when the adapter's `due` CLAIMS the returned\n\t * records for competing pollers (lease, visibility timeout), as the\n\t * port sanctions. Tests that re-poll records an earlier poll\n\t * returned without resolving them (attempts surfacing, neighbor\n\t * flow after a dead-letter, successor visibility during a\n\t * reschedule race) assume a non-claiming read and are marked\n\t * skipped for claiming adapters; prove your claim/expiry semantics\n\t * in your own suite.\n\t */\n\tclaimsOnDue?: boolean;\n}\n\nconst at = (iso: string): Date => new Date(iso);\nconst T0 = \"2026-03-01T10:00:00.000Z\";\nconst T1 = \"2026-03-01T10:05:00.000Z\";\nconst T2 = \"2026-03-01T10:10:00.000Z\";\n\n/**\n * The deadline-store contract test suite: the proof that an adapter\n * delivers the schedule/cancel/due/acknowledge semantics the port\n * documents. Store semantics are an **adapter contract, not a kit\n * guarantee**; this suite is how an adapter demonstrates them.\n *\n * Framework-agnostic: bind with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport function createDeadlineStoreContractTests(\n\tharness: DeadlineStoreContractHarness,\n): DeadlineStoreContractTest[] {\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\tconst ceiling = harness.failuresToDeadLetter;\n\tif (!Number.isInteger(ceiling) || ceiling < 2) {\n\t\tthrow new Error(\n\t\t\t\"Contract violated: failuresToDeadLetter must be an integer >= 2; observing attempts on a pending deadline needs one that survives a failure\",\n\t\t);\n\t}\n\n\treturn [\n\t\t{\n\t\t\tname: \"a deadline is invisible before its due time and delivered from it onward\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"checkout-saga\",\n\t\t\t\t\t\tkey: \"order-1\",\n\t\t\t\t\t\tdueAt: at(T1),\n\t\t\t\t\t\tpayload: { kind: \"payment-timeout\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await env.store.due(at(T0), 10)).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"a deadline must not fire early\",\n\t\t\t\t);\n\t\t\t\tconst dueExactly = await env.store.due(at(T1), 10);\n\t\t\t\tassertEqual(\n\t\t\t\t\tdueExactly.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"a deadline is due AT its due time (dueAt <= now)\",\n\t\t\t\t);\n\t\t\t\tconst record = dueExactly[0];\n\t\t\t\tassert(record !== undefined, \"expected the due deadline\");\n\t\t\t\tassertEqual(record.scope, \"checkout-saga\", \"scope must round-trip\");\n\t\t\t\tassertEqual(record.key, \"order-1\", \"key must round-trip\");\n\t\t\t\tassertEqual(\n\t\t\t\t\trecord.dueAt.getTime(),\n\t\t\t\t\tat(T1).getTime(),\n\t\t\t\t\t\"dueAt must round-trip with millisecond fidelity\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(record.payload, { kind: \"payment-timeout\" }),\n\t\t\t\t\t\"the payload must round-trip as plain data\",\n\t\t\t\t);\n\t\t\t\tassertEqual(record.attempts, 0, \"a fresh deadline has no attempts\");\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"due returns earliest first and respects the limit\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async () => {\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"late\",\n\t\t\t\t\t\tdueAt: at(T2),\n\t\t\t\t\t\tpayload: { kind: \"late\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"early\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"early\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"middle\",\n\t\t\t\t\t\tdueAt: at(T1),\n\t\t\t\t\t\tpayload: { kind: \"middle\" },\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tconst firstPage = await env.store.due(at(T2), 2);\n\t\t\t\tassert(\n\t\t\t\t\tfirstPage.length >= 1 && firstPage.length <= 2,\n\t\t\t\t\t\"limit must bound the page: up to limit records, at least one while deadlines are due\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tfirstPage[0]?.key,\n\t\t\t\t\t\"early\",\n\t\t\t\t\t\"the earliest due deadline comes first\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"markDelivered consumes the deadline and is idempotent on unknown and repeated ids\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"x\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [record] = await env.store.due(at(T1), 10);\n\t\t\t\tassert(record !== undefined, \"expected a due deadline\");\n\t\t\t\tawait env.store.markDelivered([record.deliveryId]);\n\t\t\t\tawait env.store.markDelivered([record.deliveryId]);\n\t\t\t\tawait env.store.markDelivered([\"no-such-delivery-id\"]);\n\t\t\t\tassert(\n\t\t\t\t\t!(await env.store.due(at(T2), 10)).some(\n\t\t\t\t\t\t(d) => d.deliveryId === record.deliveryId,\n\t\t\t\t\t),\n\t\t\t\t\t\"a delivered deadline must never come back\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"cancel removes exactly the addressed deadline and tolerates unknown addresses\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async () => {\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"keep\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"keep\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"drop\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"drop\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.cancel(\"s\", \"drop\");\n\t\t\t\t\tawait env.store.cancel(\"s\", \"never-scheduled\");\n\t\t\t\t});\n\t\t\t\tconst due = await env.store.due(at(T1), 10);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\tdue.map((d) => d.key),\n\t\t\t\t\t\t[\"keep\"],\n\t\t\t\t\t),\n\t\t\t\t\t\"cancel must remove the addressed deadline and nothing else\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"addresses are isolated per scope\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async () => {\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"reservation-hold\",\n\t\t\t\t\t\tkey: \"id-1\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"hold\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\tscope: \"checkout-saga\",\n\t\t\t\t\t\tkey: \"id-1\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"timeout\" },\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.cancel(\"reservation-hold\", \"id-1\");\n\t\t\t\t});\n\t\t\t\tconst due = await env.store.due(at(T1), 10);\n\t\t\t\tassert(\n\t\t\t\t\tdue.length === 1 && due[0]?.scope === \"checkout-saga\",\n\t\t\t\t\t\"the same key under another scope is a different deadline\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t// The successor-visibility half of the race needs a re-poll while the\n\t\t// replaced incarnation is un-acked; an adapter claiming at address\n\t\t// granularity legitimately holds the address until the claim resolves.\n\t\tgatedContractTest(\n\t\t\t{ capability: \"non-claiming due\", satisfiedBy: !harness.claimsOnDue },\n\t\t\t{\n\t\t\t\tname: \"schedule on an occupied address replaces it, and a stale ack cannot consume the successor\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.run(() =>\n\t\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\t\tpayload: { kind: \"first\", step: 1 },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tconst [first] = await env.store.due(at(T1), 10);\n\t\t\t\t\tassert(first !== undefined, \"expected the first incarnation\");\n\n\t\t\t\t\t// Reschedule while the first incarnation is in flight.\n\t\t\t\t\tawait env.run(() =>\n\t\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\t\tdueAt: at(T1),\n\t\t\t\t\t\t\tpayload: { kind: \"second\", step: 2 },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\t// The late ack of the replaced incarnation must be a no-op.\n\t\t\t\t\tawait env.store.markDelivered([first.deliveryId]);\n\n\t\t\t\t\tconst due = await env.store.due(at(T2), 10);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tdue.length,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"exactly one pending deadline exists per address\",\n\t\t\t\t\t);\n\t\t\t\t\tconst successor = due[0];\n\t\t\t\t\tassert(successor !== undefined, \"expected the successor\");\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(successor.payload, { kind: \"second\", step: 2 }),\n\t\t\t\t\t\t\"the successor carries the rescheduled payload\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsuccessor.deliveryId !== first.deliveryId,\n\t\t\t\t\t\t\"a reschedule is a fresh incarnation with a fresh deliveryId\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t{\n\t\t\tname: \"after delivery the address is free again for a fresh schedule\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"first\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [first] = await env.store.due(at(T1), 10);\n\t\t\t\tassert(first !== undefined, \"expected a due deadline\");\n\t\t\t\tawait env.store.markDelivered([first.deliveryId]);\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T1),\n\t\t\t\t\t\tpayload: { kind: \"again\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst due = await env.store.due(at(T2), 10);\n\t\t\t\tassert(\n\t\t\t\t\tdue.length === 1 && deepEqual(due[0]?.payload, { kind: \"again\" }),\n\t\t\t\t\t\"a consumed address must accept a new deadline\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"the attempt ceiling dead-letters the deadline, visible in deadLetters with its attempt count\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"poison\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"poison\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [poison] = await env.store.due(at(T1), 1);\n\t\t\t\tassert(poison !== undefined, \"expected the due deadline\");\n\t\t\t\tlet transition: DeadLetterDeadline<SuitePayload> | undefined;\n\t\t\t\tfor (let i = 0; i < ceiling; i++) {\n\t\t\t\t\tconst current = await env.store.markFailed(\n\t\t\t\t\t\tpoison.deliveryId,\n\t\t\t\t\t\tnew Error(\"boom\"),\n\t\t\t\t\t);\n\t\t\t\t\tif (i < ceiling - 1) {\n\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\"markFailed must not report a dead-letter transition below the ceiling\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\ttransition = current;\n\t\t\t\t}\n\t\t\t\tassertEqual(\n\t\t\t\t\ttransition?.deliveryId,\n\t\t\t\t\tpoison.deliveryId,\n\t\t\t\t\t\"the ceiling-crossing markFailed call must return the exact dead-letter transition\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\ttransition?.attempts,\n\t\t\t\t\tceiling,\n\t\t\t\t\t\"the returned transition must carry the final attempt count\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.markFailed(poison.deliveryId, new Error(\"late\")),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"a late failure report must not repeat the dead-letter transition\",\n\t\t\t\t);\n\t\t\t\t// Membership, not count: dead-lettered is terminal for every\n\t\t\t\t// adapter, claiming or not.\n\t\t\t\tassert(\n\t\t\t\t\t!(await env.store.due(at(T2), 10)).some(\n\t\t\t\t\t\t(d) => d.deliveryId === poison.deliveryId,\n\t\t\t\t\t),\n\t\t\t\t\t\"a dead-lettered deadline must stop coming back\",\n\t\t\t\t);\n\t\t\t\tconst dead = await env.store.deadLetters();\n\t\t\t\tassert(\n\t\t\t\t\tdead.length === 1 && dead[0]?.attempts === ceiling,\n\t\t\t\t\t\"the dead-lettered deadline must appear in deadLetters() with its attempt count\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t// Observing attempts on a pending record, and a neighbor's continued\n\t\t// flow, both need re-polls of records an earlier poll returned\n\t\t// without resolving them; claiming adapters legitimately hold those\n\t\t// back until the claim expires.\n\t\tgatedContractTest(\n\t\t\t{ capability: \"non-claiming due\", satisfiedBy: !harness.claimsOnDue },\n\t\t\t{\n\t\t\t\tname: \"attempts surface on redelivery, and a poison deadline does not block its neighbors\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.run(async () => {\n\t\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\tkey: \"poison\",\n\t\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\t\tpayload: { kind: \"poison\" },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tawait env.store.schedule({\n\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\tkey: \"healthy\",\n\t\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\t\tpayload: { kind: \"healthy\" },\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tconst [poison] = await env.store.due(at(T1), 1);\n\t\t\t\t\tassert(poison !== undefined, \"expected the earliest due deadline\");\n\t\t\t\t\tawait env.store.markFailed(poison.deliveryId, new Error(\"boom\"));\n\t\t\t\t\tconst afterOne = await env.store.due(at(T1), 10);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tafterOne.find((d) => d.deliveryId === poison.deliveryId)?.attempts,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"attempts must be surfaced on the record after markFailed\",\n\t\t\t\t\t);\n\t\t\t\t\tfor (let i = 1; i < ceiling; i++) {\n\t\t\t\t\t\tawait env.store.markFailed(poison.deliveryId, new Error(\"boom\"));\n\t\t\t\t\t}\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(await env.store.due(at(T1), 10)).some((d) => d.key === \"healthy\"),\n\t\t\t\t\t\t\"deadlines carry no cross-address ordering; a dead-lettered neighbor must not block delivery\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t{\n\t\t\tname: \"two dead-lettered incarnations of one address are both kept and individually clearable\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"first\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [first] = await env.store.due(at(T1), 10);\n\t\t\t\tassert(first !== undefined, \"expected the first incarnation\");\n\t\t\t\tfor (let i = 0; i < ceiling; i++) {\n\t\t\t\t\tawait env.store.markFailed(first.deliveryId, new Error(\"boom\"));\n\t\t\t\t}\n\t\t\t\t// The dead letter freed the address; the process schedules a\n\t\t\t\t// fresh incarnation, and it dead-letters too.\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T1),\n\t\t\t\t\t\tpayload: { kind: \"second\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [second] = await env.store.due(at(T2), 10);\n\t\t\t\tassert(second !== undefined, \"expected the second incarnation\");\n\t\t\t\tfor (let i = 0; i < ceiling; i++) {\n\t\t\t\t\tawait env.store.markFailed(second.deliveryId, new Error(\"boom\"));\n\t\t\t\t}\n\t\t\t\tconst dead = await env.store.deadLetters();\n\t\t\t\tassert(\n\t\t\t\t\tdead.length === 2 &&\n\t\t\t\t\t\tdead.some((d) => d.deliveryId === first.deliveryId) &&\n\t\t\t\t\t\tdead.some((d) => d.deliveryId === second.deliveryId),\n\t\t\t\t\t\"dead letters are kept per incarnation; a later dead letter of the same address must not overwrite an earlier un-acked one\",\n\t\t\t\t);\n\t\t\t\tawait env.store.markDelivered([first.deliveryId]);\n\t\t\t\tconst remaining = await env.store.deadLetters();\n\t\t\t\tassert(\n\t\t\t\t\tremaining.length === 1 &&\n\t\t\t\t\t\tremaining[0]?.deliveryId === second.deliveryId,\n\t\t\t\t\t\"acknowledging one dead-lettered incarnation must not clear its sibling\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"late failure reports never resurrect or advance anything, and acking a dead letter clears it\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(() =>\n\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\tpayload: { kind: \"x\" },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst [record] = await env.store.due(at(T1), 10);\n\t\t\t\tassert(record !== undefined, \"expected a due deadline\");\n\t\t\t\tfor (let i = 0; i < ceiling; i++) {\n\t\t\t\t\tawait env.store.markFailed(record.deliveryId, new Error(\"boom\"));\n\t\t\t\t}\n\t\t\t\t// Late reports against a dead-lettered incarnation: no-ops.\n\t\t\t\tawait env.store.markFailed(record.deliveryId, new Error(\"late\"));\n\t\t\t\tawait env.store.markFailed(\"no-such-id\", new Error(\"unknown\"));\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await env.store.deadLetters()).length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"late or unknown failure reports must not change the dead-letter set\",\n\t\t\t\t);\n\t\t\t\t// Manual redelivery, then ack: the dead letter clears.\n\t\t\t\tawait env.store.markDelivered([record.deliveryId]);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await env.store.deadLetters()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"acking a dead-lettered deadline must clear it\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesRolledBackRuns\",\n\t\t\t\tsatisfiedBy: harness.providesRolledBackRuns === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a rolled-back schedule leaves no deadline behind\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.runRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesRolledBackRuns but the environment lacks runRolledBack\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env\n\t\t\t\t\t\t.runRolledBack(() =>\n\t\t\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\t\tkey: \"ghost\",\n\t\t\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\t\t\tpayload: { kind: \"ghost\" },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t// The rollback mechanism may surface as a rejection; the\n\t\t\t\t\t\t\t// contract under test is the store state afterwards.\n\t\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.store.due(at(T2), 10)).length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"a deadline from a rolled-back transaction is a ghost input and must not exist\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesRolledBackRuns\",\n\t\t\t\tsatisfiedBy: harness.providesRolledBackRuns === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a rolled-back cancel leaves the deadline in place\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.runRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesRolledBackRuns but the environment lacks runRolledBack\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env.run(() =>\n\t\t\t\t\t\tenv.store.schedule({\n\t\t\t\t\t\t\tscope: \"s\",\n\t\t\t\t\t\t\tkey: \"k\",\n\t\t\t\t\t\t\tdueAt: at(T0),\n\t\t\t\t\t\t\tpayload: { kind: \"x\" },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tawait env\n\t\t\t\t\t\t.runRolledBack(() => env.store.cancel(\"s\", \"k\"))\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t// See above: only the state afterwards is the contract.\n\t\t\t\t\t\t});\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.store.due(at(T1), 10)).length,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"a cancel from a rolled-back transaction must not have removed the deadline\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t];\n}\n","import type { IAggregateRoot } from \"../aggregate/aggregate\";\nimport type { AggregateAddress } from \"../aggregate/aggregate-address\";\nimport {\n\ttype AnyDomainEvent,\n\ttype PendingDomainEvent,\n} from \"../aggregate/domain-event\";\nimport type { Id } from \"../core/id\";\nimport type { CommittedDomainEvent } from \"../events/ports\";\nimport type { ReadStreamOptions, StreamReadResult } from \"../repo/event-store\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertChainContainsKitError,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n\tdescribeError,\n\tgatedContractTest,\n\tloadAggregateOrFail,\n\tmintedPendingEventIds,\n\tsortedCommittedEventIds,\n} from \"./contract-assertions\";\n\n/** Event-sourced repositories normally expose no physical removal. */\nexport interface EsContractRepository<\n\tTAggregate extends IAggregateRoot<Id<string>, AnyDomainEvent>,\n> {\n\tfindById(id: TAggregate[\"id\"]): Promise<TAggregate | undefined>;\n\tadd(aggregate: TAggregate): void;\n\tupdate(aggregate: TAggregate): void;\n}\n\nexport interface EsRepositoryContractEnvironment<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n> {\n\trun<R>(\n\t\twork: (context: {\n\t\t\trepository: EsContractRepository<TAggregate>;\n\t\t}) => Promise<R>,\n\t): Promise<R>;\n\tcommittedOutboxEvents(): Promise<ReadonlyArray<CommittedDomainEvent<TEvent>>>;\n\tfailNextOutboxWrite(error: Error): void;\n\tcommittedStreamEvents(\n\t\tstream: AggregateAddress<TAggregate[\"id\"]>,\n\t\toptions: ReadStreamOptions,\n\t): Promise<StreamReadResult<TEvent>>;\n\tteardown?(): Promise<void>;\n}\n\nexport interface EsRepositoryContractHarness<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n> {\n\tcreateEnvironment(): Promise<\n\t\tEsRepositoryContractEnvironment<TAggregate, TEvent>\n\t>;\n\t/** Fresh aggregate with exactly one recorded creation event. */\n\tcreateAggregate(): TAggregate;\n\tcreateAggregateWithId?(id: TAggregate[\"id\"]): TAggregate;\n\tstreamKeyFor(id: TAggregate[\"id\"]): AggregateAddress<TAggregate[\"id\"]>;\n\t/** Applies exactly one event and advances the aggregate version by one. */\n\tmutate(aggregate: TAggregate): void;\n\tsnapshotState?(aggregate: TAggregate): unknown;\n}\n\nexport type EsRepositoryContractTest = ContractTest;\n\n/**\n * Contract suite for event-stream adapters using v3 Unit-of-Work receipts.\n *\n * `add` and `update` register intent only. At commit, the adapter appends the\n * receipt's exact event batch with the Unit of Work's expected version, in the\n * same transaction as the outbox. `run` must support overlapping calls so the\n * mandatory stale-writer proof exercises a real stream OCC predicate.\n */\nexport function createEsRepositoryContractTests<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n>(\n\tharness: EsRepositoryContractHarness<TAggregate, TEvent>,\n): EsRepositoryContractTest[] {\n\ttype Environment = EsRepositoryContractEnvironment<TAggregate, TEvent>;\n\tconst inEnvironment = bindContractEnvironment(() =>\n\t\tharness.createEnvironment(),\n\t);\n\tconst readAll = { limit: 100 } as const;\n\tconst createAggregateWithId = harness.createAggregateWithId;\n\tconst snapshotState = harness.snapshotState;\n\n\tconst load = (\n\t\trepository: EsContractRepository<TAggregate>,\n\t\tid: TAggregate[\"id\"],\n\t): Promise<TAggregate> =>\n\t\tloadAggregateOrFail(\n\t\t\trepository,\n\t\t\tid,\n\t\t\t\"the stream was not appended or replayed correctly\",\n\t\t);\n\tconst streamFor = (id: TAggregate[\"id\"]) => harness.streamKeyFor(id);\n\t// Pre-flush identities: the in-memory batch must be recorded (minted)\n\t// before the adapter may flush it.\n\tconst recordedIds = (\n\t\tevents: ReadonlyArray<PendingDomainEvent<TEvent>>,\n\t): string[] =>\n\t\tmintedPendingEventIds(events, \"pending events must be recorded before flush\");\n\t// Read-back identities: adapters may serialize committed events to rows\n\t// and decode them on read. A decoded event does not carry the in-memory\n\t// mint brand, and no contract demands re-minting on read, so only the\n\t// persisted identity is asserted here.\n\tconst ids = (events: ReadonlyArray<TEvent>): string[] =>\n\t\tevents.map((event) => {\n\t\t\tassert(\n\t\t\t\ttypeof event.eventId === \"string\" && event.eventId.length > 0,\n\t\t\t\t\"committed events must carry their persisted eventId\",\n\t\t\t);\n\t\t\treturn event.eventId;\n\t\t});\n\tconst outboxIds = (\n\t\tevents: ReadonlyArray<CommittedDomainEvent<TEvent>>,\n\t): string[] => sortedCommittedEventIds(events);\n\n\tasync function seed(environment: Environment): Promise<TAggregate> {\n\t\tconst aggregate = harness.createAggregate();\n\t\tawait environment.run(async ({ repository }) => {\n\t\t\trepository.add(aggregate);\n\t\t});\n\t\treturn aggregate;\n\t}\n\n\tconst tests: EsRepositoryContractTest[] = [\n\t\t{\n\t\t\tname: \"add appends the exact creation batch to stream and outbox\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tconst expectedIds = recordedIds(aggregate.pendingEvents);\n\t\t\t\tassertEqual(\n\t\t\t\t\texpectedIds.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"createAggregate must record exactly one creation event\",\n\t\t\t\t);\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\t\t\t\tconst stream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tstream.exists && deepEqual(ids(stream.events), expectedIds),\n\t\t\t\t\t\"the stream must contain exactly the registered creation batch\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\toutboxIds(await environment.committedOutboxEvents()),\n\t\t\t\t\t\t[...expectedIds].sort(),\n\t\t\t\t\t),\n\t\t\t\t\t\"the outbox must contain the same exact creation batch\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\taggregate.pendingEvents.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"successful commit must acknowledge the creation batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"MANDATORY stale append: writer B conflicts after writer A commits and appends no prefix\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\tlet loaded!: () => void;\n\t\t\t\tconst bLoaded = new Promise<void>((resolve) => {\n\t\t\t\t\tloaded = resolve;\n\t\t\t\t});\n\t\t\t\tlet release!: () => void;\n\t\t\t\tconst mayAppend = new Promise<void>((resolve) => {\n\t\t\t\t\trelease = resolve;\n\t\t\t\t});\n\t\t\t\tconst writerB = environment.run(async ({ repository }) => {\n\t\t\t\t\tconst stale = await load(repository, seeded.id);\n\t\t\t\t\tloaded();\n\t\t\t\t\tawait mayAppend;\n\t\t\t\t\tharness.mutate(stale);\n\t\t\t\t\tharness.mutate(stale);\n\t\t\t\t\trepository.update(stale);\n\t\t\t\t});\n\t\t\t\tawait bLoaded;\n\n\t\t\t\tconst winner = await environment.run(async ({ repository }) => {\n\t\t\t\t\tconst current = await load(repository, seeded.id);\n\t\t\t\t\tharness.mutate(current);\n\t\t\t\t\trepository.update(current);\n\t\t\t\t\treturn current;\n\t\t\t\t});\n\t\t\t\tconst streamAfterWinner = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(seeded.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\trelease();\n\t\t\t\tconst rejection = await captureRejection(writerB);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"CONCURRENCY_CONFLICT\"],\n\t\t\t\t\t`stale append must reject with ConcurrencyConflictError; got ${describeError(rejection)}`,\n\t\t\t\t);\n\t\t\t\tconst finalStream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(seeded.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tfinalStream.exists &&\n\t\t\t\t\t\tdeepEqual(ids(finalStream.events), ids(streamAfterWinner.events)),\n\t\t\t\t\t\"a rejected multi-event append must leave no prefix in the stream\",\n\t\t\t\t);\n\t\t\t\tconst reloaded = await environment.run(({ repository }) =>\n\t\t\t\t\tload(repository, seeded.id),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\treloaded.version,\n\t\t\t\t\twinner.version,\n\t\t\t\t\t\"replay must end at the winning stream version\",\n\t\t\t\t);\n\t\t\t\tif (snapshotState) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\tsnapshotState.call(harness, reloaded),\n\t\t\t\t\t\t\tsnapshotState.call(harness, winner),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"replay must fold to writer A's state\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"replay preserves emission order and returns no pending events\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst expectedIds = recordedIds(aggregate.pendingEvents);\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\t\t\t\tconst reloaded = await environment.run(({ repository }) =>\n\t\t\t\t\tload(repository, aggregate.id),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\treloaded.version,\n\t\t\t\t\texpectedIds.length,\n\t\t\t\t\t\"event-sourced version must equal the folded event count\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\treloaded.pendingEvents.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"replay must not re-record historical events\",\n\t\t\t\t);\n\t\t\t\tif (snapshotState) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\tsnapshotState.call(harness, reloaded),\n\t\t\t\t\t\t\tsnapshotState.call(harness, aggregate),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"replay must fold to the same state in emission order\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst stream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tstream.exists && deepEqual(ids(stream.events), expectedIds),\n\t\t\t\t\t\"the committed stream must preserve emission order\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rollback leaves stream and outbox absent and acknowledges nothing\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst pending = [...aggregate.pendingEvents];\n\t\t\t\tawait captureRejection(\n\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t\t\tthrow new Error(\"rollback probe\");\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst stream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(!stream.exists, \"rollback must leave the stream absent\");\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await environment.committedOutboxEvents()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"rollback must leave the outbox empty\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(aggregate.pendingEvents, pending),\n\t\t\t\t\t\"rollback must retain the exact pending batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"retrying the same never-persisted instance after rollback creates the full stream\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst expectedIds = recordedIds(aggregate.pendingEvents);\n\t\t\t\tawait captureRejection(\n\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t\t\tthrow new Error(\"rollback probe\");\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// The documented retry carve-out: a never-persisted instance has\n\t\t\t\t// no row or stream to reload, so the caller re-adds the SAME\n\t\t\t\t// instance with its retained pending batch.\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\t\t\t\tconst stream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tstream.exists && deepEqual(ids(stream.events), expectedIds),\n\t\t\t\t\t\"the retried add must create the stream with the full pending history\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\taggregate.pendingEvents.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"the successful retry must acknowledge the whole batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"outbox failure rolls the already-appended stream batch back\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tconst pending = [...aggregate.pendingEvents];\n\t\t\t\tenvironment.failNextOutboxWrite(new Error(\"outbox failure probe\"));\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tassert(rejection !== undefined, \"the outbox failure must reject\");\n\t\t\t\tconst stream = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(!stream.exists, \"stream append must roll back with the outbox\");\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await environment.committedOutboxEvents()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"failed outbox write must commit no envelope\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(aggregate.pendingEvents, pending),\n\t\t\t\t\t\"failed commit must acknowledge none of the event batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"read windows preserve absence, actual head, and point-in-time bounds\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst missingAggregate = harness.createAggregate();\n\t\t\t\tconst missing = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(missingAggregate.id),\n\t\t\t\t\treadAll,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\t!missing.exists && missing.lastVersion === 0,\n\t\t\t\t\t\"a missing stream must report exists=false and head 0\",\n\t\t\t\t);\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\t\t\t\tconst afterOne = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\t{ limit: 100, fromVersion: 1 },\n\t\t\t\t);\n\t\t\t\tconst asOfTwo = await environment.committedStreamEvents(\n\t\t\t\t\tstreamFor(aggregate.id),\n\t\t\t\t\t{ limit: 100, toVersion: 2 },\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tafterOne.exists &&\n\t\t\t\t\t\tafterOne.lastVersion === 3 &&\n\t\t\t\t\t\tafterOne.events.length === 2,\n\t\t\t\t\t\"fromVersion is exclusive and preserves the actual stream head\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tasOfTwo.exists &&\n\t\t\t\t\t\tasOfTwo.lastVersion === 3 &&\n\t\t\t\t\t\tasOfTwo.events.length === 2,\n\t\t\t\t\t\"toVersion is inclusive and preserves the actual stream head\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"identity map returns one replayed instance per Unit of Work\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\tconst first = await repository.findById(seeded.id);\n\t\t\t\t\tconst second = await repository.findById(seeded.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tfirst !== undefined && first === second,\n\t\t\t\t\t\t\"repeated stream loads must return the same tracked instance\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}),\n\t\t},\n\t];\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"createAggregateWithId\",\n\t\t\t\tsatisfiedBy: Boolean(createAggregateWithId),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"duplicate add conflicts and leaves the existing stream untouched\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tassert(createAggregateWithId !== undefined, \"capability gate\");\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\tconst before = await environment.committedStreamEvents(\n\t\t\t\t\t\tstreamFor(seeded.id),\n\t\t\t\t\t\treadAll,\n\t\t\t\t\t);\n\t\t\t\t\tconst duplicate = createAggregateWithId.call(harness, seeded.id);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\t\trepository.add(duplicate);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"CONCURRENCY_CONFLICT\", \"DUPLICATE_AGGREGATE\"],\n\t\t\t\t\t\t`duplicate stream creation must reject with a mapped kit error; got ${describeError(rejection)}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst after = await environment.committedStreamEvents(\n\t\t\t\t\t\tstreamFor(seeded.id),\n\t\t\t\t\t\treadAll,\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(ids(after.events), ids(before.events)),\n\t\t\t\t\t\t\"duplicate add must not modify the existing stream\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\treturn tests;\n}\n","import type { AggregateAddress } from \"../aggregate/aggregate-address\";\nimport type { AnyDomainEvent } from \"../aggregate/domain-event\";\nimport type { EventStore } from \"../repo/event-store\";\nimport {\n\tassert,\n\tassertChainContainsKitError,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n} from \"./contract-assertions\";\n\n/** One named contract test for an EventStore adapter. */\nexport type EventStoreContractTest = ContractTest;\n\n/** One isolated adapter instance. The suite creates one per test. */\nexport interface EventStoreContractEnvironment<Evt extends AnyDomainEvent> {\n\treadonly store: EventStore<Evt>;\n\tteardown?(): Promise<void>;\n}\n\n/**\n * Inputs needed to prove the EventStore's observable port contract.\n *\n * `createCollidingStreamKeys` must return two valid stream keys with the same\n * raw aggregate id and different aggregate types. `createEvent` must return an\n * event addressed to the supplied key; different sequence values must produce\n * different event ids.\n */\nexport interface EventStoreContractHarness<Evt extends AnyDomainEvent> {\n\tcreateEnvironment(): Promise<EventStoreContractEnvironment<Evt>>;\n\tcreateCollidingStreamKeys(): readonly [AggregateAddress, AggregateAddress];\n\tcreateEvent(stream: AggregateAddress, sequence: number): Evt;\n}\n\n/**\n * Reusable proof of an EventStore adapter's portable semantics: qualified\n * value identity, ordered reads and slicing, OCC error mapping and atomicity,\n * no-op empty appends, and detached return arrays. Physical-position\n * corruption needs adapter-specific fixture support and is tested there.\n */\nexport function createEventStoreContractTests<Evt extends AnyDomainEvent>(\n\tharness: EventStoreContractHarness<Evt>,\n): EventStoreContractTest[] {\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\tconst fixtureRead = { limit: 100 } as const;\n\tconst hasSameEventIds = (\n\t\tactual: ReadonlyArray<Evt>,\n\t\texpected: ReadonlyArray<Evt>,\n\t): boolean =>\n\t\tactual.length === expected.length &&\n\t\tactual.every((event, index) => event.eventId === expected[index]?.eventId);\n\n\treturn [\n\t\t{\n\t\t\tname: \"unknown stream: read reports explicit absence at version zero\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst missing = await store.readStream({ ...firstKey }, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\t!missing.exists &&\n\t\t\t\t\t\tmissing.lastVersion === 0 &&\n\t\t\t\t\t\tmissing.events.length === 0,\n\t\t\t\t\t\"an unknown qualified stream must return the explicit missing state\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"empty append: no version check and no stream creation\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tawait store.append(firstKey, [], { expectedVersion: 999 });\n\t\t\t\tconst event = harness.createEvent(firstKey, 1);\n\t\t\t\tawait store.append({ ...firstKey }, [event], { expectedVersion: 0 });\n\t\t\t\tconst stored = await store.readStream(firstKey, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\tstored.exists &&\n\t\t\t\t\t\tstored.lastVersion === 1 &&\n\t\t\t\t\t\tstored.events.length === 1 &&\n\t\t\t\t\t\tstored.events[0]?.eventId === event.eventId,\n\t\t\t\t\t\"an empty append must not check OCC or create an empty stream\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"qualified stream key: equal aggregate ids remain isolated by aggregate type\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey, secondKey] = harness.createCollidingStreamKeys();\n\t\t\t\tassert(\n\t\t\t\t\tfirstKey.aggregateId === secondKey.aggregateId,\n\t\t\t\t\t\"createCollidingStreamKeys must return equal raw aggregate ids\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tfirstKey.aggregateType !== secondKey.aggregateType,\n\t\t\t\t\t\"createCollidingStreamKeys must return different aggregate types\",\n\t\t\t\t);\n\n\t\t\t\tconst firstEvent = harness.createEvent(firstKey, 1);\n\t\t\t\tconst secondEvent = harness.createEvent(secondKey, 2);\n\t\t\t\tassert(\n\t\t\t\t\tfirstEvent.eventId !== secondEvent.eventId,\n\t\t\t\t\t\"createEvent must produce different event ids for different sequence values\",\n\t\t\t\t);\n\n\t\t\t\tawait store.append(firstKey, [firstEvent], { expectedVersion: 0 });\n\t\t\t\tawait store.append(secondKey, [secondEvent], { expectedVersion: 0 });\n\n\t\t\t\tconst firstStream = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\tfixtureRead,\n\t\t\t\t);\n\t\t\t\tconst secondStream = await store.readStream(\n\t\t\t\t\t{ ...secondKey },\n\t\t\t\t\tfixtureRead,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tfirstStream.exists &&\n\t\t\t\t\t\tfirstStream.events.length === 1 &&\n\t\t\t\t\t\tfirstStream.events[0]?.eventId === firstEvent.eventId,\n\t\t\t\t\t\"the first aggregate type must retain only its own event; key objects are value addresses, not identity tokens\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tsecondStream.exists &&\n\t\t\t\t\t\tsecondStream.events.length === 1 &&\n\t\t\t\t\t\tsecondStream.events[0]?.eventId === secondEvent.eventId,\n\t\t\t\t\t\"the second aggregate type must retain only its own event when the raw id collides\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"append/read: event order and fromVersion slicing are preserved\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst events = [1, 2, 3].map((sequence) =>\n\t\t\t\t\tharness.createEvent(firstKey, sequence),\n\t\t\t\t);\n\t\t\t\tawait store.append(firstKey, events, { expectedVersion: 0 });\n\t\t\t\tconst whole = await store.readStream({ ...firstKey }, fixtureRead);\n\t\t\t\tconst afterTwo = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{\n\t\t\t\t\t\t...fixtureRead,\n\t\t\t\t\t\tfromVersion: 2,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\twhole.exists &&\n\t\t\t\t\t\twhole.lastVersion === 3 &&\n\t\t\t\t\t\thasSameEventIds(whole.events, events),\n\t\t\t\t\t\"reads must preserve append order\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tafterTwo.exists &&\n\t\t\t\t\t\tafterTwo.lastVersion === 3 &&\n\t\t\t\t\t\tafterTwo.events.length === 1 &&\n\t\t\t\t\t\tafterTwo.events[0]?.eventId === events[2]?.eventId,\n\t\t\t\t\t\"fromVersion 2 must return exactly the events after the first two positions\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"paged read: limit bounds every page and fromVersion continues without gaps or duplicates\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst events = [1, 2, 3, 4, 5].map((sequence) =>\n\t\t\t\t\tharness.createEvent(firstKey, sequence),\n\t\t\t\t);\n\t\t\t\tawait store.append(firstKey, events, { expectedVersion: 0 });\n\n\t\t\t\tconst collected: Evt[] = [];\n\t\t\t\tlet cursor = 0;\n\t\t\t\tlet targetHead: number | undefined;\n\t\t\t\tfor (let attempt = 0; attempt < events.length; attempt += 1) {\n\t\t\t\t\tconst page = await store.readStream(\n\t\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfromVersion: cursor,\n\t\t\t\t\t\t\tlimit: 2,\n\t\t\t\t\t\t\t...(targetHead === undefined ? {} : { toVersion: targetHead }),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpage.exists,\n\t\t\t\t\t\t\"a paged read of an existing stream must retain existence\",\n\t\t\t\t\t);\n\t\t\t\t\ttargetHead ??= page.lastVersion;\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpage.lastVersion >= targetHead,\n\t\t\t\t\t\t\"lastVersion must keep reporting at least the head pinned by the first page\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpage.events.length > 0 && page.events.length <= 2,\n\t\t\t\t\t\t\"an unread page must make progress without exceeding the requested limit\",\n\t\t\t\t\t);\n\t\t\t\t\tcollected.push(...page.events);\n\t\t\t\t\tcursor += page.events.length;\n\t\t\t\t\tif (cursor >= targetHead) break;\n\t\t\t\t}\n\n\t\t\t\tassert(\n\t\t\t\t\ttargetHead === events.length && cursor === targetHead,\n\t\t\t\t\t\"following fromVersion by each actual page length must reach the pinned head\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\thasSameEventIds(collected, events),\n\t\t\t\t\t\"paged continuation must reproduce append order without gaps or duplicates\",\n\t\t\t\t);\n\t\t\t\tconst atEnd = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ fromVersion: cursor, toVersion: targetHead, limit: 2 },\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tatEnd.exists && atEnd.events.length === 0,\n\t\t\t\t\t\"continuing at the pinned head must return an existing empty page\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"read options: invalid limits and stream positions fail loudly\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst invalidOptions: unknown[] = [\n\t\t\t\t\t{},\n\t\t\t\t\t{ limit: 0 },\n\t\t\t\t\t{ limit: 1.5 },\n\t\t\t\t\t{ limit: Number.MAX_SAFE_INTEGER + 1 },\n\t\t\t\t\t{ limit: 1, fromVersion: -1 },\n\t\t\t\t\t{ limit: 1, fromVersion: 1.5 },\n\t\t\t\t\t{ limit: 1, fromVersion: Number.MAX_SAFE_INTEGER + 1 },\n\t\t\t\t\t{ limit: 1, toVersion: -1 },\n\t\t\t\t\t{ limit: 1, toVersion: 1.5 },\n\t\t\t\t\t{ limit: 1, toVersion: Number.MAX_SAFE_INTEGER + 1 },\n\t\t\t\t];\n\n\t\t\t\tfor (const options of invalidOptions) {\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tstore.readStream(firstKey, options as never),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trejection instanceof RangeError,\n\t\t\t\t\t\t\"invalid read bounds must reject with RangeError before querying the stream\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"bounded read: toVersion is inclusive while lastVersion remains the actual head\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst events = [1, 2, 3, 4].map((sequence) =>\n\t\t\t\t\tharness.createEvent(firstKey, sequence),\n\t\t\t\t);\n\t\t\t\tawait store.append(firstKey, events, { expectedVersion: 0 });\n\n\t\t\t\tconst bounded = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ ...fixtureRead, fromVersion: 1, toVersion: 3 },\n\t\t\t\t);\n\n\t\t\t\tassert(\n\t\t\t\t\tbounded.exists &&\n\t\t\t\t\t\tbounded.lastVersion === 4 &&\n\t\t\t\t\t\thasSameEventIds(bounded.events, events.slice(1, 3)),\n\t\t\t\t\t\"(fromVersion, toVersion] must include positions 2 and 3 while lastVersion reports the actual head at 4\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"bounded read edges: zero, beyond-head, and inverted ranges are empty or clamped\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst events = [1, 2, 3].map((sequence) =>\n\t\t\t\t\tharness.createEvent(firstKey, sequence),\n\t\t\t\t);\n\t\t\t\tawait store.append(firstKey, events, { expectedVersion: 0 });\n\n\t\t\t\tconst atZero = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ ...fixtureRead, toVersion: 0 },\n\t\t\t\t);\n\t\t\t\tconst beyondHead = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ ...fixtureRead, toVersion: 99 },\n\t\t\t\t);\n\t\t\t\tconst inverted = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ ...fixtureRead, fromVersion: 2, toVersion: 1 },\n\t\t\t\t);\n\t\t\t\tconst equalBounds = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{ ...fixtureRead, fromVersion: 2, toVersion: 2 },\n\t\t\t\t);\n\n\t\t\t\tassert(\n\t\t\t\t\tatZero.exists &&\n\t\t\t\t\t\tatZero.lastVersion === 3 &&\n\t\t\t\t\t\tatZero.events.length === 0,\n\t\t\t\t\t\"toVersion=0 must return an existing empty window with the actual head\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tbeyondHead.exists &&\n\t\t\t\t\t\tbeyondHead.lastVersion === 3 &&\n\t\t\t\t\t\thasSameEventIds(beyondHead.events, events),\n\t\t\t\t\t\"toVersion beyond the head must clamp to the actual stream head\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tinverted.exists &&\n\t\t\t\t\t\tinverted.lastVersion === 3 &&\n\t\t\t\t\t\tinverted.events.length === 0 &&\n\t\t\t\t\t\tequalBounds.exists &&\n\t\t\t\t\t\tequalBounds.lastVersion === 3 &&\n\t\t\t\t\t\tequalBounds.events.length === 0,\n\t\t\t\t\t\"fromVersion >= toVersion describes an empty interval and must not throw\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"read state: empty and beyond-head windows retain existence and the actual stream head\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tawait store.append(\n\t\t\t\t\tfirstKey,\n\t\t\t\t\t[harness.createEvent(firstKey, 4), harness.createEvent(firstKey, 5)],\n\t\t\t\t\t{ expectedVersion: 0 },\n\t\t\t\t);\n\n\t\t\t\tconst atHead = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{\n\t\t\t\t\t\t...fixtureRead,\n\t\t\t\t\t\tfromVersion: 2,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst beyondHead = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{\n\t\t\t\t\t\t...fixtureRead,\n\t\t\t\t\t\tfromVersion: 99,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tfor (const result of [atHead, beyondHead]) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tresult.exists &&\n\t\t\t\t\t\t\tresult.lastVersion === 2 &&\n\t\t\t\t\t\t\tresult.events.length === 0,\n\t\t\t\t\t\t\"an empty read window must retain stream existence and report the actual head, even when fromVersion is beyond it\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"qualified fromVersion: slicing one type cannot observe a colliding raw id\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey, secondKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst firstEvents = [10, 11, 12].map((sequence) =>\n\t\t\t\t\tharness.createEvent(firstKey, sequence),\n\t\t\t\t);\n\t\t\t\tconst secondEvents = [20, 21].map((sequence) =>\n\t\t\t\t\tharness.createEvent(secondKey, sequence),\n\t\t\t\t);\n\t\t\t\tawait store.append(firstKey, firstEvents, { expectedVersion: 0 });\n\t\t\t\tawait store.append(secondKey, secondEvents, { expectedVersion: 0 });\n\t\t\t\tconst firstTail = await store.readStream(\n\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t{\n\t\t\t\t\t\t...fixtureRead,\n\t\t\t\t\t\tfromVersion: 1,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst secondTail = await store.readStream(\n\t\t\t\t\t{ ...secondKey },\n\t\t\t\t\t{\n\t\t\t\t\t\t...fixtureRead,\n\t\t\t\t\t\tfromVersion: 1,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tfirstTail.exists &&\n\t\t\t\t\t\tfirstTail.lastVersion === 3 &&\n\t\t\t\t\t\tfirstTail.events.length === 2 &&\n\t\t\t\t\t\tfirstTail.events[0]?.eventId === firstEvents[1]?.eventId &&\n\t\t\t\t\t\tfirstTail.events[1]?.eventId === firstEvents[2]?.eventId,\n\t\t\t\t\t\"fromVersion must slice only the requested aggregate type's stream\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tsecondTail.exists &&\n\t\t\t\t\t\tsecondTail.lastVersion === 2 &&\n\t\t\t\t\t\tsecondTail.events.length === 1 &&\n\t\t\t\t\t\tsecondTail.events[0]?.eventId === secondEvents[1]?.eventId,\n\t\t\t\t\t\"a colliding raw id under another type must retain its independent version window\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"OCC: a rejected multi-event append is atomic and maps to ConcurrencyConflictError\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst seeded = [\n\t\t\t\t\tharness.createEvent(firstKey, 30),\n\t\t\t\t\tharness.createEvent(firstKey, 31),\n\t\t\t\t];\n\t\t\t\tawait store.append(firstKey, seeded, { expectedVersion: 0 });\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tstore.append(\n\t\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tharness.createEvent(firstKey, 32),\n\t\t\t\t\t\t\tharness.createEvent(firstKey, 33),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{ expectedVersion: 1 },\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"CONCURRENCY_CONFLICT\"],\n\t\t\t\t\t\"a stale append must map the adapter conflict to ConcurrencyConflictError\",\n\t\t\t\t);\n\t\t\t\tconst stored = await store.readStream(firstKey, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\tstored.exists &&\n\t\t\t\t\t\tstored.lastVersion === 2 &&\n\t\t\t\t\t\tstored.events.length === 2 &&\n\t\t\t\t\t\tstored.events[0]?.eventId === seeded[0]?.eventId &&\n\t\t\t\t\t\tstored.events[1]?.eventId === seeded[1]?.eventId,\n\t\t\t\t\t\"a rejected multi-event append must leave the stream untouched\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"OCC: duplicate create is rejected atomically with a sanctioned kit error\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst seeded = harness.createEvent(firstKey, 50);\n\t\t\t\tawait store.append(firstKey, [seeded], { expectedVersion: 0 });\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tstore.append(\n\t\t\t\t\t\t{ ...firstKey },\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tharness.createEvent(firstKey, 51),\n\t\t\t\t\t\t\tharness.createEvent(firstKey, 52),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{ expectedVersion: 0 },\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"CONCURRENCY_CONFLICT\", \"DUPLICATE_AGGREGATE\"],\n\t\t\t\t\t\"a duplicate create must map to ConcurrencyConflictError or the sanctioned DuplicateAggregateError\",\n\t\t\t\t);\n\t\t\t\tconst stored = await store.readStream(firstKey, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\tstored.exists &&\n\t\t\t\t\t\tstored.lastVersion === 1 &&\n\t\t\t\t\t\tstored.events.length === 1 &&\n\t\t\t\t\t\tstored.events[0]?.eventId === seeded.eventId,\n\t\t\t\t\t\"a rejected duplicate-create batch must leave the existing stream untouched\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"OCC: an expectedVersion ahead of an unknown stream conflicts without creating it\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tstore.append(firstKey, [harness.createEvent(firstKey, 60)], {\n\t\t\t\t\t\texpectedVersion: 3,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"CONCURRENCY_CONFLICT\"],\n\t\t\t\t\t\"an expectedVersion ahead of the stream must map to ConcurrencyConflictError\",\n\t\t\t\t);\n\t\t\t\tconst first = harness.createEvent(firstKey, 61);\n\t\t\t\tawait store.append({ ...firstKey }, [first], { expectedVersion: 0 });\n\t\t\t\tconst stored = await store.readStream(firstKey, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\tstored.exists &&\n\t\t\t\t\t\tstored.lastVersion === 1 &&\n\t\t\t\t\t\tstored.events.length === 1 &&\n\t\t\t\t\t\tstored.events[0]?.eventId === first.eventId,\n\t\t\t\t\t\"the rejected append must not leave an empty stream or partial events behind\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"read ownership: a mutation attempt cannot mutate the stream\",\n\t\t\trun: inEnv(async ({ store }) => {\n\t\t\t\tconst [firstKey] = harness.createCollidingStreamKeys();\n\t\t\t\tconst seeded = harness.createEvent(firstKey, 40);\n\t\t\t\tawait store.append(firstKey, [seeded], { expectedVersion: 0 });\n\t\t\t\tconst callerOwned = (await store.readStream(firstKey, fixtureRead))\n\t\t\t\t\t.events as Evt[];\n\t\t\t\ttry {\n\t\t\t\t\tcallerOwned.push(harness.createEvent(firstKey, 41));\n\t\t\t\t} catch {\n\t\t\t\t\t// A detached frozen array is also valid: the contract forbids exposing\n\t\t\t\t\t// mutable live state, not defensive immutability.\n\t\t\t\t}\n\t\t\t\tconst stored = await store.readStream({ ...firstKey }, fixtureRead);\n\t\t\t\tassert(\n\t\t\t\t\tstored.exists &&\n\t\t\t\t\t\tstored.events.length === 1 &&\n\t\t\t\t\t\tstored.events[0]?.eventId === seeded.eventId,\n\t\t\t\t\t\"readStream must return an owned array, never live internal state\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t];\n}\n","import type {\n\tIdempotencyClaim,\n\tIdempotencyClaimHandle,\n\tIdempotencyStore,\n} from \"../app/idempotency\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertChainContainsKitError,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n\tchainContainsRetryable,\n\tgatedContractTest,\n} from \"./contract-assertions\";\n\n/** One contract test; bind with `(test.skipped ? it.skip : it)(test.name, test.run)`. */\nexport type IdempotencyStoreContractTest = ContractTest;\n\n/**\n * One isolated test environment: a fresh idempotency store. The suite\n * creates one per test and tears it down afterwards.\n */\nexport interface IdempotencyStoreContractEnvironment<TCtx> {\n\t/** The adapter under test. */\n\tstore: IdempotencyStore<TCtx>;\n\n\t/**\n\t * Runs `work` inside a transaction that COMMITS, handing it the\n\t * transaction context the store methods expect, the way\n\t * `withIdempotentCommit` calls them in production. For a\n\t * non-transactional store this simply invokes `work` with a dummy\n\t * context.\n\t */\n\trun<R>(work: (ctx: TCtx) => Promise<R>): Promise<R>;\n\n\t/**\n\t * For the `\"transactional\"` family: runs `work` inside a transaction\n\t * that ROLLS BACK. Required there; the rollback-releases-the-claim\n\t * test is that family's core proof. Irrelevant for the\n\t * `\"non-transactional\"` family.\n\t */\n\trunRolledBack?<R>(work: (ctx: TCtx) => Promise<R>): Promise<R>;\n\n\t/**\n\t * For the `\"non-transactional\"` family: advances or edits adapter test\n\t * state so this exact claim's CURRENT lease is expired. Required there;\n\t * a fake clock or test-only row update keeps the suite deterministic.\n\t */\n\texpireLease?(claim: IdempotencyClaimHandle): Promise<void>;\n\n\t/**\n\t * Moves the adapter's test clock to an exact instant. Required by the\n\t * non-transactional family so renewal is proved without wall-clock sleeps.\n\t */\n\tadvanceTimeTo?(instant: Date): Promise<void>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the idempotency-store contract suite.\n *\n * The port (`IdempotencyStore`) deliberately supports two adapter\n * families with different lifecycle semantics, and the suite follows\n * the declared family instead of forcing one onto the other:\n *\n * - `\"transactional\"` (the single-transaction pattern): the record\n * lives in the same database as the aggregates; a committed\n * `complete` is final and replayable, a rollback releases everything,\n * and `renew`/`confirm`/`abandon`/`reconcile` are no-ops. The family's core proof is the\n * rollback test, so environments MUST provide `runRolledBack`, and\n * run against a real database for SQL adapters.\n * - `\"non-transactional\"` (the leased two-phase pattern, e.g. the\n * in-memory reference): the store cannot see commits, so `complete` only\n * STAGES the outcome, `confirm` finalizes it post-commit, `abandon`\n * compensates failed attempts, and expired staged records require\n * reconciliation. Environments MUST provide deterministic `expireLease` and\n * `advanceTimeTo` controls. The rollback test is skipped.\n */\nexport interface IdempotencyStoreContractHarness<TCtx> {\n\tcreateEnvironment(): Promise<IdempotencyStoreContractEnvironment<TCtx>>;\n\n\t/** Which lifecycle family the adapter implements; see above. */\n\tfamily: \"transactional\" | \"non-transactional\";\n}\n\nfunction claimedHandle(\n\tclaim: IdempotencyClaim,\n\tmessage: string,\n): IdempotencyClaimHandle {\n\tassert(claim.status === \"claimed\", message);\n\treturn claim.claim;\n}\n\nasync function expireLease<TCtx>(\n\tenv: IdempotencyStoreContractEnvironment<TCtx>,\n\tclaim: IdempotencyClaimHandle,\n): Promise<void> {\n\tif (!env.expireLease) {\n\t\tthrow new Error(\n\t\t\t\"Contract violated: the non-transactional family requires expireLease on the environment\",\n\t\t);\n\t}\n\tawait env.expireLease(claim);\n}\n\nasync function advanceTimeTo<TCtx>(\n\tenv: IdempotencyStoreContractEnvironment<TCtx>,\n\tinstant: Date,\n): Promise<void> {\n\tif (!env.advanceTimeTo) {\n\t\tthrow new Error(\n\t\t\t\"Contract violated: the non-transactional family requires advanceTimeTo on the environment\",\n\t\t);\n\t}\n\tawait env.advanceTimeTo(instant);\n}\n\n/**\n * The idempotency-store contract test suite: the proof that an adapter\n * delivers the claim/renew/complete/confirm/abandon/reconcile lifecycle\n * `withIdempotentCommit` documents, for its declared family. Store\n * semantics are an **adapter contract, not a kit guarantee**; this\n * suite is how an adapter demonstrates them.\n *\n * Framework-agnostic: bind with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport function createIdempotencyStoreContractTests<TCtx>(\n\tharness: IdempotencyStoreContractHarness<TCtx>,\n): IdempotencyStoreContractTest[] {\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\n\t// Shared tests: hold for BOTH families (confirm/abandon are no-ops in\n\t// the transactional family, which these tests tolerate by design).\n\tconst tests: IdempotencyStoreContractTest[] = [\n\t\t{\n\t\t\tname: \"a fresh key is claimed; the full lifecycle replays the outcome\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t\"a fresh key must be claimed by this execution\",\n\t\t\t\t);\n\t\t\t\tawait env.run((ctx) => env.store.complete(ctx, claim, { total: 42 }));\n\t\t\t\tawait env.store.confirm(claim);\n\t\t\t\tconst replay = await env.run((ctx) =>\n\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\treplay.status === \"completed\",\n\t\t\t\t\t\"a completed and confirmed key must replay as completed\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(replay.outcome, { total: 42 }),\n\t\t\t\t\t\"the replayed outcome must round-trip the stored value\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"the same key with a different fingerprint throws IdempotencyKeyReuseError\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\t// Built on a COMPLETED record: the one same-key/other-command\n\t\t\t\t// state both families can actually reach in production (a\n\t\t\t\t// transactional store never commits a bare pending claim).\n\t\t\t\tconst first = await env.run(async (ctx) => {\n\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.complete(ctx, claim, \"done\");\n\t\t\t\t\treturn claim;\n\t\t\t\t});\n\t\t\t\tawait env.store.confirm(first);\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenv.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-OTHER\")),\n\t\t\t\t);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"IDEMPOTENCY_KEY_REUSE\"],\n\t\t\t\t\t\"a different fingerprint must throw IdempotencyKeyReuseError, never replay another command's outcome\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"abandon never destroys a completed, confirmed outcome\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst first = await env.run(async (ctx) => {\n\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.complete(ctx, claim, \"done\");\n\t\t\t\t\treturn claim;\n\t\t\t\t});\n\t\t\t\tawait env.store.confirm(first);\n\t\t\t\tawait env.store.abandon(first);\n\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tclaim.status === \"completed\",\n\t\t\t\t\t\"abandon must not release a completed, confirmed record\",\n\t\t\t\t);\n\t\t\t\tassertEqual(claim.outcome, \"done\", \"the outcome survives\");\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"confirm is idempotent, and confirming a missing key is a no-op\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst first = await env.run(async (ctx) => {\n\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.complete(ctx, claim, \"done\");\n\t\t\t\t\treturn claim;\n\t\t\t\t});\n\t\t\t\tawait env.store.confirm(first);\n\t\t\t\tawait env.store.confirm(first);\n\t\t\t\tawait env.store.confirm({ key: \"never-claimed\", token: \"missing\" });\n\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tclaim.status === \"completed\" && claim.outcome === \"done\",\n\t\t\t\t\t\"re-confirms and unknown-key confirms must change nothing\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"complete without a pending claim throws the wiring error\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenv.run((ctx) =>\n\t\t\t\t\t\tenv.store.complete(ctx, { key: \"key-1\", token: \"missing\" }, \"x\"),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"IDEMPOTENCY_COMPLETED_WITHOUT_CLAIM\"],\n\t\t\t\t\t\"complete() without claim() must throw IdempotencyCompletionWithoutClaimError\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t];\n\n\tconst nonTransactional = harness.family === \"non-transactional\";\n\n\t// The commit-is-the-finalize proof only EXISTS for the transactional\n\t// family; a two-phase store must do the OPPOSITE (an unconfirmed\n\t// staged outcome stays in-flight), so there is no skip twin for it.\n\tif (!nonTransactional) {\n\t\ttests.push({\n\t\t\tname: \"a committed complete replays even without confirm (commit is the finalize)\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.complete(ctx, claim, \"done\");\n\t\t\t\t});\n\t\t\t\t// No confirm: for a transactional store the commit already\n\t\t\t\t// finalized the record.\n\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tclaim.status === \"completed\" && claim.outcome === \"done\",\n\t\t\t\t\t\"a committed complete must replay without a confirm call\",\n\t\t\t\t);\n\t\t\t}),\n\t\t});\n\t}\n\n\ttests.push(\n\t\t// A committed-yet-pending claim is a state only the two-phase family\n\t\t// can reach (its claims commit immediately). In the\n\t\t// single-transaction pattern, concurrent claimers collide on the row\n\t\t// lock of an UNCOMMITTED insert, which a sequential suite cannot\n\t\t// portably provoke, and a committed bare claim is legitimately\n\t\t// treated as a stale crash leftover an adapter may reclaim.\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a pending claim is in-flight for concurrent claimers, and the error is retryable\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\"));\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"IDEMPOTENCY_IN_FLIGHT\"],\n\t\t\t\t\t\t\"claiming a pending key must throw IdempotencyInFlightError\",\n\t\t\t\t\t);\n\t\t\t\t\t// Chain-walked like the kit's retry classifier: an adapter may\n\t\t\t\t\t// wrap the kit error, exactly as the code-based check above\n\t\t\t\t\t// tolerates, and a consumer's retry loop still sees retryable.\n\t\t\t\t\tassert(\n\t\t\t\t\t\tchainContainsRetryable(rejection),\n\t\t\t\t\t\t\"the in-flight error must be retryable (on the rejection or its cause chain)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"renew extends ownership beyond the original lease expiry\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-renew\", \"fp\")),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tclaim.lease !== undefined,\n\t\t\t\t\t\t\"a non-transactional claim must carry lease timing\",\n\t\t\t\t\t);\n\t\t\t\t\tconst originalExpiry = new Date(claim.lease.expiresAt).getTime();\n\t\t\t\t\tassert(\n\t\t\t\t\t\tNumber.isFinite(originalExpiry) &&\n\t\t\t\t\t\t\tnew Date(originalExpiry).toISOString() ===\n\t\t\t\t\t\t\t\tclaim.lease.expiresAt &&\n\t\t\t\t\t\t\tNumber.isSafeInteger(claim.lease.renewAfterMs) &&\n\t\t\t\t\t\t\tclaim.lease.renewAfterMs > 0,\n\t\t\t\t\t\t\"lease timing must carry a valid expiry and positive safe renewal delay\",\n\t\t\t\t\t);\n\t\t\t\t\tawait advanceTimeTo(env, new Date(originalExpiry - 1));\n\t\t\t\t\tconst renewed = await env.store.renew(claim);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trenewed !== undefined &&\n\t\t\t\t\t\t\tnew Date(renewed.expiresAt).getTime() > originalExpiry,\n\t\t\t\t\t\t\"renew must extend the lease beyond its previous expiry\",\n\t\t\t\t\t);\n\t\t\t\t\tawait advanceTimeTo(env, new Date(originalExpiry + 1));\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run((ctx) => env.store.claim(ctx, \"key-renew\", \"fp\")),\n\t\t\t\t\t);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"IDEMPOTENCY_IN_FLIGHT\"],\n\t\t\t\t\t\t\"the renewed owner must still hold the key after the original expiry\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"an expired pending lease is reclaimed under a new token and fences its stale owner\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst first = claimedHandle(\n\t\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tfirst.lease !== undefined,\n\t\t\t\t\t\t\"a non-transactional claim must carry lease timing\",\n\t\t\t\t\t);\n\t\t\t\t\tawait expireLease(env, first);\n\t\t\t\t\tconst successor = claimedHandle(\n\t\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t\t\"an expired pending claim must be reclaimed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsuccessor.token !== first.token,\n\t\t\t\t\t\t\"each ownership generation must have a different token\",\n\t\t\t\t\t);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run((ctx) => env.store.complete(ctx, first, \"stale\")),\n\t\t\t\t\t);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"IDEMPOTENCY_CLAIM_LOST\"],\n\t\t\t\t\t\t\"a stale owner must fail before it can complete after takeover\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"an expired staged outcome requires reconciliation and never auto-replays\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst first = await env.run(async (ctx) => {\n\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"uncertain\");\n\t\t\t\t\t\treturn claim;\n\t\t\t\t\t});\n\t\t\t\t\tawait expireLease(env, first);\n\t\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tclaim.status === \"reconciliation-required\",\n\t\t\t\t\t\t\"an expired staged outcome must require authoritative reconciliation\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tclaim.reconciliation.token,\n\t\t\t\t\t\tfirst.token,\n\t\t\t\t\t\t\"the reconciliation receipt identifies the staged owner\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"reconciliation confirms committed work or releases proven rollback\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst committedHandle = await env.run(async (ctx) => {\n\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\tawait env.store.claim(ctx, \"committed\", \"fp\"),\n\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"winner\");\n\t\t\t\t\t\treturn claim;\n\t\t\t\t\t});\n\t\t\t\t\tawait expireLease(env, committedHandle);\n\t\t\t\t\tconst committed = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"committed\", \"fp\"),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tcommitted.status === \"reconciliation-required\",\n\t\t\t\t\t\t\"the staged outcome must expose its reconciliation receipt\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.reconcile(committed.reconciliation, \"committed\");\n\t\t\t\t\tconst replay = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"committed\", \"fp\"),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\treplay.status === \"completed\" && replay.outcome === \"winner\",\n\t\t\t\t\t\t\"committed evidence must make the staged outcome replayable\",\n\t\t\t\t\t);\n\n\t\t\t\t\tconst rolledBackHandle = await env.run(async (ctx) => {\n\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\tawait env.store.claim(ctx, \"rolled-back\", \"fp\"),\n\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"must disappear\");\n\t\t\t\t\t\treturn claim;\n\t\t\t\t\t});\n\t\t\t\t\tawait expireLease(env, rolledBackHandle);\n\t\t\t\t\tconst rolledBack = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"rolled-back\", \"fp\"),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\trolledBack.status === \"reconciliation-required\",\n\t\t\t\t\t\t\"the staged outcome must expose its reconciliation receipt\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.reconcile(rolledBack.reconciliation, \"not-committed\");\n\t\t\t\t\tconst fresh = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"rolled-back\", \"fp\"),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfresh.status,\n\t\t\t\t\t\t\"claimed\",\n\t\t\t\t\t\t\"not-committed evidence must release the staged outcome\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t// Two-phase-hooks family: staged semantics and real abandon are the\n\t\t// core proofs; the transactional family's hooks are no-ops instead.\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a staged, unconfirmed outcome is in-flight, never replayed\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"uncommitted\");\n\t\t\t\t\t});\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenv.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"IDEMPOTENCY_IN_FLIGHT\"],\n\t\t\t\t\t\t\"a staged outcome must never replay; it is in-flight until confirmed\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abandon releases a pending claim so the next attempt claims fresh\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst first = claimedHandle(\n\t\t\t\t\t\tawait env.run((ctx) => env.store.claim(ctx, \"key-1\", \"fp-1\")),\n\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.abandon(first);\n\t\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tclaim.status,\n\t\t\t\t\t\t\"claimed\",\n\t\t\t\t\t\t\"an abandoned pending claim must be claimable again\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"family: non-transactional\",\n\t\t\t\tsatisfiedBy: nonTransactional,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abandon releases a staged outcome so the next attempt claims fresh\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst first = await env.run(async (ctx) => {\n\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"uncommitted\");\n\t\t\t\t\t\treturn claim;\n\t\t\t\t\t});\n\t\t\t\t\tawait env.store.abandon(first);\n\t\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tclaim.status,\n\t\t\t\t\t\t\"claimed\",\n\t\t\t\t\t\t\"an abandoned staged outcome must be claimable again\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t// Single-transaction family: committed state is final, hooks are\n\t\t// no-ops, and the rollback proof is mandatory.\n\t\tgatedContractTest(\n\t\t\t{ capability: \"family: transactional\", satisfiedBy: !nonTransactional },\n\t\t\t{\n\t\t\t\tname: \"a rolled-back transaction releases the claim (single-transaction pattern)\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.runRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: the transactional family requires runRolledBack on the environment\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env\n\t\t\t\t\t\t.runRolledBack(async (ctx) => {\n\t\t\t\t\t\t\tconst claim = claimedHandle(\n\t\t\t\t\t\t\t\tawait env.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t\t\t\t\"a fresh key must be claimed\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tawait env.store.complete(ctx, claim, \"rolled back\");\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t// The rollback mechanism may surface as a rejection; the\n\t\t\t\t\t\t\t// contract under test is the store state afterwards.\n\t\t\t\t\t\t});\n\t\t\t\t\tconst claim = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.claim(ctx, \"key-1\", \"fp-1\"),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tclaim.status,\n\t\t\t\t\t\t\"claimed\",\n\t\t\t\t\t\t\"a rolled-back claim/complete must leave the key claimable\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\treturn tests;\n}\n","import type { AggregateAddress } from \"../aggregate/aggregate-address\";\nimport type { AnyDomainEvent } from \"../aggregate/domain-event\";\nimport type {\n\tDeadLetterRecord,\n\tDispatchTrackingOutbox,\n\tEventCommitCandidate,\n\tOutbox,\n\tOutboxRecord,\n} from \"../events/ports\";\nimport { isDispatchTrackingOutbox } from \"../events/ports\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tbindContractEnvironment,\n\tcaptureRejection,\n\ttype ContractTest,\n\tdescribeError,\n\tgatedContractTest,\n} from \"./contract-assertions\";\n\n/** One contract test; bind with `(test.skipped ? it.skip : it)(test.name, test.run)`. */\nexport type OutboxContractTest = ContractTest;\n\n/**\n * One isolated test environment: a fresh outbox store. The suite\n * creates one per test and tears it down afterwards.\n */\nexport interface OutboxContractEnvironment<Evt extends AnyDomainEvent> {\n\t/** The adapter under test. */\n\toutbox: Outbox<Evt> | DispatchTrackingOutbox<Evt>;\n\n\t/**\n\t * Runs `outbox.add(candidates)` inside a transaction that COMMITS, the\n\t * way `withCommit` calls it in production. The suite supplies complete\n\t * candidates with explicit source, aggregate version, zero-based commit\n\t * sequence, and commit size. For a non-transactional store this is simply\n\t * `outbox.add(candidates)`.\n\t */\n\taddCommitted(events: ReadonlyArray<EventCommitCandidate<Evt>>): Promise<void>;\n\n\t/**\n\t * Optional capability: runs `outbox.add(candidates)` inside a\n\t * transaction that ROLLS BACK. Enables the rollback-purity test: a\n\t * rolled-back add must leave nothing behind. Transactional adapters\n\t * should always provide this; it is the half of the outbox promise\n\t * that in-memory fakes cannot keep.\n\t */\n\taddRolledBack?(\n\t\tevents: ReadonlyArray<EventCommitCandidate<Evt>>,\n\t): Promise<void>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the outbox contract suite.\n *\n * For SQL adapters, run against a real database (testcontainers or\n * equivalent): the commit-order and rollback tests prove YOUR schema\n * and transaction wiring, not the kit's.\n *\n * Note on claiming: multi-instance safety (`getPending` claiming via\n * `FOR UPDATE SKIP LOCKED` or equivalent) is part of the port contract\n * for competing dispatchers but is not covered here; concurrency\n * cannot be proven portably by a generic suite. Test it in your\n * adapter's own suite if you run more than one dispatcher.\n */\nexport interface OutboxContractHarness<Evt extends AnyDomainEvent> {\n\tcreateEnvironment(): Promise<OutboxContractEnvironment<Evt>>;\n\n\t/**\n\t * Deterministic event factory: the same `seed` yields an event with\n\t * the SAME `eventId` (the suite uses this for the dedupe test), and\n\t * different seeds yield distinct `eventId`s.\n\t */\n\tcreateEvent(seed: number): Evt;\n\n\t/**\n\t * For a `DispatchTrackingOutbox` adapter: how many `markFailed`\n\t * reports move a record to the dead-letter set (the adapter's\n\t * configured attempt ceiling). Omit for plain `Outbox` adapters;\n\t * the dispatch-tracking tests are then marked skipped. With a\n\t * ceiling of 1 the attempts-surfacing test is marked skipped too:\n\t * observing attempts on a PENDING record needs a record that\n\t * survives one failure.\n\t */\n\tfailuresToDeadLetter?: number;\n\n\t/**\n\t * Declare `true` when environments provide {@link\n\t * OutboxContractEnvironment.addRolledBack}. Without it, the\n\t * rollback-purity test is marked skipped: the honest state of an\n\t * in-memory fake, and a loud gap for a transactional adapter.\n\t */\n\tprovidesRolledBackAdds?: boolean;\n\n\t/**\n\t * Declare `true` when the adapter's `getPending` CLAIMS the returned\n\t * records for competing dispatchers (lease, visibility timeout,\n\t * `FOR UPDATE SKIP LOCKED`), as the port sanctions. Every test that\n\t * re-polls records a previous poll returned without resolving them\n\t * (head stability, re-ack non-disturbance, attempts surfacing)\n\t * assumes a non-claiming read and is marked skipped for claiming\n\t * adapters; prove your claim/expiry semantics in your own suite.\n\t */\n\tclaimsOnGetPending?: boolean;\n\n\t/**\n\t * Declare `true` when `add()` dedupes on `eventId` (the unique-key\n\t * constraint the port RECOMMENDS). The dedupe test is gated on this:\n\t * an adapter without the constraint satisfies the port's normative\n\t * requirements and must not fail the suite, but the skip stays\n\t * visible as the unproven recommendation it is.\n\t */\n\tdedupesOnEventId?: boolean;\n}\n\n/**\n * The outbox contract test suite: the proof that an adapter delivers\n * the guarantees `withCommit` and `OutboxDispatcher` document. The kit\n * is store-agnostic, so commit-order reads, qualified source-position\n * identity, eventful-predecessor linkage, idempotent acks, and rollback\n * purity are an **adapter contract, not a kit guarantee**; this suite is how\n * an adapter demonstrates them. Its source-law tests also prove that colliding\n * raw ids stay isolated by aggregate type and aggregate id.\n *\n * Framework-agnostic: bind with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport function createOutboxContractTests<Evt extends AnyDomainEvent>(\n\tharness: OutboxContractHarness<Evt>,\n): OutboxContractTest[] {\n\ttype Env = OutboxContractEnvironment<Evt>;\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\tconst defaultSource: AggregateAddress = {\n\t\taggregateType: \"ContractAggregate\",\n\t\taggregateId: \"contract-aggregate\",\n\t};\n\tconst commit = (\n\t\tevents: ReadonlyArray<Evt>,\n\t\taggregateVersion = 1,\n\t\tsource: AggregateAddress = defaultSource,\n\t): ReadonlyArray<EventCommitCandidate<Evt>> =>\n\t\tevents.map((event, commitSequence) => ({\n\t\t\tevent,\n\t\t\tsource,\n\t\t\tposition: {\n\t\t\t\taggregateVersion,\n\t\t\t\tcommitSequence,\n\t\t\t\tcommitSize: events.length,\n\t\t\t},\n\t\t}));\n\tconst takeAndAck = async (\n\t\tenv: Env,\n\t\tcount: number,\n\t): Promise<ReadonlyArray<OutboxRecord<Evt>>> => {\n\t\tconst records: Array<OutboxRecord<Evt>> = [];\n\t\tfor (let index = 0; index < count; index += 1) {\n\t\t\tconst [record] = await env.outbox.getPending(1);\n\t\t\tassert(\n\t\t\t\trecord !== undefined,\n\t\t\t\t`expected committed outbox record ${index + 1} of ${count}`,\n\t\t\t);\n\t\t\trecords.push(record);\n\t\t\tawait env.outbox.markDispatched([record.dispatchId]);\n\t\t}\n\t\treturn records;\n\t};\n\n\tconst tests: OutboxContractTest[] = [\n\t\t{\n\t\t\tname: \"finalizes complete commit receipts and links the next eventful commit\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.addCommitted(\n\t\t\t\t\tcommit([harness.createEvent(1), harness.createEvent(2)], 1),\n\t\t\t\t);\n\t\t\t\t// Version 2 may have been a state-only commit; the event-source\n\t\t\t\t// predecessor is still the previous EVENTFUL version 1.\n\t\t\t\tawait env.addCommitted(commit([harness.createEvent(3)], 3));\n\t\t\t\tconst records = await takeAndAck(env, 3);\n\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\trecords.map(({ position }) => position),\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taggregateVersion: 1,\n\t\t\t\t\t\t\t\tcommitSequence: 0,\n\t\t\t\t\t\t\t\tcommitSize: 2,\n\t\t\t\t\t\t\t\tpreviousEventfulAggregateVersion: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taggregateVersion: 1,\n\t\t\t\t\t\t\t\tcommitSequence: 1,\n\t\t\t\t\t\t\t\tcommitSize: 2,\n\t\t\t\t\t\t\t\tpreviousEventfulAggregateVersion: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taggregateVersion: 3,\n\t\t\t\t\t\t\t\tcommitSequence: 0,\n\t\t\t\t\t\t\t\tcommitSize: 1,\n\t\t\t\t\t\t\t\tpreviousEventfulAggregateVersion: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t\t\"the source must preserve zero-based commit completeness and link the next eventful commit to version 1\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rejects different event identities at one qualified source position\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst original = commit([harness.createEvent(1)], 1);\n\t\t\t\tconst collision = commit([harness.createEvent(2)], 1);\n\t\t\t\tawait env.addCommitted(original);\n\t\t\t\tconst rejection = await captureRejection(env.addCommitted(collision));\n\t\t\t\tassert(\n\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\"a different eventId at one qualified source position must reject\",\n\t\t\t\t);\n\n\t\t\t\tconst [record] = await takeAndAck(env, 1);\n\t\t\t\tassertEqual(\n\t\t\t\t\trecord?.event.eventId,\n\t\t\t\t\toriginal[0]?.event.eventId,\n\t\t\t\t\t\"the rejected collision must not replace the original record\",\n\t\t\t\t);\n\t\t\t\tawait env.addCommitted(commit([harness.createEvent(3)], 2));\n\t\t\t\tconst [next] = await takeAndAck(env, 1);\n\t\t\t\tassertEqual(\n\t\t\t\t\tnext?.position.previousEventfulAggregateVersion,\n\t\t\t\t\t1,\n\t\t\t\t\t\"the rejected collision must not change the source head\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"keeps event-source heads isolated by aggregate type and id\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst sources: ReadonlyArray<AggregateAddress> = [\n\t\t\t\t\t{ aggregateType: \"Order\", aggregateId: \"1\" },\n\t\t\t\t\t{ aggregateType: \"Payment\", aggregateId: \"1\" },\n\t\t\t\t\t{ aggregateType: \"Order\", aggregateId: \"2\" },\n\t\t\t\t];\n\t\t\t\tfor (const [index, source] of sources.entries()) {\n\t\t\t\t\tawait env.addCommitted(\n\t\t\t\t\t\tcommit([harness.createEvent(index + 1)], 1, source),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst records = await takeAndAck(env, sources.length);\n\t\t\t\tassert(\n\t\t\t\t\trecords.every(\n\t\t\t\t\t\t(record, index) =>\n\t\t\t\t\t\t\trecord.source.aggregateType === sources[index]?.aggregateType &&\n\t\t\t\t\t\t\trecord.source.aggregateId === sources[index]?.aggregateId &&\n\t\t\t\t\t\t\trecord.position.previousEventfulAggregateVersion === null,\n\t\t\t\t\t),\n\t\t\t\t\t\"colliding raw ids or aggregate types must each retain an independent genesis head\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"getPending returns records in commit order, across separate committed adds\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.addCommitted(\n\t\t\t\t\tcommit([harness.createEvent(1), harness.createEvent(2)], 1),\n\t\t\t\t);\n\t\t\t\tawait env.addCommitted(commit([harness.createEvent(3)], 2));\n\t\t\t\t// Explicit limit: the port leaves the no-argument page size to\n\t\t\t\t// the implementation, so the suite never relies on it.\n\t\t\t\tconst pending = await env.outbox.getPending(10);\n\t\t\t\t// \"Up to limit\": short pages are port-legal, so the assertion\n\t\t\t\t// is a non-empty PREFIX of commit order, not the full page.\n\t\t\t\tconst expectedIds = [1, 2, 3].map(\n\t\t\t\t\t(seed) => harness.createEvent(seed).eventId,\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tpending.length >= 1,\n\t\t\t\t\t\"a non-empty backlog must surface at least one record\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\tpending.map((record) => record.event.eventId),\n\t\t\t\t\t\texpectedIds.slice(0, pending.length),\n\t\t\t\t\t),\n\t\t\t\t\t\"records must come back in the order add() persisted them\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"getPending respects the limit\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.addCommitted(\n\t\t\t\t\tcommit([1, 2, 3, 4].map((s) => harness.createEvent(s))),\n\t\t\t\t);\n\t\t\t\tconst firstPage = await env.outbox.getPending(2);\n\t\t\t\t// The port promises UP TO `limit` records; a shorter page is\n\t\t\t\t// legal, an empty one against a non-empty backlog is not (the\n\t\t\t\t// dispatcher would spin without progress).\n\t\t\t\tassert(\n\t\t\t\t\tfirstPage.length >= 1 && firstPage.length <= 2,\n\t\t\t\t\t\"limit must bound the page: up to `limit` records, at least one while the backlog is non-empty\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t// Head stability assumes a non-claiming read; the port sanctions\n\t\t// claiming reads (lease, visibility timeout, FOR UPDATE SKIP\n\t\t// LOCKED) for competing dispatchers, and for those an un-acked\n\t\t// head legitimately stays invisible until the claim expires.\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"non-claiming getPending\",\n\t\t\t\tsatisfiedBy: !harness.claimsOnGetPending,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"an un-acked head comes back on the next poll (no silent skipping)\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.addCommitted(\n\t\t\t\t\t\tcommit([1, 2, 3, 4].map((s) => harness.createEvent(s))),\n\t\t\t\t\t);\n\t\t\t\t\tconst firstPage = await env.outbox.getPending(2);\n\t\t\t\t\tconst again = await env.outbox.getPending(2);\n\t\t\t\t\t// Short pages are port-legal (\"up to limit\"), so compare\n\t\t\t\t\t// the overlapping prefix: what head stability forbids is\n\t\t\t\t\t// silently SKIPPING an un-acked record, not short pages.\n\t\t\t\t\tconst overlap = Math.min(firstPage.length, again.length);\n\t\t\t\t\tassert(\n\t\t\t\t\t\toverlap >= 1,\n\t\t\t\t\t\t\"a non-empty backlog must surface at least one record on every poll\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\tagain.slice(0, overlap).map((r) => r.dispatchId),\n\t\t\t\t\t\t\tfirstPage.slice(0, overlap).map((r) => r.dispatchId),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"an un-acked head must come back on the next poll (no silent skipping)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t{\n\t\t\tname: \"markDispatched removes records; re-acks and unknown acks are accepted\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.addCommitted(\n\t\t\t\t\tcommit([harness.createEvent(1), harness.createEvent(2)]),\n\t\t\t\t);\n\t\t\t\tconst [first] = await env.outbox.getPending(1);\n\t\t\t\tassert(first !== undefined, \"expected a pending record\");\n\t\t\t\tawait env.outbox.markDispatched([first.dispatchId]);\n\t\t\t\t// Idempotency: re-acking and acking unknown ids must be no-ops.\n\t\t\t\tawait env.outbox.markDispatched([first.dispatchId]);\n\t\t\t\tawait env.outbox.markDispatched([\"no-such-dispatch-id\"]);\n\t\t\t\t// Membership, not count: claiming adapters may hold back the\n\t\t\t\t// still-pending second record, but a dispatched record must\n\t\t\t\t// never come back for anyone.\n\t\t\t\tconst remaining = await env.outbox.getPending(10);\n\t\t\t\tassert(\n\t\t\t\t\t!remaining.some((r) => r.dispatchId === first.dispatchId),\n\t\t\t\t\t\"a dispatched record must never come back\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t// Observing that OTHER records survive a re-ack needs a re-poll of\n\t\t// records an earlier poll already returned un-acked; claiming\n\t\t// adapters legitimately hold those back until the claim expires.\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"non-claiming getPending\",\n\t\t\t\tsatisfiedBy: !harness.claimsOnGetPending,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"idempotent re-acks do not disturb other pending records\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tawait env.addCommitted(\n\t\t\t\t\t\tcommit([harness.createEvent(1), harness.createEvent(2)]),\n\t\t\t\t\t);\n\t\t\t\t\tconst [first] = await env.outbox.getPending(1);\n\t\t\t\t\tassert(first !== undefined, \"expected a pending record\");\n\t\t\t\t\tawait env.outbox.markDispatched([first.dispatchId]);\n\t\t\t\t\tawait env.outbox.markDispatched([first.dispatchId]);\n\t\t\t\t\tawait env.outbox.markDispatched([\"no-such-dispatch-id\"]);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.outbox.getPending(10)).length,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"idempotent re-acks must not disturb other records\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t// Dedupe on eventId is the port's RECOMMENDATION, not a normative\n\t\t// requirement; only adapters that declare the unique-key constraint\n\t\t// are held to it.\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"dedupesOnEventId\",\n\t\t\t\tsatisfiedBy: harness.dedupesOnEventId === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"re-adding an event with the same eventId is deduped, not duplicated\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst original = commit([harness.createEvent(1)]);\n\t\t\t\t\tawait env.addCommitted(original);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait env.addCommitted(original);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// A bare UNIQUE(eventId) constraint makes the duplicate\n\t\t\t\t\t\t// INSERT throw; the contract wants an idempotent add.\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: add() must swallow a duplicate eventId, not throw. \" +\n\t\t\t\t\t\t\t\t\"Dedupe means an idempotent add (INSERT ... ON CONFLICT DO NOTHING or \" +\n\t\t\t\t\t\t\t\t`equivalent), not a raised unique violation. Got: ${describeError(error)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst pending = await env.outbox.getPending(10);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tpending.length,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"the same eventId must yield one record (unique-key dedupe)\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t];\n\n\t// Rollback purity: capability-gated (in-memory fakes cannot keep it).\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesRolledBackAdds\",\n\t\t\t\tsatisfiedBy: harness.providesRolledBackAdds === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a rolled-back add leaves nothing behind (transactional participation)\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.addRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesRolledBackAdds but the environment lacks addRolledBack\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env.addRolledBack(commit([harness.createEvent(1)], 1));\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t(await env.outbox.getPending(10)).length,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"events added in a rolled-back transaction must not appear\",\n\t\t\t\t\t);\n\t\t\t\t\tawait env.addCommitted(commit([harness.createEvent(2)], 2));\n\t\t\t\t\tconst [afterRollback] = await takeAndAck(env, 1);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tafterRollback?.position.previousEventfulAggregateVersion,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\"a rolled-back add must not advance the event-source head\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\t// Dispatch tracking: gated on the harness declaring the ceiling.\n\t// `attemptCeiling` is only ever read inside enabled tests, where the\n\t// gate guarantees the harness declared it.\n\tconst trackingEnabled = harness.failuresToDeadLetter !== undefined;\n\tconst attemptCeiling = harness.failuresToDeadLetter ?? 0;\n\tconst trackingGate = (test: ContractTest): ContractTest =>\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"failuresToDeadLetter (DispatchTrackingOutbox)\",\n\t\t\t\tsatisfiedBy: trackingEnabled,\n\t\t\t},\n\t\t\ttest,\n\t\t);\n\ttests.push(\n\t\ttrackingGate(\n\t\t\t// Observing attempts needs the record back on a re-poll after an\n\t\t\t// un-acked poll (a claiming adapter may hold it until the claim\n\t\t\t// expires) AND a record that survives one failure (with a\n\t\t\t// ceiling of 1, the single markFailed dead-letters it before\n\t\t\t// the re-poll, exactly as the port requires).\n\t\t\tgatedContractTest(\n\t\t\t\t{\n\t\t\t\t\tcapability: \"non-claiming getPending\",\n\t\t\t\t\tsatisfiedBy: !harness.claimsOnGetPending,\n\t\t\t\t},\n\t\t\t\tgatedContractTest(\n\t\t\t\t\t{\n\t\t\t\t\t\tcapability: \"failuresToDeadLetter >= 2\",\n\t\t\t\t\t\tsatisfiedBy: attemptCeiling >= 2,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"markFailed increments attempts surfaced on pending records\",\n\t\t\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\t\t\tconst outbox = env.outbox;\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tisDispatchTrackingOutbox(outbox),\n\t\t\t\t\t\t\t\t\"harness declared a tracking outbox\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tawait env.addCommitted(commit([harness.createEvent(1)]));\n\t\t\t\t\t\t\tconst [record] = await outbox.getPending(1);\n\t\t\t\t\t\t\tassert(record !== undefined, \"expected a pending record\");\n\t\t\t\t\t\t\tawait outbox.markFailed(record.dispatchId, new Error(\"boom\"));\n\t\t\t\t\t\t\tconst [after] = await outbox.getPending(1);\n\t\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\t\tafter?.attempts,\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t\"attempts must be surfaced on the record after markFailed\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\ttrackingGate({\n\t\t\tname: \"reaching the attempt ceiling dead-letters the record and unblocks getPending\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst outbox = env.outbox;\n\t\t\t\tassert(\n\t\t\t\t\tisDispatchTrackingOutbox(outbox),\n\t\t\t\t\t\"harness declared a tracking outbox\",\n\t\t\t\t);\n\t\t\t\tawait env.addCommitted(\n\t\t\t\t\tcommit([harness.createEvent(1), harness.createEvent(2)]),\n\t\t\t\t);\n\t\t\t\tconst [poison] = await outbox.getPending(1);\n\t\t\t\tassert(poison !== undefined, \"expected a pending record\");\n\t\t\t\tlet transition: DeadLetterRecord<Evt> | undefined;\n\t\t\t\tfor (let i = 0; i < attemptCeiling; i++) {\n\t\t\t\t\tconst current = await outbox.markFailed(\n\t\t\t\t\t\tpoison.dispatchId,\n\t\t\t\t\t\tnew Error(\"poison\"),\n\t\t\t\t\t);\n\t\t\t\t\tif (i < attemptCeiling - 1) {\n\t\t\t\t\t\tassertEqual(\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\"markFailed must not report a dead-letter transition below the ceiling\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\ttransition = current;\n\t\t\t\t}\n\t\t\t\tassertEqual(\n\t\t\t\t\ttransition?.dispatchId,\n\t\t\t\t\tpoison.dispatchId,\n\t\t\t\t\t\"the ceiling-crossing markFailed call must return the exact dead-letter transition\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\ttransition?.attempts,\n\t\t\t\t\tattemptCeiling,\n\t\t\t\t\t\"the returned transition must carry the final attempt count\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait outbox.markFailed(poison.dispatchId, new Error(\"late\")),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"a late failure report must not repeat the dead-letter transition\",\n\t\t\t\t);\n\t\t\t\tconst pending = await outbox.getPending(10);\n\t\t\t\tassertEqual(\n\t\t\t\t\tpending.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"the dead-lettered record must stop coming back; successors must flow\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tpending[0]?.dispatchId !== poison.dispatchId,\n\t\t\t\t\t\"the surviving record must be the successor, not the poison one\",\n\t\t\t\t);\n\t\t\t\tconst dead = await outbox.deadLetters();\n\t\t\t\tassertEqual(dead.length, 1, \"the record must appear in deadLetters()\");\n\t\t\t\tassertEqual(\n\t\t\t\t\tdead[0]?.attempts,\n\t\t\t\t\tattemptCeiling,\n\t\t\t\t\t\"the dead-letter record must carry its attempt count\",\n\t\t\t\t);\n\t\t\t}),\n\t\t}),\n\t\ttrackingGate({\n\t\t\tname: \"markFailed on unknown or dispatched ids never resurrects a record\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst outbox = env.outbox;\n\t\t\t\tassert(\n\t\t\t\t\tisDispatchTrackingOutbox(outbox),\n\t\t\t\t\t\"harness declared a tracking outbox\",\n\t\t\t\t);\n\t\t\t\tawait env.addCommitted(commit([harness.createEvent(1)]));\n\t\t\t\tconst [record] = await outbox.getPending(1);\n\t\t\t\tassert(record !== undefined, \"expected a pending record\");\n\t\t\t\tawait outbox.markDispatched([record.dispatchId]);\n\t\t\t\tawait outbox.markFailed(record.dispatchId, new Error(\"late report\"));\n\t\t\t\tawait outbox.markFailed(\"no-such-id\", new Error(\"unknown\"));\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await outbox.getPending(10)).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"late or unknown failure reports must not resurrect records\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await outbox.deadLetters()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"late or unknown failure reports must not dead-letter anything\",\n\t\t\t\t);\n\t\t\t}),\n\t\t}),\n\t\ttrackingGate({\n\t\t\tname: \"markDispatched clears a dead-lettered record (manual redelivery then ack)\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst outbox = env.outbox;\n\t\t\t\tassert(\n\t\t\t\t\tisDispatchTrackingOutbox(outbox),\n\t\t\t\t\t\"harness declared a tracking outbox\",\n\t\t\t\t);\n\t\t\t\tawait env.addCommitted(commit([harness.createEvent(1)]));\n\t\t\t\tconst [record] = await outbox.getPending(1);\n\t\t\t\tassert(record !== undefined, \"expected a pending record\");\n\t\t\t\tfor (let i = 0; i < attemptCeiling; i++) {\n\t\t\t\t\tawait outbox.markFailed(record.dispatchId, new Error(\"poison\"));\n\t\t\t\t}\n\t\t\t\tawait outbox.markDispatched([record.dispatchId]);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await outbox.deadLetters()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"acking a dead-lettered record must clear it\",\n\t\t\t\t);\n\t\t\t}),\n\t\t}),\n\t);\n\n\treturn tests;\n}\n","import type { AggregateAddress } from \"../aggregate/aggregate-address\";\nimport type {\n\tProjectionCheckpoint,\n\tProjectionCheckpointStore,\n\tProjectionPosition,\n} from \"../projections/ports\";\nimport {\n\tassert,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n\tgatedContractTest,\n} from \"./contract-assertions\";\n\n/** One contract test; bind with `(test.skipped ? it.skip : it)(test.name, test.run)`. */\nexport type ProjectionCheckpointStoreContractTest = ContractTest;\n\n/**\n * One isolated test environment: a fresh checkpoint store. The suite\n * creates one per test and tears it down afterwards.\n */\nexport interface ProjectionCheckpointStoreContractEnvironment<TCtx> {\n\t/** The adapter under test. */\n\tstore: ProjectionCheckpointStore<TCtx>;\n\n\t/**\n\t * Runs `work` inside a transaction that COMMITS, handing it the\n\t * transaction context the store methods expect, the way the\n\t * `Projector` calls them in production. For a non-transactional\n\t * store this simply invokes `work` with a dummy context.\n\t */\n\trun<R>(work: (ctx: TCtx) => Promise<R>): Promise<R>;\n\n\t/**\n\t * Optional capability: starts every supplied transaction independently and\n\t * concurrently. Each callback must receive its own transaction context for\n\t * database adapters (normally a separate pooled connection). Enables the\n\t * missing-key/existing-key exclusion test; implementing this as sequential\n\t * calls would make that proof meaningless.\n\t */\n\trunConcurrently?<R>(\n\t\tworks: ReadonlyArray<(ctx: TCtx) => Promise<R>>,\n\t): Promise<R[]>;\n\n\t/**\n\t * Optional capability: runs `work` inside a transaction that ROLLS\n\t * BACK. Enables the rollback test: a rolled-back save must leave no\n\t * checkpoint behind, the half of the atomic update+checkpoint\n\t * promise the store contributes. Transactional adapters should\n\t * always provide this; in-memory fakes cannot.\n\t */\n\trunRolledBack?<R>(work: (ctx: TCtx) => Promise<R>): Promise<R>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the projection-checkpoint-store\n * contract suite. For SQL adapters, run against a real database\n * (testcontainers or equivalent): concurrent runs prove missing-key locking,\n * the rollback test proves YOUR transaction wiring, and the checkpoint table\n * must live in the same database as the read models it accounts for.\n */\nexport interface ProjectionCheckpointStoreContractHarness<TCtx> {\n\tcreateEnvironment(): Promise<\n\t\tProjectionCheckpointStoreContractEnvironment<TCtx>\n\t>;\n\n\t/**\n\t * Declare `true` when environments provide {@link\n\t * ProjectionCheckpointStoreContractEnvironment.runRolledBack}.\n\t * Without it, the rollback test is marked skipped: the honest state\n\t * of an in-memory fake, and a loud gap for a transactional adapter.\n\t */\n\tprovidesRolledBackRuns?: boolean;\n\n\t/**\n\t * Declare `true` when environments provide {@link\n\t * ProjectionCheckpointStoreContractEnvironment.runConcurrently}. Without\n\t * it, missing-key lock safety is marked skipped and remains an explicitly\n\t * unproven adapter guarantee.\n\t */\n\tprovidesConcurrentRuns?: boolean;\n}\n\nconst pos = (\n\taggregateVersion: number,\n\tcommitSequence: number,\n\tcommitSize = commitSequence + 1,\n\tpreviousEventfulAggregateVersion: number | null = null,\n): ProjectionPosition => ({\n\taggregateVersion,\n\tcommitSequence,\n\tcommitSize,\n\tpreviousEventfulAggregateVersion,\n});\n\nconst order = (aggregateId: string): AggregateAddress => ({\n\taggregateType: \"Order\",\n\taggregateId,\n});\n\nconst checkpoint = (\n\tposition: ProjectionPosition,\n\tlastAppliedEventId = \"evt-at-watermark\",\n): ProjectionCheckpoint => ({ position, lastAppliedEventId });\n\n/**\n * The projection-checkpoint-store contract test suite: the proof that\n * an adapter delivers the watermark semantics the `Projector`\n * documents. Checkpoint semantics are an **adapter contract, not a\n * kit guarantee**; this suite is how an adapter demonstrates them. Enable its\n * concurrent-runs capability to prove genesis-safe exclusion rather than\n * leaving that guarantee visibly skipped.\n *\n * The concurrent test exercises commit visibility, but cannot deterministically\n * hold an adapter between return from `withCheckpointLocks` and its surrounding\n * transaction commit. It can therefore expose an early lock release only when\n * a waiter enters during that window; holding database locks through commit or\n * rollback remains an explicit adapter responsibility, not a complete proof\n * supplied by this suite.\n *\n * Framework-agnostic: bind with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport function createProjectionCheckpointStoreContractTests<TCtx>(\n\tharness: ProjectionCheckpointStoreContractHarness<TCtx>,\n): ProjectionCheckpointStoreContractTest[] {\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\n\treturn [\n\t\t{\n\t\t\tname: \"a never-seen (projection, aggregate) pair loads undefined\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst loaded = await env.run((ctx) =>\n\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"a fresh store must report no watermark\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesConcurrentRuns\",\n\t\t\t\tsatisfiedBy: harness.providesConcurrentRuns === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"checkpoint locks serialize competing critical sections for absent and existing rows\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tconst runConcurrently = env.runConcurrently;\n\t\t\t\t\tif (!runConcurrently) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesConcurrentRuns but the environment lacks runConcurrently\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst contenders = 8;\n\t\t\t\t\tconst address = order(\"o-locked\");\n\t\t\t\t\tconst advanceOnce = async (\n\t\t\t\t\t\texpectedVersion: number | undefined,\n\t\t\t\t\t\tnextVersion: number,\n\t\t\t\t\t): Promise<number> => {\n\t\t\t\t\t\tconst outcomes = await runConcurrently(\n\t\t\t\t\t\t\tArray.from(\n\t\t\t\t\t\t\t\t{ length: contenders },\n\t\t\t\t\t\t\t\t() => (ctx) =>\n\t\t\t\t\t\t\t\t\tenv.store.withCheckpointLocks(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t\t\t\t\t[address],\n\t\t\t\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\t\t\t\tconst stored = await env.store.load(\n\t\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\texpectedVersion === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? stored !== undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t: stored?.position.aggregateVersion !==\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texpectedVersion\n\t\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tawait Promise.resolve();\n\t\t\t\t\t\t\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\t\t\t\t\t\tcheckpoint(pos(nextVersion, 0), `evt-v${nextVersion}`),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn outcomes.filter((advanced) => advanced).length;\n\t\t\t\t\t};\n\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tawait advanceOnce(undefined, 1),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"exactly one competing callback may advance a missing checkpoint key; genesis has no row that SELECT FOR UPDATE could lock\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tawait advanceOnce(1, 2),\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"exactly one competing callback may advance an existing checkpoint key from the observed watermark\",\n\t\t\t\t\t);\n\t\t\t\t\tconst stored = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", address),\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tstored?.position.aggregateVersion === 2,\n\t\t\t\t\t\t\"serialized genesis and existing-row advances must leave the final watermark visible\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t\t{\n\t\t\tname: \"checkpoint locks release after a rejected critical section\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst address = order(\"o-rejected-lock\");\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenv.run((ctx) =>\n\t\t\t\t\t\tenv.store.withCheckpointLocks(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t\t[address],\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tthrow new Error(\"projection failed\");\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\trejection !== undefined,\n\t\t\t\t\t\"the store must propagate a rejected critical section\",\n\t\t\t\t);\n\n\t\t\t\tlet retried = false;\n\t\t\t\tawait env.run((ctx) =>\n\t\t\t\t\tenv.store.withCheckpointLocks(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t[address],\n\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\tretried = true;\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tretried,\n\t\t\t\t\t\"a rejected callback must release its key so redelivery can enter\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"save/load round-trips the complete checkpoint receipt\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run((ctx) =>\n\t\t\t\t\tenv.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(5, 2, 3, 3), \"evt-o-1-5-2\"),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst loaded = await env.run((ctx) =>\n\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tloaded?.position.aggregateVersion === 5 &&\n\t\t\t\t\t\tloaded.position.commitSequence === 2 &&\n\t\t\t\t\t\tloaded.position.commitSize === 3 &&\n\t\t\t\t\t\tloaded.position.previousEventfulAggregateVersion === 3 &&\n\t\t\t\t\t\tloaded.lastAppliedEventId === \"evt-o-1-5-2\",\n\t\t\t\t\t\"the stored checkpoint must round-trip every cursor field and the watermark event identity\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"save overwrites the previous watermark (last write wins; monotonicity is the projector's job)\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(5, 0), \"evt-first\"),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(5, 1), \"evt-second\"),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst loaded = await env.run((ctx) =>\n\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tloaded?.position.aggregateVersion === 5 &&\n\t\t\t\t\t\tloaded.position.commitSequence === 1 &&\n\t\t\t\t\t\tloaded.lastAppliedEventId === \"evt-second\",\n\t\t\t\t\t\"a later save must replace the stored watermark verbatim\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"a loaded position is a detached copy; mutating it must not move the watermark\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run((ctx) =>\n\t\t\t\t\tenv.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(2, 0)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst loaded = await env.run((ctx) =>\n\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t);\n\t\t\t\tassert(loaded !== undefined, \"expected a stored watermark\");\n\t\t\t\t(loaded.position as { aggregateVersion: number }).aggregateVersion = 99;\n\t\t\t\tconst reloaded = await env.run((ctx) =>\n\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\treloaded?.position.aggregateVersion === 2,\n\t\t\t\t\t\"the stored watermark must be immune to mutation of a previously loaded copy\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"watermarks are isolated per projection and per aggregate\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(3, 0)),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-detail\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(1, 0)),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-2\"),\n\t\t\t\t\t\tcheckpoint(pos(7, 0)),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst [listO1, detailO1, listO2] = await env.run((ctx) =>\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t\t\tenv.store.load(ctx, \"order-detail\", order(\"o-1\")),\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-2\")),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tlistO1?.position.aggregateVersion === 3 &&\n\t\t\t\t\t\tdetailO1?.position.aggregateVersion === 1 &&\n\t\t\t\t\t\tlistO2?.position.aggregateVersion === 7,\n\t\t\t\t\t\"the watermark key is the (projection, aggregateType, aggregateId) triple; no part may bleed into another\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"watermarks are isolated per aggregate TYPE: colliding raw ids do not share a checkpoint\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t{ aggregateType: \"Order\", aggregateId: \"1\" },\n\t\t\t\t\t\tcheckpoint(pos(10, 0)),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t{ aggregateType: \"Payment\", aggregateId: \"1\" },\n\t\t\t\t\t\tcheckpoint(pos(1, 0)),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst [orderMark, paymentMark] = await env.run((ctx) =>\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", {\n\t\t\t\t\t\t\taggregateType: \"Order\",\n\t\t\t\t\t\t\taggregateId: \"1\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", {\n\t\t\t\t\t\t\taggregateType: \"Payment\",\n\t\t\t\t\t\t\taggregateId: \"1\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\torderMark?.position.aggregateVersion === 10 &&\n\t\t\t\t\t\tpaymentMark?.position.aggregateVersion === 1,\n\t\t\t\t\t\"identities are type-scoped: Order 1 at version 10 must not make Payment 1 look processed\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"address encoding is collision-free even with separator-like characters in either half\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\t// The two classic composite-key collisions: a separator\n\t\t\t\t// smuggled into the type vs. into the id. Whatever encoding\n\t\t\t\t// the adapter uses (composite column, JSON tuple, nested\n\t\t\t\t// key), these addresses must keep distinct watermarks.\n\t\t\t\tconst inType: AggregateAddress = {\n\t\t\t\t\taggregateType: \"A\\u0000B\",\n\t\t\t\t\taggregateId: \"C\",\n\t\t\t\t};\n\t\t\t\tconst inId: AggregateAddress = {\n\t\t\t\t\taggregateType: \"A\",\n\t\t\t\t\taggregateId: \"B\\u0000C\",\n\t\t\t\t};\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\tinType,\n\t\t\t\t\t\tcheckpoint(pos(10, 0)),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(ctx, \"order-list\", inId, checkpoint(pos(1, 0)));\n\t\t\t\t});\n\t\t\t\tconst [first, second] = await env.run((ctx) =>\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", inType),\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", inId),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tfirst?.position.aggregateVersion === 10 &&\n\t\t\t\t\t\tsecond?.position.aggregateVersion === 1,\n\t\t\t\t\t\"two addresses that differ only in where a hostile separator sits must not share a watermark\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"hasReached compares the full pair: unseen is false, behind is false, at and past are true\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run((ctx) =>\n\t\t\t\t\tenv.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(5, 0)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-2\"), pos(1, 0)),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"an unseen aggregate has reached nothing\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-1\"), pos(5, 1)),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"a later commitSequence of the SAME version is not yet reached; comparing on the version alone would lie mid-commit\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-1\"), pos(6, 0)),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"a later version is not yet reached\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-1\"), pos(5, 0)),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"the stored position itself is reached\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-1\"), pos(4, 7)),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"any earlier version is reached regardless of its commitSequence\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"reset clears only the named projection's checkpoints\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.run(async (ctx) => {\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(3, 0)),\n\t\t\t\t\t);\n\t\t\t\t\tawait env.store.save(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"order-detail\",\n\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\tcheckpoint(pos(2, 0)),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tawait env.run((ctx) => env.store.reset(ctx, \"order-list\"));\n\t\t\t\tconst [cleared, untouched] = await env.run((ctx) =>\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t\t\tenv.store.load(ctx, \"order-detail\", order(\"o-1\")),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tcleared,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"the reset projection must start from zero (rebuild entry point)\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tuntouched?.position.aggregateVersion === 2,\n\t\t\t\t\t\"a sibling projection's checkpoints must survive the reset\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.hasReached(\"order-list\", order(\"o-1\"), pos(1, 0)),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"hasReached must report false after a reset\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"providesRolledBackRuns\",\n\t\t\t\tsatisfiedBy: harness.providesRolledBackRuns === true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"a rolled-back save leaves no checkpoint behind (atomic update+checkpoint)\",\n\t\t\t\trun: inEnv(async (env) => {\n\t\t\t\t\tif (!env.runRolledBack) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Contract violated: harness declared providesRolledBackRuns but the environment lacks runRolledBack\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait env\n\t\t\t\t\t\t.runRolledBack((ctx) =>\n\t\t\t\t\t\t\tenv.store.save(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"order-list\",\n\t\t\t\t\t\t\t\torder(\"o-1\"),\n\t\t\t\t\t\t\t\tcheckpoint(pos(1, 0)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t// The rollback mechanism may surface as a rejection; the\n\t\t\t\t\t\t\t// contract under test is the store state afterwards.\n\t\t\t\t\t\t});\n\t\t\t\t\tconst loaded = await env.run((ctx) =>\n\t\t\t\t\t\tenv.store.load(ctx, \"order-list\", order(\"o-1\")),\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tloaded,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"a checkpoint from a rolled-back transaction must not exist; otherwise events are lost while marked processed\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t];\n}\n","import type { IAggregateRoot } from \"../aggregate/aggregate\";\nimport type {\n\tAnyDomainEvent,\n\tPendingDomainEvent,\n} from \"../aggregate/domain-event\";\nimport type { Id } from \"../core/id\";\nimport type { CommittedDomainEvent } from \"../events/ports\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertChainContainsKitError,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n\tcaptureRejection,\n\tdescribeError,\n\tgatedContractTest,\n\tloadAggregateOrFail,\n\tmintedPendingEventIds,\n\tsortedCommittedEventIds,\n} from \"./contract-assertions\";\n\n/** Application-facing state-stored repository exercised by the suite. */\nexport interface ContractRepository<\n\tTAggregate extends IAggregateRoot<Id<string>, AnyDomainEvent>,\n> {\n\tfindById(id: TAggregate[\"id\"]): Promise<TAggregate | undefined>;\n\tadd(aggregate: TAggregate): void;\n\tupdate(aggregate: TAggregate): void;\n\t/** Physical removal is an optional persistence capability. */\n\tremove?(aggregate: TAggregate): void;\n}\n\n/** One isolated real-adapter environment. `run` must permit overlapping calls. */\nexport interface RepositoryContractEnvironment<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n> {\n\trun<R>(\n\t\twork: (context: {\n\t\t\trepository: ContractRepository<TAggregate>;\n\t\t}) => Promise<R>,\n\t): Promise<R>;\n\tcommittedOutboxEvents(): Promise<ReadonlyArray<CommittedDomainEvent<TEvent>>>;\n\t/** Makes the next transactional outbox write fail for atomicity proof. */\n\tfailNextOutboxWrite(error: Error): void;\n\tteardown?(): Promise<void>;\n}\n\n/** Fixtures and observable projections supplied by an adapter package. */\nexport interface RepositoryContractHarness<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n> {\n\tcreateEnvironment(): Promise<\n\t\tRepositoryContractEnvironment<TAggregate, TEvent>\n\t>;\n\t/** A fresh aggregate with a unique id. */\n\tcreateAggregate(): TAggregate;\n\t/** One version-bumping decision that records at least one event. */\n\tmutate(aggregate: TAggregate): void;\n\t/** Required for duplicate-add and same-UoW deletion-finality proofs. */\n\tcreateAggregateWithId?(id: TAggregate[\"id\"]): TAggregate;\n\t/**\n\t * A version-bumping decision with no event whose resulting state is\n\t * deep-equal to the previous state (`setState({ ...state })`). The\n\t * deep-equal requirement is load-bearing: it forces a diff-based\n\t * `PersistenceModel` to derive an EMPTY change set, so the suite proves\n\t * that an adapter persists the bumped version even when\n\t * `changes.empty` is true. Skipping that write desyncs the persisted\n\t * version and produces false concurrency conflicts later.\n\t */\n\tmutateVersionOnly?(aggregate: TAggregate): void;\n\t/** A decision that changes a nested collection. */\n\tmutateChildCollection?(aggregate: TAggregate): void;\n\t/** Round-trip-stable adapter persistence projection. */\n\tsnapshotState?(aggregate: TAggregate): unknown;\n\t/** Opt out only for an intentionally upserting add implementation. */\n\tinsertsAreDuplicateChecked?: boolean;\n\t/** Enables physical-remove behavior and stale-remove OCC tests. */\n\tremovesAreSupported?: boolean;\n\t/** The remove flush predicates on the version captured at load. */\n\tremovesAreVersionChecked?: boolean;\n}\n\nexport type RepositoryContractTest = ContractTest;\n\n/**\n * Contract suite for the v3 explicit-intent, commit-time-flush protocol.\n *\n * The harness must use the public `UnitOfWork` with a real adapter. In\n * particular, `run` must create a fresh Unit of Work and transaction for each\n * call and allow two calls to overlap; the mandatory stale-writer proof keeps\n * writer B open while writer A commits. SQL/ORM adapters therefore need a\n * real database and connection pool. An in-memory harness proves only itself.\n *\n * Writes are synchronous registrations. Durable adapter I/O happens after the\n * callback returns, while the transaction is still open. A test that passes\n * because `add` or `update` writes early is not a conforming implementation.\n */\nexport function createRepositoryContractTests<\n\tTAggregate extends IAggregateRoot<Id<string>, TEvent>,\n\tTEvent extends AnyDomainEvent = AnyDomainEvent,\n>(\n\tharness: RepositoryContractHarness<TAggregate, TEvent>,\n): RepositoryContractTest[] {\n\ttype Environment = RepositoryContractEnvironment<TAggregate, TEvent>;\n\tconst inEnvironment = bindContractEnvironment(() =>\n\t\tharness.createEnvironment(),\n\t);\n\tconst snapshotState = harness.snapshotState;\n\tconst createAggregateWithId = harness.createAggregateWithId;\n\tconst mutateVersionOnly = harness.mutateVersionOnly;\n\tconst mutateChildCollection = harness.mutateChildCollection;\n\tconst insertsAreDuplicateChecked =\n\t\tharness.insertsAreDuplicateChecked !== false;\n\tconst removesAreSupported = harness.removesAreSupported === true;\n\tconst removesAreVersionChecked =\n\t\tremovesAreSupported && harness.removesAreVersionChecked === true;\n\n\tconst load = (\n\t\trepository: ContractRepository<TAggregate>,\n\t\tid: TAggregate[\"id\"],\n\t): Promise<TAggregate> =>\n\t\tloadAggregateOrFail(\n\t\t\trepository,\n\t\t\tid,\n\t\t\t\"the adapter did not commit or reconstitute the aggregate\",\n\t\t);\n\n\tasync function seed(environment: Environment): Promise<TAggregate> {\n\t\tconst aggregate = harness.createAggregate();\n\t\tharness.mutate(aggregate);\n\t\tawait environment.run(async ({ repository }) => {\n\t\t\trepository.add(aggregate);\n\t\t});\n\t\treturn aggregate;\n\t}\n\n\tconst reload = (environment: Environment, id: TAggregate[\"id\"]) =>\n\t\tenvironment.run(({ repository }) => load(repository, id));\n\n\tconst eventIds = (\n\t\tevents: ReadonlyArray<CommittedDomainEvent<TEvent>>,\n\t): string[] => sortedCommittedEventIds(events);\n\tconst pendingEventIds = (\n\t\tevents: ReadonlyArray<PendingDomainEvent<TEvent>>,\n\t): string[] =>\n\t\tmintedPendingEventIds(\n\t\t\tevents,\n\t\t\t\"the harness must record pending events before persistence\",\n\t\t);\n\n\tconst tests: RepositoryContractTest[] = [\n\t\t{\n\t\t\tname: \"add flushes a new aggregate and its exact event batch atomically\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst registeredEvents = [...aggregate.pendingEvents];\n\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\n\t\t\t\tconst reloaded = await reload(environment, aggregate.id);\n\t\t\t\tassertEqual(\n\t\t\t\t\treloaded.version,\n\t\t\t\t\taggregate.version,\n\t\t\t\t\t\"add must store the version registered by the Unit of Work\",\n\t\t\t\t);\n\t\t\t\tif (snapshotState) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\tsnapshotState.call(harness, reloaded),\n\t\t\t\t\t\t\tsnapshotState.call(harness, aggregate),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"add must store the adapter's complete persistence projection\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst outbox = await environment.committedOutboxEvents();\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(eventIds(outbox), pendingEventIds(registeredEvents).sort()),\n\t\t\t\t\t\"the outbox must contain exactly the batch registered by add\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\taggregate.pendingEvents.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"only a committed add acknowledges its registered event batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"committed outbox envelopes carry exact position facts\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t// Position facts must be provable through the repository suite\n\t\t\t\t// alone: OutboxWriter-only adapters (CDC, broker-native) cannot\n\t\t\t\t// run the outbox suite, and idempotent consumers key their\n\t\t\t\t// watermarks on (aggregateVersion, commitSequence).\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst batchSize = aggregate.pendingEvents.length;\n\t\t\t\tconst committedVersion = aggregate.version;\n\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t});\n\n\t\t\t\tconst positions = (await environment.committedOutboxEvents())\n\t\t\t\t\t.map(({ position }) => position)\n\t\t\t\t\t.sort((a, b) => a.commitSequence - b.commitSequence);\n\t\t\t\tassertEqual(\n\t\t\t\t\tpositions.length,\n\t\t\t\t\tbatchSize,\n\t\t\t\t\t\"every registered event must commit exactly one envelope\",\n\t\t\t\t);\n\t\t\t\tpositions.forEach((position, index) => {\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tposition.aggregateVersion,\n\t\t\t\t\t\tcommittedVersion,\n\t\t\t\t\t\t\"every envelope must carry the version the commit persisted\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tposition.commitSequence,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\"commitSequence must be gapless and zero-based over the batch\",\n\t\t\t\t\t);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tposition.commitSize,\n\t\t\t\t\t\tbatchSize,\n\t\t\t\t\t\t\"commitSize must equal the exact batch length\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"MANDATORY stale update: writer B conflicts after writer A commits and persists nothing\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\tlet loadedB!: () => void;\n\t\t\t\tconst bLoaded = new Promise<void>((resolve) => {\n\t\t\t\t\tloadedB = resolve;\n\t\t\t\t});\n\t\t\t\tlet releaseB!: () => void;\n\t\t\t\tconst bMayFlush = new Promise<void>((resolve) => {\n\t\t\t\t\treleaseB = resolve;\n\t\t\t\t});\n\n\t\t\t\tconst writerB = environment.run(async ({ repository }) => {\n\t\t\t\t\tconst stale = await load(repository, seeded.id);\n\t\t\t\t\tloadedB();\n\t\t\t\t\tawait bMayFlush;\n\t\t\t\t\tharness.mutate(stale);\n\t\t\t\t\trepository.update(stale);\n\t\t\t\t});\n\t\t\t\tawait bLoaded;\n\n\t\t\t\tconst committedA = await environment.run(async ({ repository }) => {\n\t\t\t\t\tconst current = await load(repository, seeded.id);\n\t\t\t\t\tharness.mutate(current);\n\t\t\t\t\trepository.update(current);\n\t\t\t\t\treturn current;\n\t\t\t\t});\n\t\t\t\tconst outboxAfterA = await environment.committedOutboxEvents();\n\t\t\t\treleaseB();\n\t\t\t\tconst rejection = await captureRejection(writerB);\n\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\trejection,\n\t\t\t\t\t[\"CONCURRENCY_CONFLICT\"],\n\t\t\t\t\t`stale update must reject with ConcurrencyConflictError; got ${describeError(rejection)}`,\n\t\t\t\t);\n\n\t\t\t\tconst final = await reload(environment, seeded.id);\n\t\t\t\tassertEqual(\n\t\t\t\t\tfinal.version,\n\t\t\t\t\tcommittedA.version,\n\t\t\t\t\t\"the stale writer must not replace writer A's version\",\n\t\t\t\t);\n\t\t\t\tif (snapshotState) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\tsnapshotState.call(harness, committedA),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"the stale writer must not replace writer A's state\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\teventIds(await environment.committedOutboxEvents()),\n\t\t\t\t\t\teventIds(outboxAfterA),\n\t\t\t\t\t),\n\t\t\t\t\t\"a rejected stale flush must add no outbox records\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"rollback acknowledges nothing and commits neither state nor outbox\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst pending = [...aggregate.pendingEvents];\n\t\t\t\tawait captureRejection(\n\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t\t\tthrow new Error(\"rollback probe\");\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst absent = await environment.run(({ repository }) =>\n\t\t\t\t\trepository.findById(aggregate.id),\n\t\t\t\t);\n\t\t\t\tassert(absent === undefined, \"a rolled-back add must leave no row\");\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await environment.committedOutboxEvents()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"a rolled-back add must leave no outbox record\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(aggregate.pendingEvents, pending),\n\t\t\t\t\t\"rollback must acknowledge none of the registered event batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"outbox failure rolls the already-flushed aggregate write back\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst aggregate = harness.createAggregate();\n\t\t\t\tharness.mutate(aggregate);\n\t\t\t\tconst pending = [...aggregate.pendingEvents];\n\t\t\t\tenvironment.failNextOutboxWrite(new Error(\"outbox failure probe\"));\n\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\trepository.add(aggregate);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tassert(rejection !== undefined, \"the outbox failure must reject\");\n\t\t\t\tconst absent = await environment.run(({ repository }) =>\n\t\t\t\t\trepository.findById(aggregate.id),\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tabsent === undefined,\n\t\t\t\t\t\"state flush must roll back when the outbox write fails\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await environment.committedOutboxEvents()).length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"failed outbox write must commit no envelope\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(aggregate.pendingEvents, pending),\n\t\t\t\t\t\"failed commit must acknowledge none of the event batch\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"identity map returns one instance for repeated loads in one Unit of Work\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\tconst first = await repository.findById(seeded.id);\n\t\t\t\t\tconst second = await repository.findById(seeded.id);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tfirst !== undefined && first === second,\n\t\t\t\t\t\t\"repeated reads must return the same tracked aggregate instance\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"an unchanged explicit update is safe and emits no event\",\n\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\tconst before = await environment.committedOutboxEvents();\n\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\tconst aggregate = await load(repository, seeded.id);\n\t\t\t\t\trepository.update(aggregate);\n\t\t\t\t});\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\teventIds(await environment.committedOutboxEvents()),\n\t\t\t\t\t\teventIds(before),\n\t\t\t\t\t),\n\t\t\t\t\t\"an unchanged update must not manufacture an outbox event\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t];\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: createAggregateWithId\n\t\t\t\t\t? \"insertsAreDuplicateChecked\"\n\t\t\t\t\t: \"createAggregateWithId\",\n\t\t\t\tsatisfiedBy:\n\t\t\t\t\tBoolean(createAggregateWithId) && insertsAreDuplicateChecked,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"duplicate add rejects and preserves the existing aggregate\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tassert(createAggregateWithId !== undefined, \"capability gate\");\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\t// Mutated twice so its version differs from the seeded\n\t\t\t\t\t// row's: a clobbering insert is then visible in the\n\t\t\t\t\t// version check even without a state snapshot.\n\t\t\t\t\tconst duplicate = createAggregateWithId.call(harness, seeded.id);\n\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\tharness.mutate(duplicate);\n\t\t\t\t\tconst rejection = await captureRejection(\n\t\t\t\t\t\tenvironment.run(async ({ repository }) => {\n\t\t\t\t\t\t\trepository.add(duplicate);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\t// Exactly DUPLICATE_AGGREGATE, not a retryable conflict:\n\t\t\t\t\t// the docs instruct mapping uniqueness violations\n\t\t\t\t\t// (Postgres 23505, MySQL 1062, SQLite\n\t\t\t\t\t// SQLITE_CONSTRAINT_UNIQUE) to DuplicateAggregateError,\n\t\t\t\t\t// and a duplicate add is deterministic and must not be\n\t\t\t\t\t// retried unchanged.\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"DUPLICATE_AGGREGATE\"],\n\t\t\t\t\t\t`duplicate add must reject with (or wrap) ` +\n\t\t\t\t\t\t\t`DuplicateAggregateError; map your driver's ` +\n\t\t\t\t\t\t\t`unique-violation signal instead of a retryable ` +\n\t\t\t\t\t\t\t`conflict; got ${describeError(rejection)}`,\n\t\t\t\t\t);\n\t\t\t\t\t// The existing row is untouched by the rejected insert:\n\t\t\t\t\t// version and (capability permitting) state.\n\t\t\t\t\tconst final = await reload(environment, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\tfinal.version,\n\t\t\t\t\t\tseeded.version,\n\t\t\t\t\t\t\"the existing row must be untouched by the rejected \" +\n\t\t\t\t\t\t\t\"duplicate add; a duplicate check firing after the \" +\n\t\t\t\t\t\t\t\"write clobbers it\",\n\t\t\t\t\t);\n\t\t\t\t\tif (snapshotState) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, final),\n\t\t\t\t\t\t\t\tsnapshotState.call(harness, seeded),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"the existing row's state must be untouched by the \" +\n\t\t\t\t\t\t\t\t\"rejected duplicate add\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"mutateVersionOnly\",\n\t\t\t\tsatisfiedBy: Boolean(mutateVersionOnly),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"version-only change still persists (skip-save must not desync the OCC baseline)\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tassert(mutateVersionOnly !== undefined, \"capability gate\");\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\tconst outboxBefore = await environment.committedOutboxEvents();\n\t\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\t\tconst aggregate = await load(repository, seeded.id);\n\t\t\t\t\t\tmutateVersionOnly.call(harness, aggregate);\n\t\t\t\t\t\trepository.update(aggregate);\n\t\t\t\t\t});\n\t\t\t\t\tconst reloaded = await reload(environment, seeded.id);\n\t\t\t\t\t// The harness contract keeps the projection deep-equal, so a\n\t\t\t\t\t// diff-based model derives an EMPTY change set here: an\n\t\t\t\t\t// adapter that skips empty writes fails this reload.\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\treloaded.version,\n\t\t\t\t\t\tseeded.version + 1,\n\t\t\t\t\t\t\"a version-only change (empty change set, bumped version) \" +\n\t\t\t\t\t\t\t\"must still be persisted; skipping it desyncs the \" +\n\t\t\t\t\t\t\t\"persisted version and produces false concurrency \" +\n\t\t\t\t\t\t\t\"conflicts later\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tdeepEqual(\n\t\t\t\t\t\t\teventIds(await environment.committedOutboxEvents()),\n\t\t\t\t\t\t\teventIds(outboxBefore),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"state-only update must not create an outbox event\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"mutateChildCollection\",\n\t\t\t\tsatisfiedBy: Boolean(mutateChildCollection),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"nested collection changes survive the adapter change-set projection\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tassert(mutateChildCollection !== undefined, \"capability gate\");\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\t\tconst aggregate = await load(repository, seeded.id);\n\t\t\t\t\t\tmutateChildCollection.call(harness, aggregate);\n\t\t\t\t\t\trepository.update(aggregate);\n\t\t\t\t\t});\n\t\t\t\t\tconst reloaded = await reload(environment, seeded.id);\n\t\t\t\t\tassertEqual(\n\t\t\t\t\t\treloaded.version,\n\t\t\t\t\t\tseeded.version + 1,\n\t\t\t\t\t\t\"nested collection update must advance the persisted root version\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"removesAreSupported\",\n\t\t\t\tsatisfiedBy: removesAreSupported,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"remove tombstones the identity and physically removes at commit\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\t\tassert(repository.remove !== undefined, \"remove capability gate\");\n\t\t\t\t\t\tconst aggregate = await load(repository, seeded.id);\n\t\t\t\t\t\trepository.remove(aggregate);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t(await repository.findById(seeded.id)) === undefined,\n\t\t\t\t\t\t\t\"a removed aggregate is immediately absent from the Unit of Work\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(await environment.run(({ repository }) =>\n\t\t\t\t\t\t\trepository.findById(seeded.id),\n\t\t\t\t\t\t)) === undefined,\n\t\t\t\t\t\t\"remove must physically remove the aggregate after commit\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\ttests.push(\n\t\tgatedContractTest(\n\t\t\t{\n\t\t\t\tcapability: \"removesAreVersionChecked\",\n\t\t\t\tsatisfiedBy: removesAreVersionChecked,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"stale remove conflicts and cannot delete a concurrent update\",\n\t\t\t\trun: inEnvironment(async (environment) => {\n\t\t\t\t\tconst seeded = await seed(environment);\n\t\t\t\t\tlet loaded!: () => void;\n\t\t\t\t\tconst staleLoaded = new Promise<void>((resolve) => {\n\t\t\t\t\t\tloaded = resolve;\n\t\t\t\t\t});\n\t\t\t\t\tlet release!: () => void;\n\t\t\t\t\tconst mayRemove = new Promise<void>((resolve) => {\n\t\t\t\t\t\trelease = resolve;\n\t\t\t\t\t});\n\t\t\t\t\tconst staleRemove = environment.run(async ({ repository }) => {\n\t\t\t\t\t\tassert(repository.remove !== undefined, \"remove capability gate\");\n\t\t\t\t\t\tconst stale = await load(repository, seeded.id);\n\t\t\t\t\t\tloaded();\n\t\t\t\t\t\tawait mayRemove;\n\t\t\t\t\t\trepository.remove(stale);\n\t\t\t\t\t});\n\t\t\t\t\tawait staleLoaded;\n\t\t\t\t\tawait environment.run(async ({ repository }) => {\n\t\t\t\t\t\tconst current = await load(repository, seeded.id);\n\t\t\t\t\t\tharness.mutate(current);\n\t\t\t\t\t\trepository.update(current);\n\t\t\t\t\t});\n\t\t\t\t\trelease();\n\t\t\t\t\tconst rejection = await captureRejection(staleRemove);\n\t\t\t\t\tassertChainContainsKitError(\n\t\t\t\t\t\trejection,\n\t\t\t\t\t\t[\"CONCURRENCY_CONFLICT\"],\n\t\t\t\t\t\t`stale remove must reject with ConcurrencyConflictError; got ${describeError(rejection)}`,\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(await reload(environment, seeded.id)) !== undefined,\n\t\t\t\t\t\t\"stale remove must not delete the concurrent winner\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t},\n\t\t),\n\t);\n\n\treturn tests;\n}\n","import type { AggregateSnapshot, Version } from \"../aggregate/aggregate\";\nimport type { AggregateAddress } from \"../aggregate/aggregate-address\";\nimport type { Id } from \"../core/id\";\nimport type { SnapshotStore } from \"../repo/snapshot-store\";\nimport { deepEqual } from \"../utils/array/deep-equal\";\nimport {\n\tassert,\n\tassertEqual,\n\tbindContractEnvironment,\n\ttype ContractTest,\n} from \"./contract-assertions\";\n\n/** One contract test; bind with `(test.skipped ? it.skip : it)(test.name, test.run)`. */\nexport type SnapshotStoreContractTest = ContractTest;\n\n/** The plain-data state shape the suite round-trips. */\ninterface SuiteState {\n\ttotal: number;\n\titems: Array<{ sku: string; qty: number }>;\n\tnote?: string;\n}\n\n/**\n * One isolated test environment: a fresh snapshot store. The suite\n * creates one per test and tears it down afterwards. No transaction\n * wrapper: the port is transaction-free by design (snapshots are\n * derived data written after the commit; see `SnapshotStore`).\n */\nexport interface SnapshotStoreContractEnvironment {\n\t/** The adapter under test. */\n\tstore: SnapshotStore<SuiteState>;\n\n\t/** Release connections, drop schemas, etc. Called in a finally. */\n\tteardown?(): Promise<void>;\n}\n\n/**\n * What an adapter supplies to run the snapshot-store contract suite.\n * For SQL adapters, run against a real database (testcontainers or\n * equivalent). Note the fidelity demands the suite enforces:\n * `snapshotAt` must survive with millisecond precision (store it as\n * ISO-8601 text or epoch milliseconds; MySQL `DATETIME` without\n * fractional seconds truncates), and an ABSENT `schemaVersion` must\n * come back absent, not as `0` or `null`-coerced.\n */\nexport interface SnapshotStoreContractHarness {\n\tcreateEnvironment(): Promise<SnapshotStoreContractEnvironment>;\n}\n\nconst AT = new Date(\"2026-01-05T10:20:30.456Z\");\n\nfunction snapshot(\n\tversion: number,\n\tstate: SuiteState,\n\tschemaVersion?: number,\n): AggregateSnapshot<SuiteState> {\n\treturn {\n\t\tstate,\n\t\tversion: version as Version,\n\t\t// A fresh Date per snapshot: an adapter that normalizes the input\n\t\t// Date IN PLACE must not be able to mutate the suite's expected\n\t\t// value into agreeing with it.\n\t\tsnapshotAt: new Date(AT),\n\t\t...(schemaVersion === undefined ? {} : { schemaVersion }),\n\t};\n}\n\nconst id = (value: string): Id<string> => value as Id<string>;\nconst address = (\n\taggregateType: string,\n\taggregateId: string,\n): AggregateAddress<Id<string>> => ({\n\taggregateType,\n\taggregateId: id(aggregateId),\n});\n\n/**\n * The snapshot-store contract test suite: the proof that an adapter\n * delivers the round-trip and isolation semantics the\n * snapshot-plus-recent-events load path relies on. Store semantics are\n * an **adapter contract, not a kit guarantee**; this suite is how an\n * adapter demonstrates them.\n *\n * Framework-agnostic: bind with\n * `(test.skipped ? it.skip : it)(test.name, test.run)`.\n */\nexport function createSnapshotStoreContractTests(\n\tharness: SnapshotStoreContractHarness,\n): SnapshotStoreContractTest[] {\n\tconst inEnv = bindContractEnvironment(() => harness.createEnvironment());\n\n\treturn [\n\t\t{\n\t\t\tname: \"an aggregate without a snapshot loads undefined\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.load(address(\"Order\", \"o-1\")),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"a fresh store must report no snapshot; the repository falls back to full replay\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"save/load round-trips state, version, snapshotAt (millisecond fidelity), and schemaVersion\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst stored = snapshot(\n\t\t\t\t\t42,\n\t\t\t\t\t{ total: 7, items: [{ sku: \"a\", qty: 2 }], note: \"hi\" },\n\t\t\t\t\t3,\n\t\t\t\t);\n\t\t\t\tawait env.store.save(address(\"Order\", \"o-1\"), stored);\n\t\t\t\tconst loaded = await env.store.load(address(\"Order\", \"o-1\"));\n\t\t\t\tassert(loaded !== undefined, \"the saved snapshot must load\");\n\t\t\t\tassert(\n\t\t\t\t\tdeepEqual(loaded.state, stored.state),\n\t\t\t\t\t\"the state must round-trip deep-equal as plain data\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded.version,\n\t\t\t\t\t42,\n\t\t\t\t\t\"the aggregate version must round-trip\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tloaded.snapshotAt instanceof Date,\n\t\t\t\t\t\"snapshotAt must round-trip as a Date; rehydrate your storage format (ISO-8601 text, epoch ms) on load\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded.snapshotAt.getTime(),\n\t\t\t\t\tAT.getTime(),\n\t\t\t\t\t\"snapshotAt must survive with millisecond precision (store ISO-8601 text or epoch ms)\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded.schemaVersion,\n\t\t\t\t\t3,\n\t\t\t\t\t\"schemaVersion must round-trip verbatim; the restore path compares it against the aggregate's declared schema\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"an absent schemaVersion round-trips as absent\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"o-1\"),\n\t\t\t\t\tsnapshot(1, { total: 0, items: [] }),\n\t\t\t\t);\n\t\t\t\tconst loaded = await env.store.load(address(\"Order\", \"o-1\"));\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded?.schemaVersion,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"a snapshot stored without schemaVersion must not come back with a fabricated one; restore treats absence as schema 1\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"save replaces the previous snapshot: latest wins, no history\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"o-1\"),\n\t\t\t\t\tsnapshot(10, { total: 1, items: [] }),\n\t\t\t\t);\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"o-1\"),\n\t\t\t\t\tsnapshot(20, { total: 2, items: [] }),\n\t\t\t\t);\n\t\t\t\tconst loaded = await env.store.load(address(\"Order\", \"o-1\"));\n\t\t\t\tassert(\n\t\t\t\t\tloaded?.version === 20 && loaded.state.total === 2,\n\t\t\t\t\t\"load must return the latest snapshot only\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"snapshots are isolated per aggregate type AND per aggregate id\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"x-1\"),\n\t\t\t\t\tsnapshot(1, { total: 1, items: [] }),\n\t\t\t\t);\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Invoice\", \"x-1\"),\n\t\t\t\t\tsnapshot(2, { total: 2, items: [] }),\n\t\t\t\t);\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"x-2\"),\n\t\t\t\t\tsnapshot(3, { total: 3, items: [] }),\n\t\t\t\t);\n\t\t\t\tconst [orderX1, invoiceX1, orderX2] = await Promise.all([\n\t\t\t\t\tenv.store.load(address(\"Order\", \"x-1\")),\n\t\t\t\t\tenv.store.load(address(\"Invoice\", \"x-1\")),\n\t\t\t\t\tenv.store.load(address(\"Order\", \"x-2\")),\n\t\t\t\t]);\n\t\t\t\tassert(\n\t\t\t\t\torderX1?.version === 1 &&\n\t\t\t\t\t\tinvoiceX1?.version === 2 &&\n\t\t\t\t\t\torderX2?.version === 3,\n\t\t\t\t\t\"the key is the (aggregateType, aggregateId) pair; neither half may bleed into the other\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"delete removes exactly the addressed snapshot and tolerates unknown keys\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"o-1\"),\n\t\t\t\t\tsnapshot(1, { total: 1, items: [] }),\n\t\t\t\t);\n\t\t\t\tawait env.store.save(\n\t\t\t\t\taddress(\"Order\", \"o-2\"),\n\t\t\t\t\tsnapshot(2, { total: 2, items: [] }),\n\t\t\t\t);\n\t\t\t\tawait env.store.delete(address(\"Order\", \"o-1\"));\n\t\t\t\tawait env.store.delete(address(\"Order\", \"never-saved\"));\n\t\t\t\tassertEqual(\n\t\t\t\t\tawait env.store.load(address(\"Order\", \"o-1\")),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"the deleted snapshot must be gone (schema-migration fallback and erasure both rely on it)\",\n\t\t\t\t);\n\t\t\t\tassertEqual(\n\t\t\t\t\t(await env.store.load(address(\"Order\", \"o-2\")))?.version,\n\t\t\t\t\t2,\n\t\t\t\t\t\"a sibling snapshot must survive the delete\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"loads are detached copies and saves capture the input: later mutations touch nothing\",\n\t\t\trun: inEnv(async (env) => {\n\t\t\t\tconst input = snapshot(5, { total: 5, items: [{ sku: \"a\", qty: 1 }] });\n\t\t\t\tawait env.store.save(address(\"Order\", \"o-1\"), input);\n\t\t\t\t// Mutating the caller's input AFTER save must not reach the store.\n\t\t\t\tinput.state.items.push({ sku: \"hacked\", qty: 99 });\n\n\t\t\t\tconst loaded = await env.store.load(address(\"Order\", \"o-1\"));\n\t\t\t\tassert(loaded !== undefined, \"expected the saved snapshot\");\n\t\t\t\tassertEqual(\n\t\t\t\t\tloaded.state.items.length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"save must capture the snapshot by value, not hold the caller's reference\",\n\t\t\t\t);\n\t\t\t\t// Mutating the loaded copy must not corrupt the stored one.\n\t\t\t\tloaded.state.total = 999;\n\t\t\t\tconst reloaded = await env.store.load(address(\"Order\", \"o-1\"));\n\t\t\t\tassertEqual(\n\t\t\t\t\treloaded?.state.total,\n\t\t\t\t\t5,\n\t\t\t\t\t\"load must hand out a detached copy, never live internal state\",\n\t\t\t\t);\n\t\t\t}),\n\t\t},\n\t];\n}\n"],"mappings":"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"}