loopforge 2.11.0 → 3.0.0

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 (166) hide show
  1. package/README.md +145 -128
  2. package/dist/canonical-event-writer.d.ts +20 -0
  3. package/dist/canonical-event-writer.d.ts.map +1 -0
  4. package/dist/canonical-event-writer.js +131 -0
  5. package/dist/canonical-event-writer.js.map +1 -0
  6. package/dist/canonical-state.d.ts +20 -16
  7. package/dist/canonical-state.d.ts.map +1 -1
  8. package/dist/canonical-state.js +170 -61
  9. package/dist/canonical-state.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +11 -10
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cognitive-governance.d.ts +48 -0
  14. package/dist/cognitive-governance.d.ts.map +1 -0
  15. package/dist/cognitive-governance.js +226 -0
  16. package/dist/cognitive-governance.js.map +1 -0
  17. package/dist/compiler-subgoals.d.ts +7 -0
  18. package/dist/compiler-subgoals.d.ts.map +1 -0
  19. package/dist/compiler-subgoals.js +93 -0
  20. package/dist/compiler-subgoals.js.map +1 -0
  21. package/dist/derive-id.d.ts +12 -0
  22. package/dist/derive-id.d.ts.map +1 -0
  23. package/dist/derive-id.js +31 -0
  24. package/dist/derive-id.js.map +1 -0
  25. package/dist/evidence-provider.d.ts +23 -21
  26. package/dist/evidence-provider.d.ts.map +1 -1
  27. package/dist/evidence-provider.js +34 -74
  28. package/dist/evidence-provider.js.map +1 -1
  29. package/dist/generate-schema.js +90 -2
  30. package/dist/generate-schema.js.map +1 -1
  31. package/dist/index.d.ts +22 -19
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +15 -16
  34. package/dist/index.js.map +1 -1
  35. package/dist/loop-compiler.d.ts +1 -1
  36. package/dist/loop-compiler.d.ts.map +1 -1
  37. package/dist/loop-compiler.js +250 -337
  38. package/dist/loop-compiler.js.map +1 -1
  39. package/dist/loop-extras-parser.d.ts +2 -2
  40. package/dist/loop-extras-parser.d.ts.map +1 -1
  41. package/dist/loop-extras-parser.js +2 -2
  42. package/dist/loop-extras-parser.js.map +1 -1
  43. package/dist/loop-store.d.ts +20 -58
  44. package/dist/loop-store.d.ts.map +1 -1
  45. package/dist/loop-store.js +232 -309
  46. package/dist/loop-store.js.map +1 -1
  47. package/dist/mcp/server.d.ts +3 -3
  48. package/dist/mcp/server.d.ts.map +1 -1
  49. package/dist/mcp/server.js +83 -13
  50. package/dist/mcp/server.js.map +1 -1
  51. package/dist/mcp/session-projection.d.ts +5 -0
  52. package/dist/mcp/session-projection.d.ts.map +1 -0
  53. package/dist/mcp/session-projection.js +18 -0
  54. package/dist/mcp/session-projection.js.map +1 -0
  55. package/dist/mcp/session-queue.d.ts +3 -0
  56. package/dist/mcp/session-queue.d.ts.map +1 -0
  57. package/dist/mcp/session-queue.js +18 -0
  58. package/dist/mcp/session-queue.js.map +1 -0
  59. package/dist/mcp/session-types.d.ts +72 -0
  60. package/dist/mcp/session-types.d.ts.map +1 -0
  61. package/dist/mcp/session-types.js +2 -0
  62. package/dist/mcp/session-types.js.map +1 -0
  63. package/dist/mcp/session.d.ts +49 -93
  64. package/dist/mcp/session.d.ts.map +1 -1
  65. package/dist/mcp/session.js +544 -245
  66. package/dist/mcp/session.js.map +1 -1
  67. package/dist/mcp/tools.d.ts +26 -1
  68. package/dist/mcp/tools.d.ts.map +1 -1
  69. package/dist/mcp/tools.js +399 -274
  70. package/dist/mcp/tools.js.map +1 -1
  71. package/dist/policy-metrics.d.ts +17 -1
  72. package/dist/policy-metrics.d.ts.map +1 -1
  73. package/dist/policy-metrics.js +164 -1
  74. package/dist/policy-metrics.js.map +1 -1
  75. package/dist/policy.d.ts +34 -18
  76. package/dist/policy.d.ts.map +1 -1
  77. package/dist/policy.js +113 -18
  78. package/dist/policy.js.map +1 -1
  79. package/dist/prompt-assembler.d.ts +5 -3
  80. package/dist/prompt-assembler.d.ts.map +1 -1
  81. package/dist/prompt-assembler.js +126 -77
  82. package/dist/prompt-assembler.js.map +1 -1
  83. package/dist/prompt-policy.d.ts +8 -1
  84. package/dist/prompt-policy.d.ts.map +1 -1
  85. package/dist/prompt-policy.js +26 -8
  86. package/dist/prompt-policy.js.map +1 -1
  87. package/dist/protocol.d.ts +232 -192
  88. package/dist/protocol.d.ts.map +1 -1
  89. package/dist/protocol.js +15 -100
  90. package/dist/protocol.js.map +1 -1
  91. package/dist/replay.d.ts +11 -3
  92. package/dist/replay.d.ts.map +1 -1
  93. package/dist/replay.js +51 -14
  94. package/dist/replay.js.map +1 -1
  95. package/dist/round-commit-store.d.ts +12 -0
  96. package/dist/round-commit-store.d.ts.map +1 -0
  97. package/dist/round-commit-store.js +13 -0
  98. package/dist/round-commit-store.js.map +1 -0
  99. package/dist/round-coordinator.d.ts +25 -18
  100. package/dist/round-coordinator.d.ts.map +1 -1
  101. package/dist/round-coordinator.js +83 -71
  102. package/dist/round-coordinator.js.map +1 -1
  103. package/dist/round-driver.d.ts +14 -10
  104. package/dist/round-driver.d.ts.map +1 -1
  105. package/dist/round-driver.js +9 -13
  106. package/dist/round-driver.js.map +1 -1
  107. package/dist/round-gate.d.ts +31 -0
  108. package/dist/round-gate.d.ts.map +1 -0
  109. package/dist/round-gate.js +259 -0
  110. package/dist/round-gate.js.map +1 -0
  111. package/dist/round-recovery.d.ts +17 -0
  112. package/dist/round-recovery.d.ts.map +1 -0
  113. package/dist/round-recovery.js +117 -0
  114. package/dist/round-recovery.js.map +1 -0
  115. package/dist/round-report.d.ts +16 -0
  116. package/dist/round-report.d.ts.map +1 -0
  117. package/dist/round-report.js +401 -0
  118. package/dist/round-report.js.map +1 -0
  119. package/dist/round-transaction.d.ts +19 -12
  120. package/dist/round-transaction.d.ts.map +1 -1
  121. package/dist/round-transaction.js +102 -88
  122. package/dist/round-transaction.js.map +1 -1
  123. package/dist/runtime-services.d.ts +59 -0
  124. package/dist/runtime-services.d.ts.map +1 -0
  125. package/dist/runtime-services.js +460 -0
  126. package/dist/runtime-services.js.map +1 -0
  127. package/dist/storage.d.ts +3 -9
  128. package/dist/storage.d.ts.map +1 -1
  129. package/dist/storage.js +6 -17
  130. package/dist/storage.js.map +1 -1
  131. package/dist/token-utils.d.ts +9 -8
  132. package/dist/token-utils.d.ts.map +1 -1
  133. package/dist/token-utils.js +50 -10
  134. package/dist/token-utils.js.map +1 -1
  135. package/dist/vault-format.d.ts +4 -0
  136. package/dist/vault-format.d.ts.map +1 -0
  137. package/dist/vault-format.js +4 -0
  138. package/dist/vault-format.js.map +1 -0
  139. package/dist/vault-types.d.ts +24 -0
  140. package/dist/vault-types.d.ts.map +1 -0
  141. package/dist/vault-types.js +2 -0
  142. package/dist/vault-types.js.map +1 -0
  143. package/loop_policy.json +10 -12
  144. package/loopforge-policy.json +340 -0
  145. package/package.json +12 -6
  146. package/skills/perception/SKILL.md +199 -164
  147. package/dist/backends/interface.d.ts +0 -39
  148. package/dist/backends/interface.d.ts.map +0 -1
  149. package/dist/backends/interface.js +0 -6
  150. package/dist/backends/interface.js.map +0 -1
  151. package/dist/enforcement-gate.d.ts +0 -71
  152. package/dist/enforcement-gate.d.ts.map +0 -1
  153. package/dist/enforcement-gate.js +0 -744
  154. package/dist/enforcement-gate.js.map +0 -1
  155. package/dist/engine.d.ts +0 -59
  156. package/dist/engine.d.ts.map +0 -1
  157. package/dist/engine.js +0 -596
  158. package/dist/engine.js.map +0 -1
  159. package/dist/self-eval.d.ts +0 -23
  160. package/dist/self-eval.d.ts.map +0 -1
  161. package/dist/self-eval.js +0 -181
  162. package/dist/self-eval.js.map +0 -1
  163. package/dist/verification-gate.d.ts +0 -56
  164. package/dist/verification-gate.d.ts.map +0 -1
  165. package/dist/verification-gate.js +0 -563
  166. package/dist/verification-gate.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;uEACuE;AACvE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAElD;AAED;+EAC+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrE;AAID,0EAA0E;AAC1E,wBAAgB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAKzE;AAID;kFACkF;AAClF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAID;;iDAEiD;AACjD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAIjE"}
1
+ {"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH;;+CAE+C;AAC/C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAmBlD;AAED;+EAC+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrE;AAID,0EAA0E;AAC1E,wBAAgB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAKzE;AAID;kFACkF;AAClF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAID,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAIjE"}
@@ -3,15 +3,57 @@
3
3
  * Single source of truth for tokenization and similarity functions used
4
4
  * by the compiler, verification gate, and canonical state renderer.
5
5
  *
6
- * The Unicode token regex covers CJK Unified Ideographs (U+4E00–U+9FFF)
7
- * plus CJK Extension A (U+3400–U+4DBF), ensuring consistent similarity
8
- * scores across all modules.
6
+ * Latin alphanumerics tokenize as whole words; consecutive CJK characters
7
+ * tokenize as overlapping 2-grams (a lone CJK character is its own token)
8
+ * so CJK similarity takes intermediate values instead of collapsing to
9
+ * 0/1. The ranges cover Unified Ideographs, Compatibility Ideographs and
10
+ * Extensions B–F (surrogate-pair code points the legacy regex missed).
9
11
  */
10
12
  // ── Tokenization & similarity ──────────────────────────────────────────────
11
- /** Tokenize text into a set of lowercase words and CJK characters.
12
- * Regex covers Latin alphanumeric + CJK Unified + CJK Extension A. */
13
+ /** CJK ranges: Unified Ideographs (U+3400–U+9FFF), Compatibility Ideographs
14
+ * (U+F900–U+FAFF), Extensions B–F (U+20000–U+2FA1F). */
15
+ function isCjkCodePoint(code) {
16
+ return (code >= 0x3400 && code <= 0x9fff)
17
+ || (code >= 0xf900 && code <= 0xfaff)
18
+ || (code >= 0x20000 && code <= 0x2fa1f);
19
+ }
20
+ /** Tokenize text into a set of lowercase ASCII words and CJK bigrams.
21
+ * Scripts are tokenized independently, so mixed text yields per-script
22
+ * tokens (e.g. "修复bug重入" → {修复, bug, 重入}). */
13
23
  export function tokenize(text) {
14
- return new Set(text.toLowerCase().match(/[a-z0-9㐀-鿿]+/g) ?? []);
24
+ const tokens = new Set();
25
+ let ascii = "";
26
+ let cjk = [];
27
+ const flushAscii = () => { if (ascii.length > 0) {
28
+ tokens.add(ascii);
29
+ ascii = "";
30
+ } };
31
+ const flushCjk = () => {
32
+ if (cjk.length === 1)
33
+ tokens.add(cjk[0]);
34
+ else
35
+ for (let i = 0; i + 1 < cjk.length; i++)
36
+ tokens.add(cjk[i] + cjk[i + 1]);
37
+ cjk = [];
38
+ };
39
+ for (const ch of text.toLowerCase()) {
40
+ const code = ch.codePointAt(0) ?? 0;
41
+ if ((code >= 0x30 && code <= 0x39) || (code >= 0x61 && code <= 0x7a)) {
42
+ flushCjk();
43
+ ascii += ch;
44
+ }
45
+ else if (isCjkCodePoint(code)) {
46
+ flushAscii();
47
+ cjk.push(ch);
48
+ }
49
+ else {
50
+ flushAscii();
51
+ flushCjk();
52
+ }
53
+ }
54
+ flushAscii();
55
+ flushCjk();
56
+ return tokens;
15
57
  }
16
58
  /** Jaccard similarity in [0, 1]. Returns 1 when either set is empty
17
59
  * (empty descriptions never match anything, so they don't false-positive). */
@@ -41,11 +83,9 @@ export function isRecord(value) {
41
83
  return value !== null && typeof value === "object" && !Array.isArray(value);
42
84
  }
43
85
  // ── Vault entry helpers ────────────────────────────────────────────────────
44
- /** Extract the round number from a vault entry-like object by reading
45
- * `loop_lineage.round` (with `lineage.round` fallback). Returns 0 if
46
- * the entry has no recognizable round field. */
86
+ /** Extract the round number from the canonical `loop_lineage.round` field. */
47
87
  export function entryRound(entry) {
48
- const lin = (entry.loop_lineage ?? entry.lineage ?? {});
88
+ const lin = (entry.loop_lineage ?? {});
49
89
  const rnd = lin.round;
50
90
  return typeof rnd === "number" && Number.isInteger(rnd) ? rnd : 0;
51
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAE9E;uEACuE;AACvE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa;IAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,YAAY,EAAE,CAAC;IACxD,OAAO,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,UAAU,MAAM,CAAC,MAAwC;IAC7D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM;aACtB,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;aAC7D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,+EAA+E;AAE/E;kFACkF;AAClF,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,8EAA8E;AAE9E;;iDAEiD;AACjD,MAAM,UAAU,UAAU,CAAC,KAA8B;IACvD,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;IACnF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACtB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../src/token-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Stable storage format identifiers shared by persistence modules. */
2
+ export declare const LOOP_STORE_FORMAT: "loopforge.store";
3
+ export declare const LOOP_EVENT_FORMAT: "loopforge.event";
4
+ //# sourceMappingURL=vault-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-format.d.ts","sourceRoot":"","sources":["../src/vault-format.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,EAAG,iBAA0B,CAAC;AAC5D,eAAO,MAAM,iBAAiB,EAAG,iBAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Stable storage format identifiers shared by persistence modules. */
2
+ export const LOOP_STORE_FORMAT = "loopforge.store";
3
+ export const LOOP_EVENT_FORMAT = "loopforge.event";
4
+ //# sourceMappingURL=vault-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-format.js","sourceRoot":"","sources":["../src/vault-format.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAA0B,CAAC;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAA0B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** Shared durable event shape, independent from backend adapters. */
2
+ export interface VaultEntry {
3
+ id?: string;
4
+ event_sequence?: number;
5
+ task_id?: string;
6
+ format?: "loopforge.event";
7
+ is_active?: boolean;
8
+ timestamp?: string;
9
+ user_intent?: string;
10
+ task_type?: string;
11
+ quality_score?: number;
12
+ success?: boolean;
13
+ skill_used?: string;
14
+ loop_id?: string;
15
+ loop_lineage?: Record<string, unknown>;
16
+ loop_objective?: Record<string, unknown> | null;
17
+ task?: string;
18
+ output_summary?: string;
19
+ constraint_violations?: string[];
20
+ tags?: string[];
21
+ full_prompt?: string;
22
+ [key: string]: unknown;
23
+ }
24
+ //# sourceMappingURL=vault-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-types.d.ts","sourceRoot":"","sources":["../src/vault-types.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vault-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-types.js","sourceRoot":"","sources":["../src/vault-types.ts"],"names":[],"mappings":""}
package/loop_policy.json CHANGED
@@ -1,11 +1,15 @@
1
1
  {
2
- "version": "2",
3
- "constraints": { "retire_window": 3 },
2
+ "version": "stable",
3
+ "constraints": {},
4
4
  "summary": { "window": 5, "health_check_interval": 1, "milestone_interval": 20, "max_milestones": 10, "enable_loop_synthesis": true },
5
- "engine": { "feedback_flush_interval": 5, "max_circuit_breaker": 3, "max_rounds": 20 },
5
+ "engine": { "max_circuit_breaker": 3, "max_rounds": 100, "enforcement_escalation_enabled": true, "backtrack_enabled": true, "backtrack_max_depth": 3, "backtrack_preserve_discoveries": true, "drift_clarification_max_streak": 3, "max_rejections": 3 },
6
6
  "prompt": {
7
7
  "injection_mode": "adaptive",
8
8
  "full_refresh_interval": 0,
9
+ "adaptive_refresh": true,
10
+ "max_l1_streak": 6,
11
+ "stale_round_threshold": 3,
12
+ "min_meaningful_sections": 4,
9
13
  "l0_max_chars": 3000,
10
14
  "l1_max_chars": 7000,
11
15
  "l2_max_chars": 18000,
@@ -14,25 +18,21 @@
14
18
  "l2_adaptive_milestone_factor": 1000,
15
19
  "l2_adaptive_max_chars": 40000,
16
20
  "l2_adaptive_subgoal_factor": 100,
17
- "base_prompt_version": "2.0.0"
21
+ "base_prompt_version": "stable"
18
22
  },
19
23
  "backend": { "root_dir": ".loopforge" },
20
24
  "evolution": {
21
25
  "max_discovered_constraints_per_round": 5,
22
26
  "max_active_constraints": 15,
23
27
  "max_objective_versions": 10,
24
- "progress_stall_threshold": 0.05,
25
- "progress_stall_rounds": 2,
26
- "progress_mismatch_threshold": 0.3,
28
+ "failed_pattern_match_threshold": 0.6,
27
29
  "criteria_dedup_threshold": 0.45,
28
30
  "subgoal_dedup_threshold": 0.6,
29
31
  "subgoal_match_threshold": 0.5,
30
- "subgoal_auto_in_progress_threshold": 0.4,
31
32
  "intent_drift_threshold": 0.15,
32
33
  "subgoal_auto_complete_threshold": 0.4,
33
34
  "constraint_match_threshold": 0.5,
34
35
  "subgoal_drift_alignment_threshold": 0.3,
35
- "subgoal_stale_rounds": 10,
36
36
  "max_subgoals_in_prompt": 10,
37
37
  "max_done_subgoals_in_prompt": 5,
38
38
  "constraint_inactive_rounds": 15
@@ -40,9 +40,7 @@
40
40
  "checkpoint": { "max_carried_constraints": 10, "outcome_max_chars": 200 },
41
41
  "state_file": {
42
42
  "enabled": true,
43
- "directory": ".loopforge/state",
44
- "max_checkpoints": 5,
45
- "max_summary_rounds": 5
43
+ "directory": ".loopforge/state"
46
44
  },
47
45
  "evidence": { "providers": ["git"], "timeout_ms": 120000, "commands": [] },
48
46
  "mcp": {
@@ -0,0 +1,340 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://loopforge.dev/loopforge-policy.json",
4
+ "title": "LoopForge Policy",
5
+ "description": "Stable configuration contract for loop_policy.json.",
6
+ "type": "object",
7
+ "properties": {
8
+ "version": {
9
+ "type": "string"
10
+ },
11
+ "constraints": {
12
+ "type": "object",
13
+ "properties": {},
14
+ "required": [],
15
+ "additionalProperties": false
16
+ },
17
+ "summary": {
18
+ "type": "object",
19
+ "properties": {
20
+ "window": {
21
+ "type": "number"
22
+ },
23
+ "health_check_interval": {
24
+ "type": "number"
25
+ },
26
+ "milestone_interval": {
27
+ "type": "number"
28
+ },
29
+ "max_milestones": {
30
+ "type": "number"
31
+ },
32
+ "enable_loop_synthesis": {
33
+ "type": "boolean"
34
+ }
35
+ },
36
+ "required": [
37
+ "window",
38
+ "health_check_interval",
39
+ "milestone_interval",
40
+ "max_milestones",
41
+ "enable_loop_synthesis"
42
+ ],
43
+ "additionalProperties": false
44
+ },
45
+ "engine": {
46
+ "type": "object",
47
+ "properties": {
48
+ "max_circuit_breaker": {
49
+ "type": "number"
50
+ },
51
+ "max_rounds": {
52
+ "type": "number"
53
+ },
54
+ "enforcement_escalation_enabled": {
55
+ "type": "boolean"
56
+ },
57
+ "backtrack_enabled": {
58
+ "type": "boolean"
59
+ },
60
+ "backtrack_max_depth": {
61
+ "type": "number"
62
+ },
63
+ "backtrack_preserve_discoveries": {
64
+ "type": "boolean"
65
+ },
66
+ "drift_clarification_max_streak": {
67
+ "type": "number"
68
+ },
69
+ "max_rejections": {
70
+ "type": "number"
71
+ }
72
+ },
73
+ "required": [
74
+ "max_circuit_breaker",
75
+ "max_rounds",
76
+ "enforcement_escalation_enabled",
77
+ "backtrack_enabled",
78
+ "backtrack_max_depth",
79
+ "backtrack_preserve_discoveries",
80
+ "drift_clarification_max_streak",
81
+ "max_rejections"
82
+ ],
83
+ "additionalProperties": false
84
+ },
85
+ "prompt": {
86
+ "type": "object",
87
+ "properties": {
88
+ "injection_mode": {
89
+ "type": "string"
90
+ },
91
+ "full_refresh_interval": {
92
+ "type": "number"
93
+ },
94
+ "adaptive_refresh": {
95
+ "type": "boolean"
96
+ },
97
+ "max_l1_streak": {
98
+ "type": "number"
99
+ },
100
+ "stale_round_threshold": {
101
+ "type": "number"
102
+ },
103
+ "min_meaningful_sections": {
104
+ "type": "number"
105
+ },
106
+ "l0_max_chars": {
107
+ "type": "number"
108
+ },
109
+ "l1_max_chars": {
110
+ "type": "number"
111
+ },
112
+ "l2_max_chars": {
113
+ "type": "number"
114
+ },
115
+ "l2_adaptive_enabled": {
116
+ "type": "boolean"
117
+ },
118
+ "l2_adaptive_round_factor": {
119
+ "type": "number"
120
+ },
121
+ "l2_adaptive_milestone_factor": {
122
+ "type": "number"
123
+ },
124
+ "l2_adaptive_max_chars": {
125
+ "type": "number"
126
+ },
127
+ "l2_adaptive_subgoal_factor": {
128
+ "type": "number"
129
+ },
130
+ "l2_pointer_enabled": {
131
+ "type": "boolean"
132
+ },
133
+ "max_emphasize_l2": {
134
+ "type": "number"
135
+ },
136
+ "max_emphasize_l1": {
137
+ "type": "number"
138
+ },
139
+ "max_expand_l1": {
140
+ "type": "number"
141
+ },
142
+ "max_confusion_points": {
143
+ "type": "number"
144
+ },
145
+ "base_prompt_version": {
146
+ "type": "string"
147
+ }
148
+ },
149
+ "required": [
150
+ "injection_mode",
151
+ "full_refresh_interval",
152
+ "adaptive_refresh",
153
+ "max_l1_streak",
154
+ "stale_round_threshold",
155
+ "min_meaningful_sections",
156
+ "l0_max_chars",
157
+ "l1_max_chars",
158
+ "l2_max_chars",
159
+ "l2_adaptive_enabled",
160
+ "l2_adaptive_round_factor",
161
+ "l2_adaptive_milestone_factor",
162
+ "l2_adaptive_max_chars",
163
+ "l2_adaptive_subgoal_factor",
164
+ "l2_pointer_enabled",
165
+ "max_emphasize_l2",
166
+ "max_emphasize_l1",
167
+ "max_expand_l1",
168
+ "max_confusion_points",
169
+ "base_prompt_version"
170
+ ],
171
+ "additionalProperties": false
172
+ },
173
+ "backend": {
174
+ "type": "object",
175
+ "properties": {
176
+ "root_dir": {
177
+ "type": "string"
178
+ }
179
+ },
180
+ "required": [
181
+ "root_dir"
182
+ ],
183
+ "additionalProperties": false
184
+ },
185
+ "evolution": {
186
+ "type": "object",
187
+ "properties": {
188
+ "max_discovered_constraints_per_round": {
189
+ "type": "number"
190
+ },
191
+ "max_active_constraints": {
192
+ "type": "number"
193
+ },
194
+ "max_objective_versions": {
195
+ "type": "number"
196
+ },
197
+ "failed_pattern_match_threshold": {
198
+ "type": "number"
199
+ },
200
+ "intent_drift_threshold": {
201
+ "type": "number"
202
+ },
203
+ "criteria_dedup_threshold": {
204
+ "type": "number"
205
+ },
206
+ "subgoal_dedup_threshold": {
207
+ "type": "number"
208
+ },
209
+ "subgoal_match_threshold": {
210
+ "type": "number"
211
+ },
212
+ "subgoal_auto_complete_threshold": {
213
+ "type": "number"
214
+ },
215
+ "constraint_match_threshold": {
216
+ "type": "number"
217
+ },
218
+ "subgoal_drift_alignment_threshold": {
219
+ "type": "number"
220
+ },
221
+ "max_subgoals_in_prompt": {
222
+ "type": "number"
223
+ },
224
+ "max_done_subgoals_in_prompt": {
225
+ "type": "number"
226
+ },
227
+ "constraint_inactive_rounds": {
228
+ "type": "number"
229
+ },
230
+ "constraint_id_enabled": {
231
+ "type": "boolean"
232
+ }
233
+ },
234
+ "required": [
235
+ "max_discovered_constraints_per_round",
236
+ "max_active_constraints",
237
+ "max_objective_versions",
238
+ "failed_pattern_match_threshold",
239
+ "intent_drift_threshold",
240
+ "criteria_dedup_threshold",
241
+ "subgoal_dedup_threshold",
242
+ "subgoal_match_threshold",
243
+ "subgoal_auto_complete_threshold",
244
+ "constraint_match_threshold",
245
+ "subgoal_drift_alignment_threshold",
246
+ "max_subgoals_in_prompt",
247
+ "max_done_subgoals_in_prompt",
248
+ "constraint_inactive_rounds",
249
+ "constraint_id_enabled"
250
+ ],
251
+ "additionalProperties": false
252
+ },
253
+ "checkpoint": {
254
+ "type": "object",
255
+ "properties": {
256
+ "max_carried_constraints": {
257
+ "type": "number"
258
+ },
259
+ "outcome_max_chars": {
260
+ "type": "number"
261
+ }
262
+ },
263
+ "required": [
264
+ "max_carried_constraints",
265
+ "outcome_max_chars"
266
+ ],
267
+ "additionalProperties": false
268
+ },
269
+ "state_file": {
270
+ "type": "object",
271
+ "properties": {
272
+ "enabled": {
273
+ "type": "boolean"
274
+ },
275
+ "directory": {
276
+ "type": "string"
277
+ }
278
+ },
279
+ "required": [
280
+ "enabled",
281
+ "directory"
282
+ ],
283
+ "additionalProperties": false
284
+ },
285
+ "evidence": {
286
+ "type": "object",
287
+ "properties": {
288
+ "providers": {
289
+ "type": "array",
290
+ "items": {
291
+ "type": "string"
292
+ }
293
+ },
294
+ "timeout_ms": {
295
+ "type": "number"
296
+ },
297
+ "commands": {
298
+ "type": "array",
299
+ "items": {}
300
+ }
301
+ },
302
+ "required": [
303
+ "providers",
304
+ "timeout_ms",
305
+ "commands"
306
+ ],
307
+ "additionalProperties": false
308
+ },
309
+ "mcp": {
310
+ "type": "object",
311
+ "properties": {
312
+ "session_lease_ms": {
313
+ "type": "number"
314
+ },
315
+ "session_lease_renew_interval_ms": {
316
+ "type": "number"
317
+ }
318
+ },
319
+ "required": [
320
+ "session_lease_ms",
321
+ "session_lease_renew_interval_ms"
322
+ ],
323
+ "additionalProperties": false
324
+ }
325
+ },
326
+ "required": [
327
+ "version",
328
+ "constraints",
329
+ "summary",
330
+ "engine",
331
+ "prompt",
332
+ "backend",
333
+ "evolution",
334
+ "checkpoint",
335
+ "state_file",
336
+ "evidence",
337
+ "mcp"
338
+ ],
339
+ "additionalProperties": false
340
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loopforge",
3
- "version": "2.11.0",
3
+ "version": "3.0.0",
4
4
  "description": "External cognitive infrastructure for AI coding agents — breaks the summary cascade, provides independent verification, and enables model-directed prompt prioritization for 100+ round agent loops.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -31,15 +31,21 @@
31
31
  "!dist/tests/",
32
32
  "skills",
33
33
  "loop_policy.json",
34
+ "loopforge-policy.json",
34
35
  "LICENSE"
35
36
  ],
36
37
  "scripts": {
37
- "build": "tsc && node dist/generate-schema.js",
38
- "generate-schema": "tsc && node dist/generate-schema.js",
39
- "test": "tsc && node dist/generate-schema.js && node --test --test-concurrency=1 dist/tests/*.test.js",
40
- "test:watch": "tsc && node --test --watch dist/tests/*.test.js",
38
+ "build": "npm run clean:dist && tsc && node dist/generate-schema.js",
39
+ "generate-schema": "npm run clean:dist && tsc && node dist/generate-schema.js",
40
+ "test": "npm run clean:dist && tsc && node dist/generate-schema.js && node --test --test-concurrency=1 dist/tests/*.test.js",
41
+ "test:watch": "npm run clean:dist && tsc && node --test --watch dist/tests/*.test.js",
42
+ "test:long-horizon": "npm run clean:dist && tsc && node --test --test-concurrency=1 dist/tests/long-horizon-reconstruction.test.js",
43
+ "clean:dist": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
41
44
  "check": "tsc --noEmit",
42
- "prepack": "npm run build"
45
+ "check:hygiene": "node scripts/check-repository-hygiene.mjs",
46
+ "verify:artifacts": "node scripts/verify-artifacts.mjs",
47
+ "release:check": "npm run check && npm run check:hygiene && npm test && npm run verify:artifacts && npm --cache ../.npm-cache pack --dry-run --json --ignore-scripts",
48
+ "prepack": "npm run verify:artifacts && npm run build"
43
49
  },
44
50
  "repository": {
45
51
  "type": "git",