instar 1.3.718 → 1.3.720

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.
Files changed (79) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +213 -31
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  5. package/dist/core/CoherenceJournal.js +9 -1
  6. package/dist/core/CoherenceJournal.js.map +1 -1
  7. package/dist/core/CoherenceJournalReader.d.ts +56 -0
  8. package/dist/core/CoherenceJournalReader.d.ts.map +1 -1
  9. package/dist/core/CoherenceJournalReader.js +148 -0
  10. package/dist/core/CoherenceJournalReader.js.map +1 -1
  11. package/dist/core/LeaseAcquisitionTrigger.d.ts +35 -0
  12. package/dist/core/LeaseAcquisitionTrigger.d.ts.map +1 -0
  13. package/dist/core/LeaseAcquisitionTrigger.js +53 -0
  14. package/dist/core/LeaseAcquisitionTrigger.js.map +1 -0
  15. package/dist/core/OwnershipReconciler.d.ts +106 -2
  16. package/dist/core/OwnershipReconciler.d.ts.map +1 -1
  17. package/dist/core/OwnershipReconciler.js +265 -12
  18. package/dist/core/OwnershipReconciler.js.map +1 -1
  19. package/dist/core/PlacementExecutor.d.ts +14 -1
  20. package/dist/core/PlacementExecutor.d.ts.map +1 -1
  21. package/dist/core/PlacementExecutor.js +17 -2
  22. package/dist/core/PlacementExecutor.js.map +1 -1
  23. package/dist/core/PostUpdateMigrator.d.ts +5 -3
  24. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  25. package/dist/core/PostUpdateMigrator.js +33 -7
  26. package/dist/core/PostUpdateMigrator.js.map +1 -1
  27. package/dist/core/SustainedOnlineTracker.d.ts +47 -0
  28. package/dist/core/SustainedOnlineTracker.d.ts.map +1 -0
  29. package/dist/core/SustainedOnlineTracker.js +67 -0
  30. package/dist/core/SustainedOnlineTracker.js.map +1 -0
  31. package/dist/core/TopicPinFoldView.d.ts +138 -0
  32. package/dist/core/TopicPinFoldView.d.ts.map +1 -0
  33. package/dist/core/TopicPinFoldView.js +235 -0
  34. package/dist/core/TopicPinFoldView.js.map +1 -0
  35. package/dist/core/TopicPinMutation.d.ts +46 -0
  36. package/dist/core/TopicPinMutation.d.ts.map +1 -0
  37. package/dist/core/TopicPinMutation.js +66 -0
  38. package/dist/core/TopicPinMutation.js.map +1 -0
  39. package/dist/core/TopicPinReplicatedStore.d.ts +3 -0
  40. package/dist/core/TopicPinReplicatedStore.d.ts.map +1 -1
  41. package/dist/core/TopicPinReplicatedStore.js +5 -0
  42. package/dist/core/TopicPinReplicatedStore.js.map +1 -1
  43. package/dist/core/TopicPinSkewQuarantine.d.ts +44 -0
  44. package/dist/core/TopicPinSkewQuarantine.d.ts.map +1 -0
  45. package/dist/core/TopicPinSkewQuarantine.js +136 -0
  46. package/dist/core/TopicPinSkewQuarantine.js.map +1 -0
  47. package/dist/core/TopicPlacementPinStore.d.ts +29 -2
  48. package/dist/core/TopicPlacementPinStore.d.ts.map +1 -1
  49. package/dist/core/TopicPlacementPinStore.js +23 -5
  50. package/dist/core/TopicPlacementPinStore.js.map +1 -1
  51. package/dist/core/types.d.ts +29 -2
  52. package/dist/core/types.d.ts.map +1 -1
  53. package/dist/core/types.js.map +1 -1
  54. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  55. package/dist/monitoring/guardManifest.js +46 -0
  56. package/dist/monitoring/guardManifest.js.map +1 -1
  57. package/dist/providers/uxConfirm/TaskClassifier.d.ts.map +1 -1
  58. package/dist/providers/uxConfirm/TaskClassifier.js +1 -0
  59. package/dist/providers/uxConfirm/TaskClassifier.js.map +1 -1
  60. package/dist/scaffold/templates.d.ts.map +1 -1
  61. package/dist/scaffold/templates.js +1 -0
  62. package/dist/scaffold/templates.js.map +1 -1
  63. package/dist/server/AgentServer.d.ts +4 -0
  64. package/dist/server/AgentServer.d.ts.map +1 -1
  65. package/dist/server/AgentServer.js +2 -0
  66. package/dist/server/AgentServer.js.map +1 -1
  67. package/dist/server/routes.d.ts +6 -0
  68. package/dist/server/routes.d.ts.map +1 -1
  69. package/dist/server/routes.js +160 -15
  70. package/dist/server/routes.js.map +1 -1
  71. package/package.json +1 -1
  72. package/src/data/builtin-manifest.json +64 -64
  73. package/src/data/state-coherence-registry.json +18 -0
  74. package/src/scaffold/templates.ts +1 -0
  75. package/upgrades/1.3.719.md +37 -0
  76. package/upgrades/1.3.720.md +125 -0
  77. package/upgrades/eli16/f2-classifier-authority-clause.eli16.md +40 -0
  78. package/upgrades/side-effects/f2-classifier-authority-clause.md +54 -0
  79. package/upgrades/side-effects/u4-1-pin-persistence.md +49 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TopicPinReplicatedStore.d.ts","sourceRoot":"","sources":["../../src/core/TopicPinReplicatedStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,+BAA+B,CAAC;AAC1G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;mFACmF;AACnF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AACxD,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAS/C;oFACoF;AACpF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAuBvC,CAAC;AAEF;yFACyF;AACzF,eAAO,MAAM,2BAA2B;;;;CAI9B,CAAC;AAEX,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAC/E,KAAK,YAAY,EAAE,QAAQ,MAAM,EAAE,WAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASpG;AAED,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAC7D,KAAK,YAAY,EAAE,QAAQ,MAAM,EAAE,WAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASpG;AAED;2DAC2D;AAC3D,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAInE;AAED;gFACgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,GAAG,EAAE,YAAY,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EACjE,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,KAAK,MAAM,GACvD,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAsBlC"}
1
+ {"version":3,"file":"TopicPinReplicatedStore.d.ts","sourceRoot":"","sources":["../../src/core/TopicPinReplicatedStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,+BAA+B,CAAC;AAC1G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;mFACmF;AACnF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AACxD,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAM/C;+DAC+D;AAC/D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAE7D;AAKD;oFACoF;AACpF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAuBvC,CAAC;AAEF;yFACyF;AACzF,eAAO,MAAM,2BAA2B;;;;CAI9B,CAAC;AAEX,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAC/E,KAAK,YAAY,EAAE,QAAQ,MAAM,EAAE,WAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASpG;AAED,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAC7D,KAAK,YAAY,EAAE,QAAQ,MAAM,EAAE,WAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASpG;AAED;2DAC2D;AAC3D,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAInE;AAED;gFACgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,GAAG,EAAE,YAAY,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EACjE,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,KAAK,MAAM,GACvD,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAsBlC"}
@@ -27,6 +27,11 @@ export const TOPIC_PIN_STORE_KEY = 'topicPins';
27
27
  /** Machine-id charset clamp (consistent with sanitizeMachineId elsewhere): a peer-supplied
28
28
  * preferredMachine that is not a plain id is rejected (it flows into placement decisions). */
29
29
  const MACHINE_ID_RE = /^[\w-]{1,64}$/;
30
+ /** The same clamp for consumers outside this module (the U4.1 fold view's second pass —
31
+ * ONE validation authority, never a re-implemented regex). */
32
+ export function isValidPinMachineId(id) {
33
+ return typeof id === 'string' && MACHINE_ID_RE.test(id);
34
+ }
30
35
  /** The store-owned fields (for the registry's unknown-field counting). */
31
36
  const TOPIC_PIN_KNOWN_FIELDS = ['topic', 'preferredMachine', 'pinned', 'deletedAt'];
32
37
  /** recordKey = the cross-machine IDENTITY SURFACE = the topic id as a string (a pin is
@@ -1 +1 @@
1
- {"version":3,"file":"TopicPinReplicatedStore.js","sourceRoot":"","sources":["../../src/core/TopicPinReplicatedStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH;mFACmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AACxD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C;+FAC+F;AAC/F,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,0EAA0E;AAC1E,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AAE7F;oFACoF;AACpF,MAAM,UAAU,uBAAuB,CAAC,KAAsB;IAC5D,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,WAAW,EAAE,sBAA0D;IACvE,mBAAmB,EAAE,CAAC,kBAAkB,CAAC;IACzC,QAAQ,CAAC,GAAsC,EAAE,GAAyB;QACxE,IAAI,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACxB,sFAAsF;YACtF,0DAA0D;YAC1D,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,WAAW;oBAAE,SAAS;gBAC9C,IAAK,sBAAgD,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7F,CAAC;YACD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,CAAC;QACD,uFAAuF;QACvF,uFAAuF;QACvF,sDAAsD;QACtD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAC;QACvG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAC/E,CAAC;CACF,CAAC;AAEF;yFACyF;AACzF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,mBAAmB;IAC1B,MAAM,EAAE,yBAAyB;CACzB,CAAC;AAEX,MAAM,UAAU,yBAAyB;IACvC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AACjC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,gBAAwB,EAAE,MAAe;IACvF,OAAO,CAAC,GAAiB,EAAE,MAAc,EAAE,QAAuB,EAAkC,EAAE;QACpG,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO;YACL,KAAK,EAAE,gBAAgB,EAAE,MAAM;YAC/B,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,KAAqB,EAAE,MAAM;YACjD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAiB;IACrE,OAAO,CAAC,GAAiB,EAAE,MAAc,EAAE,QAAuB,EAAkC,EAAE;QACpG,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO;YACL,SAAS;YACT,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,QAAwB,EAAE,MAAM;YACpD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,UAAU,CAAC,CAAe,EAAE,CAAe;IACzD,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC9D,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IAC1D,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAiE,EACjE,UAAwD;IAExD,yEAAyE;IACzE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgF,CAAC;IACvG,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAA+B,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,IAAI,CAAC,GAAG,IAAI,SAAS,KAAK,IAAI;YAAE,SAAS;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,iEAAiE;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAA+B,CAAC;IACnD,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ;YAAE,SAAS;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAAE,SAAS;QAC/E,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"TopicPinReplicatedStore.js","sourceRoot":"","sources":["../../src/core/TopicPinReplicatedStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { HlcTimestamp } from './HybridLogicalClock.js';
2
+ export interface QuarantinedPinRecord {
3
+ /** The replicated record's key (the topic id as a string). */
4
+ key: string;
5
+ /** The exact offending HLC — the (key, hlc) pair IS the exclusion identity. */
6
+ hlc: HlcTimestamp;
7
+ /** The machine that asserted the poisoned record (diagnosability, P17 dedup key). */
8
+ origin: string;
9
+ quarantinedAt: string;
10
+ }
11
+ export interface TopicPinSkewQuarantineDeps {
12
+ filePath: string;
13
+ now?: () => Date;
14
+ /** Loud corrupt-file report (quarantined-aside path + error). Optional — absence never gates. */
15
+ onCorrupt?: (asidePath: string, error: string) => void;
16
+ }
17
+ export declare class TopicPinSkewQuarantine {
18
+ private readonly d;
19
+ private entries;
20
+ private loaded;
21
+ constructor(deps: TopicPinSkewQuarantineDeps);
22
+ private load;
23
+ private persist;
24
+ /** Is this exact (key, hlc) pair quarantined? Sticky — immune to clock progress. */
25
+ has(key: string, hlc: HlcTimestamp): boolean;
26
+ /** Quarantine a record. Returns true when NEWLY added (drives the one-per-episode item). */
27
+ add(rec: {
28
+ key: string;
29
+ hlc: HlcTimestamp;
30
+ origin: string;
31
+ }): boolean;
32
+ /**
33
+ * Honest supersession (R-r3-2): a NEWER honest record for `key` (higher HLC
34
+ * that passed the gate) makes any quarantined entry with a LOWER hlc dead by
35
+ * ordering — prune those. An entry whose hlc is still HIGHER than the honest
36
+ * winner stays excluded (it would still poison the comparison).
37
+ */
38
+ pruneSuperseded(key: string, honestWinner: HlcTimestamp): number;
39
+ /** The deliberate, explicit per-record re-admission (R-r4-1) — NOT the ack path. */
40
+ readmit(key: string, hlc: HlcTimestamp): boolean;
41
+ /** All quarantined records (diagnostics / the attention item body / read surfaces). */
42
+ all(): QuarantinedPinRecord[];
43
+ }
44
+ //# sourceMappingURL=TopicPinSkewQuarantine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopicPinSkewQuarantine.d.ts","sourceRoot":"","sources":["../../src/core/TopicPinSkewQuarantine.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,GAAG,EAAE,YAAY,CAAC;IAClB,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,iGAAiG;IACjG,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAMD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA6B;IAC/C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,0BAA0B;IAI5C,OAAO,CAAC,IAAI;IAwBZ,OAAO,CAAC,OAAO;IAQf,oFAAoF;IACpF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;IAK5C,4FAA4F;IAC5F,GAAG,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IASrE;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM;IAShE,oFAAoF;IACpF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO;IAShD,uFAAuF;IACvF,GAAG,IAAI,oBAAoB,EAAE;CAI9B"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * TopicPinSkewQuarantine — the STICKY, DURABLE exclusion set for future-skewed
3
+ * replicated pin records (U4.1 §2C, R-r3-2 / R-r4-1;
4
+ * docs/specs/u4-1-pin-persistence.md).
5
+ *
6
+ * WHY STICKY: the HLC skew gate (`HybridLogicalClock.receive()`) rejects on
7
+ * `remote.physical − max(last.physical, poolReference) > maxDriftMs` — a
8
+ * reference that MOVES with wall time. A +Δ-skewed poison record would
9
+ * silently un-quarantine after ~Δ of real time, then WIN `compareHlc` over
10
+ * every honest tombstone and re-pin the operator minted during the quarantine
11
+ * window (retroactive resurrection). A point-in-time exclusion cannot hold
12
+ * across a time advance — so the FIRST rejection persists `(recordKey, hlc)`
13
+ * here, and every future fold excludes any record matching that exact pair
14
+ * REGARDLESS of clock progress.
15
+ *
16
+ * CLEARING (R-r4-1 — dismissal is not re-admission):
17
+ * - Self-clearing ONLY by honest supersession: a NEWER honest record (higher
18
+ * HLC that passed the gate) makes the quarantined entry dead by ordering
19
+ * anyway → `pruneSuperseded` drops it.
20
+ * - Operator ack of the attention NOTIFICATION clears nothing here.
21
+ * - `readmit(key, hlc)` is the deliberate, explicit per-record re-admission —
22
+ * an authority decision distinct from dismissing an alert.
23
+ *
24
+ * Bound: tiny by construction — one entry per poisoned record, and poisoned
25
+ * records are rare (a misclocked peer's pin events). Entries prune on
26
+ * supersession/re-admit. Registered in the state-coherence registry as
27
+ * `topic-pin-skew-quarantine` (machine-local; each fold quarantines what ITS
28
+ * gate rejected).
29
+ *
30
+ * Durability posture mirrors the sibling TopicPlacementPinStore: atomic JSON
31
+ * (temp + rename). A CORRUPT file is quarantined ASIDE (renamed, preserved)
32
+ * and reported via `onCorrupt` — never silently wiped; the set restarts empty
33
+ * and still-skewed records re-quarantine on the next fold (the honest
34
+ * degraded direction; the preserved aside file keeps the evidence).
35
+ */
36
+ import fs from 'node:fs';
37
+ import path from 'node:path';
38
+ import { compareHlc } from './TopicPinReplicatedStore.js';
39
+ function sameHlc(a, b) {
40
+ return a.physical === b.physical && a.logical === b.logical && a.node === b.node;
41
+ }
42
+ export class TopicPinSkewQuarantine {
43
+ d;
44
+ entries = [];
45
+ loaded = false;
46
+ constructor(deps) {
47
+ this.d = deps;
48
+ }
49
+ load() {
50
+ if (this.loaded)
51
+ return;
52
+ try {
53
+ if (fs.existsSync(this.d.filePath)) {
54
+ const raw = JSON.parse(fs.readFileSync(this.d.filePath, 'utf-8'));
55
+ if (raw && typeof raw === 'object' && Array.isArray(raw.entries)) {
56
+ this.entries = raw.entries.filter((e) => {
57
+ const r = e;
58
+ return !!r && typeof r.key === 'string' && !!r.hlc
59
+ && typeof r.hlc.physical === 'number' && typeof r.hlc.logical === 'number'
60
+ && typeof r.hlc.node === 'string' && typeof r.origin === 'string';
61
+ });
62
+ }
63
+ }
64
+ }
65
+ catch (err) {
66
+ // Corrupt quarantine set: preserve ASIDE + report loudly, never wipe in place.
67
+ const aside = `${this.d.filePath}.corrupt-${Date.now()}`;
68
+ try {
69
+ fs.renameSync(this.d.filePath, aside);
70
+ }
71
+ catch { /* rename best-effort; the report below still fires */ }
72
+ try {
73
+ this.d.onCorrupt?.(aside, err instanceof Error ? err.message : String(err));
74
+ }
75
+ catch { /* report is observability — never gates */ }
76
+ this.entries = [];
77
+ }
78
+ this.loaded = true;
79
+ }
80
+ persist() {
81
+ const dir = path.dirname(this.d.filePath);
82
+ try {
83
+ fs.mkdirSync(dir, { recursive: true });
84
+ }
85
+ catch { /* @silent-fallback-ok — dir already exists (recursive mkdir); the writeFileSync below throws loudly on a genuinely unwritable dir */ }
86
+ const tmp = `${this.d.filePath}.tmp`;
87
+ fs.writeFileSync(tmp, JSON.stringify({ entries: this.entries }, null, 2));
88
+ fs.renameSync(tmp, this.d.filePath); // atomic swap
89
+ }
90
+ /** Is this exact (key, hlc) pair quarantined? Sticky — immune to clock progress. */
91
+ has(key, hlc) {
92
+ this.load();
93
+ return this.entries.some((e) => e.key === key && sameHlc(e.hlc, hlc));
94
+ }
95
+ /** Quarantine a record. Returns true when NEWLY added (drives the one-per-episode item). */
96
+ add(rec) {
97
+ this.load();
98
+ if (this.has(rec.key, rec.hlc))
99
+ return false;
100
+ const now = (this.d.now ?? (() => new Date()))().toISOString();
101
+ this.entries.push({ key: rec.key, hlc: { ...rec.hlc }, origin: rec.origin, quarantinedAt: now });
102
+ this.persist();
103
+ return true;
104
+ }
105
+ /**
106
+ * Honest supersession (R-r3-2): a NEWER honest record for `key` (higher HLC
107
+ * that passed the gate) makes any quarantined entry with a LOWER hlc dead by
108
+ * ordering — prune those. An entry whose hlc is still HIGHER than the honest
109
+ * winner stays excluded (it would still poison the comparison).
110
+ */
111
+ pruneSuperseded(key, honestWinner) {
112
+ this.load();
113
+ const before = this.entries.length;
114
+ this.entries = this.entries.filter((e) => !(e.key === key && compareHlc(honestWinner, e.hlc) > 0));
115
+ const pruned = before - this.entries.length;
116
+ if (pruned > 0)
117
+ this.persist();
118
+ return pruned;
119
+ }
120
+ /** The deliberate, explicit per-record re-admission (R-r4-1) — NOT the ack path. */
121
+ readmit(key, hlc) {
122
+ this.load();
123
+ const before = this.entries.length;
124
+ this.entries = this.entries.filter((e) => !(e.key === key && sameHlc(e.hlc, hlc)));
125
+ if (this.entries.length === before)
126
+ return false;
127
+ this.persist();
128
+ return true;
129
+ }
130
+ /** All quarantined records (diagnostics / the attention item body / read surfaces). */
131
+ all() {
132
+ this.load();
133
+ return this.entries.map((e) => ({ ...e, hlc: { ...e.hlc } }));
134
+ }
135
+ }
136
+ //# sourceMappingURL=TopicPinSkewQuarantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopicPinSkewQuarantine.js","sourceRoot":"","sources":["../../src/core/TopicPinSkewQuarantine.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,20 @@
1
1
  import type { TopicPlacement } from './PlacementExecutor.js';
2
+ /**
3
+ * U4.1 §2F (Know Your Principal): WHO set the pin — LOCAL-ONLY provenance.
4
+ * `operator` = resolved from the topic's auto-bound VERIFIED operator
5
+ * (TopicOperatorStore) when the authenticated request carried one; `agent` =
6
+ * a Bearer-authed agent-initiated pin (a legitimate pin author). NEVER
7
+ * replicated — the replicated `topic-pin-record` stays deliberately non-PII.
8
+ * Serve-time length-clamped on the Bearer-gated read surface.
9
+ */
10
+ export type TopicPinnedBy = {
11
+ kind: 'operator';
12
+ platform: string;
13
+ uid: string;
14
+ } | {
15
+ kind: 'agent';
16
+ sessionRef: string;
17
+ };
2
18
  /** One persisted pin: the resolved target machine + when it was set. */
3
19
  export interface TopicPin {
4
20
  preferredMachine: string;
@@ -16,12 +32,21 @@ export interface TopicPin {
16
32
  logical: number;
17
33
  node: string;
18
34
  };
35
+ /** U4.1 §2F: local-only pin provenance (never replicated; see TopicPinnedBy). */
36
+ pinnedBy?: TopicPinnedBy;
19
37
  }
20
38
  export interface TopicPlacementPinStoreDeps {
21
39
  /** File the pins persist to (JSON). */
22
40
  filePath: string;
23
41
  /** Wall clock — injectable for tests. Defaults to `Date`. */
24
42
  now?: () => Date;
43
+ /**
44
+ * U4.1 §2C loud durability: fired when a CORRUPT pin file is quarantined
45
+ * aside (the aside path + the parse error). The caller raises the ONE
46
+ * deduped `u41:pin-corrupt:<storeFilePath>` attention item. Optional —
47
+ * absence never gates the quarantine itself.
48
+ */
49
+ onCorrupt?: (asidePath: string, error: string) => void;
25
50
  }
26
51
  export declare class TopicPlacementPinStore {
27
52
  private readonly d;
@@ -32,12 +57,14 @@ export declare class TopicPlacementPinStore {
32
57
  private persist;
33
58
  /** Pin a topic to a machine (a hard pin). Idempotent; refreshes `updatedAt`.
34
59
  * `hlc` (Fix #2) is the skew-proof ordering stamp; pass the same HLC that the
35
- * replicated `topic-pin-record` carried so local and replicated pins compare cleanly. */
60
+ * replicated `topic-pin-record` carried so local and replicated pins compare
61
+ * cleanly (the U4.1 one-HLC funnel `setPinWithOneHlc` does exactly this).
62
+ * `pinnedBy` (U4.1 §2F) is local-only provenance — never replicated. */
36
63
  set(sessionKey: string, preferredMachine: string, pinned?: boolean, hlc?: {
37
64
  physical: number;
38
65
  logical: number;
39
66
  node: string;
40
- }): void;
67
+ }, pinnedBy?: TopicPinnedBy): void;
41
68
  /** The current pin for a topic, or null if unpinned. */
42
69
  get(sessionKey: string): TopicPin | null;
43
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TopicPlacementPinStore.d.ts","sourceRoot":"","sources":["../../src/core/TopicPlacementPinStore.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA6B;IAC/C,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,0BAA0B;IAI5C,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,OAAO;IAQf;;8FAE0F;IAC1F,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,UAAO,EAAE,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOjI,wDAAwD;IACxD,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAKxC;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAK/D,+GAA+G;IAC/G,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOlD,oFAAoF;IACpF,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ/B,yDAAyD;IACzD,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;CAIhC"}
1
+ {"version":3,"file":"TopicPlacementPinStore.d.ts","sourceRoot":"","sources":["../../src/core/TopicPlacementPinStore.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,iFAAiF;IACjF,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA6B;IAC/C,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,0BAA0B;IAI5C,OAAO,CAAC,IAAI;IAyBZ,OAAO,CAAC,OAAO;IAQf;;;;6EAIyE;IACzE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,UAAO,EAAE,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI;IAO3J,wDAAwD;IACxD,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAKxC;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAK/D,+GAA+G;IAC/G,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOlD,oFAAoF;IACpF,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ/B,yDAAyD;IACzD,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;CAIhC"}
@@ -35,8 +35,24 @@ export class TopicPlacementPinStore {
35
35
  }
36
36
  }
37
37
  }
38
- catch {
39
- this.pins = {}; // corrupt file start clean (the pin is advisory, not authoritative)
38
+ catch (err) {
39
+ // U4.1 §2C (fixes defect 3): THIS store is the AUTHORITATIVE local record
40
+ // of operator placement intent (the replicated `topic-pin-record` is the
41
+ // advisory one) — which is exactly why the old wipe-and-persist here was
42
+ // success-shaped TOTAL LOSS. A corrupt file is QUARANTINED ASIDE
43
+ // (preserved, never overwritten), reported loudly via onCorrupt (the ONE
44
+ // deduped `u41:pin-corrupt:<path>` item), and the store resolves to
45
+ // UNKNOWN (no pins) until the operator re-pins or restores.
46
+ const aside = `${this.d.filePath}.corrupt-${Date.now()}`;
47
+ try {
48
+ fs.renameSync(this.d.filePath, aside);
49
+ }
50
+ catch { /* rename best-effort — the report below still fires; a later persist() only lands on the (now absent) canonical path */ }
51
+ try {
52
+ this.d.onCorrupt?.(aside, err instanceof Error ? err.message : String(err));
53
+ }
54
+ catch { /* the report is observability — never gates the load */ }
55
+ this.pins = {};
40
56
  }
41
57
  this.loaded = true;
42
58
  }
@@ -52,11 +68,13 @@ export class TopicPlacementPinStore {
52
68
  }
53
69
  /** Pin a topic to a machine (a hard pin). Idempotent; refreshes `updatedAt`.
54
70
  * `hlc` (Fix #2) is the skew-proof ordering stamp; pass the same HLC that the
55
- * replicated `topic-pin-record` carried so local and replicated pins compare cleanly. */
56
- set(sessionKey, preferredMachine, pinned = true, hlc) {
71
+ * replicated `topic-pin-record` carried so local and replicated pins compare
72
+ * cleanly (the U4.1 one-HLC funnel `setPinWithOneHlc` does exactly this).
73
+ * `pinnedBy` (U4.1 §2F) is local-only provenance — never replicated. */
74
+ set(sessionKey, preferredMachine, pinned = true, hlc, pinnedBy) {
57
75
  this.load();
58
76
  const now = (this.d.now ?? (() => new Date()))().toISOString();
59
- this.pins[sessionKey] = { preferredMachine, pinned, updatedAt: now, ...(hlc ? { hlc } : {}) };
77
+ this.pins[sessionKey] = { preferredMachine, pinned, updatedAt: now, ...(hlc ? { hlc } : {}), ...(pinnedBy ? { pinnedBy } : {}) };
60
78
  this.persist();
61
79
  }
62
80
  /** The current pin for a topic, or null if unpinned. */
@@ -1 +1 @@
1
- {"version":3,"file":"TopicPlacementPinStore.js","sourceRoot":"","sources":["../../src/core/TopicPlacementPinStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TopicPlacementPinStore.js","sourceRoot":"","sources":["../../src/core/TopicPlacementPinStore.ts"],"names":[],"mappings":"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"}
@@ -2324,12 +2324,39 @@ export interface MultiMachineConfig {
2324
2324
  ws3OneVoice?: boolean;
2325
2325
  /** WS3 dwell window (ms) before the election re-evaluates. Default 60000. */
2326
2326
  ws3DwellMs?: number;
2327
- /** WS1.3 ownership reconcile (bounded pin/owner convergence). DARK default. */
2327
+ /** WS1.3 ownership reconcile (bounded pin/owner convergence). Dev-gated
2328
+ * (resolveDevAgentGate) — OMITTED default. Post-U4.1 an explicit `false`
2329
+ * is the operator's DURABLE rollback lever (survives migration). */
2328
2330
  ws13Reconcile?: boolean;
2329
2331
  /** WS1.3 dry-run (logs intended CAS actions without performing them). Default true. */
2330
2332
  ws13DryRun?: boolean;
2331
- /** WS1.3 reconcile tick cadence (ms). Default 30000. */
2333
+ /** WS1.3 reconcile tick cadence (ms). Default 30000 (floor 5000). */
2332
2334
  ws13TickMs?: number;
2335
+ /** WS1.3 pin replication (the topic-pin-record advisory stream + fold read).
2336
+ * Dev-gated (resolveDevAgentGate) — OMITTED default. */
2337
+ ws13PinReplicate?: boolean;
2338
+ /** U4.1 §2.G: pin-stability debounce (ms) before the owner acts on a pin —
2339
+ * exposes the reconciler's existing debounceMs dep. Default 30000. */
2340
+ ws13DebounceMs?: number;
2341
+ /** U4.1 §2.G: transfer deadline (ms) before the owner aborts a transfer
2342
+ * toward an unreachable target (N4 abort). Default 120000. */
2343
+ ws13TransferDeadlineMs?: number;
2344
+ /** U4.1 §2.G: sustained-online hysteresis (ms) gating pin fulfilment AND
2345
+ * Case-A initiation toward a returning machine. Default 120000 (4 ticks). */
2346
+ ws13SustainedOnlineMs?: number;
2347
+ /** U4.1 §2.G: pending-pin age bound (ms) → the ONE deduped fulfil-or-unpin
2348
+ * attention item (`u41:pin-pending-aged`). Default 86400000 (24h). */
2349
+ ws13PendingPinMaxAgeMs?: number;
2350
+ /** U4.1 §2.G: bounded move-initiations per reconciler tick — a lease flap
2351
+ * can never trigger a transfer storm. Default 2. */
2352
+ ws13MaxMovesPerTick?: number;
2353
+ /** U4.1 §2.G: divergence window (ms) of persistent desired≠actual before
2354
+ * `pinState: diverged` + its attention item. Default 600000 (10min). */
2355
+ ws13DivergedWindowMs?: number;
2356
+ /** U4.1 §2.G (R-r3-3): fold byte-guard — on breach the pin fold truncates
2357
+ * NEWEST-FIRST and raises `u41:pin-fold-truncated` (never silent).
2358
+ * Default 67108864 (64MB). */
2359
+ ws13FoldMaxBytes?: number;
2333
2360
  /**
2334
2361
  * WS4.4 "links that survive machine boundaries" (§WS4.4 / F6). When on, the
2335
2362
  * tunnel-fronting machine resolves the actual HOLDER of a `/view/:id` it does