@cassiomc1/forgeloop 1.13.0 → 2.0.0-rc.2

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 (395) hide show
  1. package/AGENT_COMPATIBILITY.md +8 -0
  2. package/CONTRIBUTING.md +11 -7
  3. package/DOCS_INDEX.md +37 -4
  4. package/ENG/c-development-eng.md +2 -2
  5. package/ENG/cpp-development-eng.md +2 -2
  6. package/ENG/dotnet-aspnetcore-development-eng.md +7 -1
  7. package/ENG/flutter-development-eng.md +4 -2
  8. package/ENG/go-development-eng.md +2 -2
  9. package/ENG/java-development-eng.md +3 -3
  10. package/ENG/nodejs-backend-development-eng.md +10 -6
  11. package/ENG/php-development-eng.md +3 -3
  12. package/ENG/python-development-eng.md +205 -0
  13. package/ENG/rust-development-eng.md +42 -1
  14. package/ENG/sec-code-eng.md +7 -7
  15. package/ENG/sql-development-eng.md +4 -4
  16. package/ENG/swift-development-eng.md +5 -4
  17. package/ENG/test-code-eng.md +1 -1
  18. package/ENG/typescript-development-eng.md +4 -4
  19. package/EXECUTION_STATE.md +12 -0
  20. package/GUIDE_ROUTER.md +6 -0
  21. package/LICENSE +133 -21
  22. package/LOOP_ENGINEERING.md +28 -2
  23. package/LOOP_SYSTEM_DESIGN.md +10 -10
  24. package/ORCHESTRATOR_INTEGRATION.md +9 -5
  25. package/PROTOCOL_INTEGRATION.md +55 -2
  26. package/README.md +63 -59
  27. package/TERMINOLOGY.md +2 -0
  28. package/THIRD_PARTY_NOTICES.md +3 -4
  29. package/THREAT_MODEL.md +140 -1
  30. package/completions/_forgeloop +29 -3
  31. package/completions/forgeloop.bash +55 -3
  32. package/completions/forgeloop.fish +183 -1
  33. package/docs/ADVISORY_CONTEXT.md +25 -0
  34. package/docs/AGENT_BROWSER_ADAPTER.md +81 -0
  35. package/docs/AGENT_BROWSER_VERIFICATION.md +6 -0
  36. package/docs/AGENT_PROTOCOL_SUMMARY.md +74 -39
  37. package/docs/AGENT_SKILL.md +66 -0
  38. package/docs/ARTIFACT_REFERENCE.md +171 -35
  39. package/docs/AUDIT_UX.md +46 -0
  40. package/docs/BROWSER_VERIFICATION.md +136 -0
  41. package/docs/CLI_REFERENCE.md +512 -8
  42. package/docs/CODE_ATTESTATION.md +2 -2
  43. package/docs/DOCUMENTATION_GUIDE.md +34 -11
  44. package/docs/GETTING_STARTED.md +3 -3
  45. package/docs/JEV_BENCHMARKS.md +31 -0
  46. package/docs/MODEL_ROUTING.md +37 -0
  47. package/docs/OPENSRC_ADAPTER.md +241 -0
  48. package/docs/PACKAGE_CONTENTS.md +46 -18
  49. package/docs/PROVIDERS.md +126 -0
  50. package/docs/PROVIDER_ARCHITECTURE.md +199 -0
  51. package/docs/RECIPES.md +9 -0
  52. package/docs/RELEASE_CHECKLIST.md +116 -12
  53. package/docs/SECURITY_REVIEW.md +71 -0
  54. package/docs/SELF_HOSTED_TESTS.md +121 -0
  55. package/docs/SEMANTIC_DECISION_PLANE.md +71 -0
  56. package/docs/TEST_INTELLIGENCE.md +29 -0
  57. package/docs/TEST_PRUNING.md +14 -0
  58. package/docs/TROUBLESHOOTING.md +198 -1
  59. package/docs/UNIVERSAL_INTEGRATION.md +31 -0
  60. package/docs/assets/diagrams/forgeloop-code-attestation-flow.html +2 -2
  61. package/docs/assets/diagrams/forgeloop-code-attestation-flow.receipt.json +5 -5
  62. package/docs/assets/diagrams/forgeloop-code-attestation-flow.svg +1 -1
  63. package/docs/assets/diagrams/forgeloop-engineering-flow.html +39 -26
  64. package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
  65. package/docs/assets/diagrams/forgeloop-engineering-flow.svg +26 -26
  66. package/docs/assets/diagrams/forgeloop-verification-trust-flow.html +2 -1
  67. package/docs/assets/diagrams/forgeloop-verification-trust-flow.receipt.json +5 -5
  68. package/docs/assets/diagrams/forgeloop-verification-trust-flow.svg +1 -1
  69. package/docs/diagrams/README.md +13 -9
  70. package/docs/diagrams/forgeloop-code-attestation-flow.workflow.json +1 -1
  71. package/docs/diagrams/forgeloop-engineering-flow.workflow.json +24 -19
  72. package/docs/diagrams/forgeloop-verification-trust-flow.workflow.json +1 -0
  73. package/docs/diagrams/reviews/forgeloop-code-attestation-flow.review.json +4 -4
  74. package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +4 -4
  75. package/docs/diagrams/reviews/forgeloop-verification-trust-flow.review.json +4 -4
  76. package/docs/documentation-manifest.json +774 -16
  77. package/docs/protocol-requirements.json +24 -0
  78. package/package.json +43 -11
  79. package/schemas/config.schema.json +14 -0
  80. package/schemas/context-plan.schema.json +18 -0
  81. package/schemas/semantic-decision.schema.json +46 -0
  82. package/schemas/task-bundle.schema.json +7 -2
  83. package/schemas/test-utility.schema.json +44 -0
  84. package/scripts/CI_VALIDATORS.md +6 -6
  85. package/scripts/benchmark-jev.mjs +5 -0
  86. package/scripts/benchmark-test-intelligence.mjs +4 -0
  87. package/scripts/generate-agent-protocol-summary.mjs +6 -3
  88. package/scripts/generate-forgeloop-skill.mjs +133 -0
  89. package/scripts/jev-smoke.mjs +19 -0
  90. package/scripts/run-mcp-clean-tests.mjs +30 -0
  91. package/skills/forgeloop/README.md +9 -0
  92. package/skills/forgeloop/SKILL.md +77 -0
  93. package/skills/forgeloop/references/lifecycle.md +9 -0
  94. package/skills/forgeloop/references/recovery.md +7 -0
  95. package/skills/forgeloop/references/verification.md +7 -0
  96. package/src/adapters/agent-browser/assertions.js +47 -0
  97. package/src/adapters/agent-browser/commands.js +54 -0
  98. package/src/adapters/agent-browser/index.js +3 -0
  99. package/src/adapters/agent-browser/locator.js +40 -0
  100. package/src/adapters/agent-browser/process.js +215 -0
  101. package/src/adapters/agent-browser/provider.js +316 -0
  102. package/src/adapters/emulated-services/constants.js +24 -0
  103. package/src/adapters/emulated-services/index.js +7 -0
  104. package/src/adapters/emulated-services/process.js +162 -0
  105. package/src/adapters/emulated-services/provider.js +289 -0
  106. package/src/adapters/opensrc/normalize.js +90 -0
  107. package/src/adapters/opensrc/process.js +248 -0
  108. package/src/adapters/opensrc/provider.js +338 -0
  109. package/src/adapters/opensrc/search.js +264 -0
  110. package/src/adapters/temporary-paths.js +18 -0
  111. package/src/adapters/typesafe/client.js +28 -0
  112. package/src/adapters/typesafe/engine.js +63 -0
  113. package/src/adapters/typesafe/normalize.js +41 -0
  114. package/src/cli.js +218 -174
  115. package/src/commands/action-show.js +5 -2
  116. package/src/commands/advance.js +5 -1
  117. package/src/commands/baseline.js +13 -11
  118. package/src/commands/checkpoint-revalidate.js +192 -0
  119. package/src/commands/complete.js +19 -3
  120. package/src/commands/context-plan.js +38 -0
  121. package/src/commands/contract-create.js +266 -0
  122. package/src/commands/contract-revise.js +236 -0
  123. package/src/commands/decision-show.js +14 -0
  124. package/src/commands/decision-status.js +22 -0
  125. package/src/commands/discover.js +41 -0
  126. package/src/commands/doctor.js +51 -13
  127. package/src/commands/gate-record.js +194 -0
  128. package/src/commands/gate-revalidate.js +135 -0
  129. package/src/commands/handoff-list.js +6 -1
  130. package/src/commands/handoff-show.js +6 -1
  131. package/src/commands/migrate-protocol.js +2 -2
  132. package/src/commands/model-route.js +40 -0
  133. package/src/commands/next.js +7 -1
  134. package/src/commands/policy-diff.js +25 -4
  135. package/src/commands/progress.js +17 -11
  136. package/src/commands/record-diagnosis.js +3 -0
  137. package/src/commands/route.js +146 -18
  138. package/src/commands/semantic-plan.js +41 -0
  139. package/src/commands/status.js +6 -1
  140. package/src/commands/storage-backup.js +15 -0
  141. package/src/commands/storage-migrate.js +5 -0
  142. package/src/commands/storage-migration-resume.js +5 -0
  143. package/src/commands/storage-migration-status.js +44 -0
  144. package/src/commands/storage-restore-resume.js +7 -0
  145. package/src/commands/storage-restore.js +8 -0
  146. package/src/commands/task-abandon.js +224 -0
  147. package/src/commands/task-list.js +8 -43
  148. package/src/commands/task-migrate-contract-bootstrap-repair.js +288 -0
  149. package/src/commands/task-migrate.js +3 -3
  150. package/src/commands/task-recover.js +10 -2
  151. package/src/commands/task-repair-contract-bootstrap.js +263 -0
  152. package/src/commands/task-scope.js +18 -2
  153. package/src/commands/task-show.js +16 -2
  154. package/src/commands/test-inventory.js +5 -0
  155. package/src/commands/test-prune-plan.js +5 -0
  156. package/src/commands/test-prune-probe.js +5 -0
  157. package/src/commands/test-utility.js +5 -0
  158. package/src/commands/validate-protocol.js +39 -15
  159. package/src/commands/validate-receipt.js +8 -1
  160. package/src/config/guides.json +4 -0
  161. package/src/core/action-ledger-projection.js +10 -3
  162. package/src/core/actions.js +38 -75
  163. package/src/core/activation.js +11 -3
  164. package/src/core/approvals.js +17 -51
  165. package/src/core/artifact-registry.js +83 -2
  166. package/src/core/artifacts.js +81 -27
  167. package/src/core/attachment-paths.js +45 -0
  168. package/src/core/attestation-coverage.js +6 -1
  169. package/src/core/attestation-verifier.js +21 -2
  170. package/src/core/attestation.js +17 -6
  171. package/src/core/audit-ux.js +514 -0
  172. package/src/core/audit.js +6 -1
  173. package/src/core/browser-verification/constants.js +149 -0
  174. package/src/core/browser-verification/normalize.js +254 -0
  175. package/src/core/browser-verification/provider.js +519 -0
  176. package/src/core/browser-verification/service.js +115 -0
  177. package/src/core/bundles.js +160 -66
  178. package/src/core/checkpoint-revalidation.js +321 -0
  179. package/src/core/cli-command-definitions.js +350 -7
  180. package/src/core/code-manifest.js +9 -3
  181. package/src/core/command-executors.js +274 -108
  182. package/src/core/command-input.js +136 -44
  183. package/src/core/completion-artifacts.js +85 -34
  184. package/src/core/completion-ownership.js +19 -8
  185. package/src/core/completion-recovery-rebind.js +11 -1
  186. package/src/core/completion.js +64 -15
  187. package/src/core/config.js +3 -0
  188. package/src/core/conformance.js +2 -1
  189. package/src/core/context-compiler/budget.js +9 -0
  190. package/src/core/context-compiler/candidates.js +39 -0
  191. package/src/core/context-compiler/compiler.js +63 -0
  192. package/src/core/context-compiler/fingerprint.js +11 -0
  193. package/src/core/context-compiler/policy.js +13 -0
  194. package/src/core/context-compiler/result.js +23 -0
  195. package/src/core/continuity-lint.js +13 -2
  196. package/src/core/continuity-reconciliation.js +16 -3
  197. package/src/core/continuity.js +16 -8
  198. package/src/core/contract-bootstrap-recovery.js +656 -0
  199. package/src/core/contract-revision.js +209 -0
  200. package/src/core/decision/artifact.js +70 -0
  201. package/src/core/decision/benchmarks.js +103 -0
  202. package/src/core/decision/cache.js +27 -0
  203. package/src/core/decision/constants.js +58 -0
  204. package/src/core/decision/cutover.js +34 -0
  205. package/src/core/decision/engine.js +22 -0
  206. package/src/core/decision/errors.js +68 -0
  207. package/src/core/decision/events.js +104 -0
  208. package/src/core/decision/freshness.js +19 -0
  209. package/src/core/decision/normalizers/index.js +115 -0
  210. package/src/core/decision/policy.js +18 -0
  211. package/src/core/decision/projection.js +16 -0
  212. package/src/core/decision/question-registry.js +201 -0
  213. package/src/core/decision/request.js +26 -0
  214. package/src/core/decision/resolver.js +138 -0
  215. package/src/core/decision/result.js +58 -0
  216. package/src/core/decision/service.js +181 -0
  217. package/src/core/decision/state-builder.js +65 -0
  218. package/src/core/decision/task-bindings.js +35 -0
  219. package/src/core/decision/test-provider.js +32 -0
  220. package/src/core/decision/thresholds.js +15 -0
  221. package/src/core/diagnosis-model.js +11 -0
  222. package/src/core/diagnosis.js +10 -1
  223. package/src/core/diagnostic-projection.js +29 -12
  224. package/src/core/diagnostic-record.js +28 -3
  225. package/src/core/efficiency.js +6 -1
  226. package/src/core/error-codes.js +278 -0
  227. package/src/core/events.js +535 -147
  228. package/src/core/evidence-readiness.js +9 -0
  229. package/src/core/execution-prerequisites.js +36 -13
  230. package/src/core/execution-profile.js +63 -38
  231. package/src/core/execution.js +26 -40
  232. package/src/core/filesystem.js +11 -0
  233. package/src/core/gate-artifact.js +105 -19
  234. package/src/core/gate-provenance.js +125 -0
  235. package/src/core/handoff.js +26 -14
  236. package/src/core/history.js +39 -35
  237. package/src/core/hypothesis-projection.js +32 -0
  238. package/src/core/information-gain-projection.js +104 -100
  239. package/src/core/inspect.js +12 -3
  240. package/src/core/integration-invocation-policy.js +37 -4
  241. package/src/core/integration-resources.js +119 -87
  242. package/src/core/ledger-event-collection.js +189 -0
  243. package/src/core/ledger-relations.js +23 -0
  244. package/src/core/model-router/constants.js +10 -0
  245. package/src/core/model-router/policy.js +103 -0
  246. package/src/core/model-router/router.js +37 -0
  247. package/src/core/native-storage.js +12 -0
  248. package/src/core/next-action-continuity.js +31 -9
  249. package/src/core/next-action-model.js +58 -0
  250. package/src/core/next-action-phases.js +131 -43
  251. package/src/core/next-action-refresh.js +43 -9
  252. package/src/core/next-action-review-phase.js +9 -4
  253. package/src/core/next-action-verification-phase.js +2 -1
  254. package/src/core/next-action.js +56 -9
  255. package/src/core/phase.js +266 -103
  256. package/src/core/policy-engine.js +12 -13
  257. package/src/core/preflight-consistency.js +89 -62
  258. package/src/core/preflight-loaders.js +48 -9
  259. package/src/core/preflight-model.js +6 -1
  260. package/src/core/preflight.js +29 -12
  261. package/src/core/progress.js +21 -10
  262. package/src/core/protocol-info.js +68 -0
  263. package/src/core/protocol-migration.js +7 -6
  264. package/src/core/protocol.js +20 -0
  265. package/src/core/reconcile-closure.js +281 -67
  266. package/src/core/recovery-history.js +67 -47
  267. package/src/core/reflection.js +72 -77
  268. package/src/core/responsibility.js +25 -13
  269. package/src/core/resumability.js +154 -44
  270. package/src/core/route-artifact.js +28 -4
  271. package/src/core/router.js +67 -1
  272. package/src/core/runtime-context.js +123 -61
  273. package/src/core/schema-validation.js +11 -3
  274. package/src/core/security-review/constants.js +64 -0
  275. package/src/core/security-review/normalize.js +245 -0
  276. package/src/core/security-review/provider.js +204 -0
  277. package/src/core/security-review/service.js +134 -0
  278. package/src/core/semantic-planning/constants.js +19 -0
  279. package/src/core/semantic-planning/projection.js +94 -0
  280. package/src/core/semantic-planning/service.js +15 -0
  281. package/src/core/settlement.js +12 -1
  282. package/src/core/signing/bundle-file.js +53 -0
  283. package/src/core/signing/bundle-reference.js +15 -0
  284. package/src/core/signing/sigstore.js +60 -33
  285. package/src/core/signing/statement-file.js +27 -0
  286. package/src/core/sources.js +37 -0
  287. package/src/core/storage-runtime-registry.js +41 -0
  288. package/src/core/structural-quality/artifacts.js +20 -14
  289. package/src/core/structural-quality/service.js +81 -56
  290. package/src/core/target-layout.js +1 -1
  291. package/src/core/task-claim-state.js +249 -15
  292. package/src/core/task-command.js +21 -1
  293. package/src/core/task-conflict-inspection.js +133 -102
  294. package/src/core/task-descriptor.js +29 -22
  295. package/src/core/task-discovery.js +288 -90
  296. package/src/core/task-lock.js +66 -306
  297. package/src/core/task-migration-validation.js +5 -5
  298. package/src/core/task-migration.js +17 -287
  299. package/src/core/task-paths.js +13 -0
  300. package/src/core/task-recovery.js +1 -0
  301. package/src/core/task-snapshot.js +51 -8
  302. package/src/core/task-storage-migration.js +18 -0
  303. package/src/core/templates.js +23 -8
  304. package/src/core/test-intelligence/benchmarks.js +68 -0
  305. package/src/core/test-intelligence/inventory.js +73 -0
  306. package/src/core/test-intelligence/prune.js +94 -0
  307. package/src/core/test-intelligence/semantic-state.js +15 -0
  308. package/src/core/test-intelligence/service.js +40 -0
  309. package/src/core/test-intelligence/utility.js +50 -0
  310. package/src/core/trace.js +164 -105
  311. package/src/core/trajectory-evaluation.js +15 -3
  312. package/src/core/trajectory-metrics.js +47 -32
  313. package/src/core/transaction.js +16 -287
  314. package/src/core/verification-scope.js +20 -12
  315. package/src/core/work-state.js +100 -59
  316. package/src/integration.d.ts +492 -0
  317. package/src/integration.js +54 -0
  318. package/src/providers/README.md +47 -0
  319. package/src/providers/capabilities.js +46 -0
  320. package/src/providers/errors.js +15 -0
  321. package/src/providers/index.js +29 -0
  322. package/src/providers/json-snapshot.js +105 -0
  323. package/src/providers/registry.js +152 -0
  324. package/src/repository-index/binary-manager.js +7 -5
  325. package/src/storage/artifact-bytes.js +22 -0
  326. package/src/storage/attachment-binding.js +11 -0
  327. package/src/storage/attachment-files.js +82 -0
  328. package/src/storage/attachment-references.js +36 -0
  329. package/src/storage/backup.js +53 -0
  330. package/src/storage/capabilities.js +31 -0
  331. package/src/storage/connection-owner.js +119 -0
  332. package/src/storage/connection.js +376 -0
  333. package/src/storage/existing-project-scope.js +45 -0
  334. package/src/storage/export-destination.js +44 -0
  335. package/src/storage/exporter.js +284 -0
  336. package/src/storage/file-durability.js +46 -0
  337. package/src/storage/importer.js +461 -0
  338. package/src/storage/index.js +74 -0
  339. package/src/storage/leases.js +63 -0
  340. package/src/storage/ledger-event-snapshot.js +150 -0
  341. package/src/storage/ledger-relations.js +220 -0
  342. package/src/storage/legacy-maintenance-boundary.js +18 -0
  343. package/src/storage/legacy-signature.js +115 -0
  344. package/src/storage/maintenance-handoff.js +129 -0
  345. package/src/storage/maintenance-owner.js +42 -0
  346. package/src/storage/maintenance.js +310 -0
  347. package/src/storage/metadata-json.js +35 -0
  348. package/src/storage/migration-activate.js +59 -0
  349. package/src/storage/migration-archive.js +57 -0
  350. package/src/storage/migration-attachment-root.js +61 -0
  351. package/src/storage/migration-candidate.js +398 -0
  352. package/src/storage/migration-publication.js +143 -0
  353. package/src/storage/migration-rollback-admission.js +54 -0
  354. package/src/storage/migration-rollback-preparation.js +132 -0
  355. package/src/storage/migration-rollback-publication.js +183 -0
  356. package/src/storage/migration-rollback-release.js +66 -0
  357. package/src/storage/migration-rollback-source-stage.js +103 -0
  358. package/src/storage/migration-rollback.js +43 -0
  359. package/src/storage/migration-source-partition.js +56 -0
  360. package/src/storage/migration-source.js +255 -0
  361. package/src/storage/migration-terminal.js +39 -0
  362. package/src/storage/migration-validation.js +75 -0
  363. package/src/storage/migration.js +43 -0
  364. package/src/storage/operational-attachments.js +49 -0
  365. package/src/storage/operational-context.js +50 -0
  366. package/src/storage/project-backup.js +98 -0
  367. package/src/storage/project-bootstrap.js +24 -0
  368. package/src/storage/project-boundary.js +79 -0
  369. package/src/storage/project-read-snapshot.js +18 -0
  370. package/src/storage/project-replacement.js +137 -0
  371. package/src/storage/project-restore.js +203 -0
  372. package/src/storage/record-definitions.js +45 -0
  373. package/src/storage/repository.js +507 -0
  374. package/src/storage/restore-journal.js +62 -0
  375. package/src/storage/restore-layout.js +30 -0
  376. package/src/storage/restore-preparation.js +84 -0
  377. package/src/storage/restore-replacement-archive.js +162 -0
  378. package/src/storage/restore-replacement-owner.js +31 -0
  379. package/src/storage/restore-replacement-preparation.js +128 -0
  380. package/src/storage/restore-replacement.js +142 -0
  381. package/src/storage/restore-terminal.js +32 -0
  382. package/src/storage/runtime.js +31 -0
  383. package/src/storage/schema.js +214 -0
  384. package/src/storage/singleton-import.js +84 -0
  385. package/src/storage/snapshot-continuity.js +16 -0
  386. package/src/storage/snapshot.js +36 -0
  387. package/src/storage/storage-marker.js +79 -0
  388. package/src/storage/task-guards.js +107 -0
  389. package/src/storage/topology.js +42 -0
  390. package/src/storage/transaction.js +179 -0
  391. package/src/storage/unit-of-work.js +663 -0
  392. package/src/storage/windows-process-incarnation.js +206 -0
  393. package/.forgeloop/forgeloop.gitignore +0 -4
  394. package/LICENSE-DOCS.md +0 -13
  395. package/src/core/transaction-maintenance.js +0 -70
@@ -72,6 +72,30 @@
72
72
  "statement": "A structural-quality integration MUST preserve unavailable, malformed, stale, incomparable, and blocked provider results without promoting them to PASS.",
73
73
  "tests": ["tests/sentrux-structural-quality-provider.test.js", "tests/structural-quality-artifacts.test.js"],
74
74
  "validator": "src/core/structural-quality/provider.js"
75
+ },
76
+ "FL-PROVIDER-001": {
77
+ "source": "PROTOCOL_INTEGRATION.md",
78
+ "statement": "The providerExtensions capability MUST remain provider-neutral and experimental, and MUST NOT imply a public generic provider registry API.",
79
+ "tests": ["tests/protocol-info.test.js", "tests/provider-capabilities.test.js"],
80
+ "validator": "src/core/protocol-info.js"
81
+ },
82
+ "FL-PROVIDER-002": {
83
+ "source": "PROTOCOL_INTEGRATION.md",
84
+ "statement": "Every advertised provider kind MUST deny lifecycle, completion, and evidence authority.",
85
+ "tests": ["tests/provider-capabilities.test.js"],
86
+ "validator": "src/providers/capabilities.js"
87
+ },
88
+ "FL-PROVIDER-003": {
89
+ "source": "PROTOCOL_INTEGRATION.md",
90
+ "statement": "Provider results MUST cross a strict JSON snapshot boundary before consumer use.",
91
+ "tests": ["tests/provider-architecture.test.js"],
92
+ "validator": "src/providers/json-snapshot.js"
93
+ },
94
+ "FL-PROVIDER-004": {
95
+ "source": "PROTOCOL_INTEGRATION.md",
96
+ "statement": "The generic provider registry MUST remain absent from the public package subpath exports.",
97
+ "tests": ["tests/provider-architecture.test.js", "tests/package.test.js"],
98
+ "validator": "package.json"
75
99
  }
76
100
  }
77
101
  }
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@cassiomc1/forgeloop",
3
- "version": "1.13.0",
4
- "description": "Portable, verifiable engineering protocol for AI coding environments and developer workflows",
3
+ "version": "2.0.0-rc.2",
4
+ "description": "Evidence-first engineering protocol for AI coding environments and developer workflows",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/cassiomc1/forgeloop.git"
8
8
  },
9
9
  "homepage": "https://github.com/cassiomc1/forgeloop#readme",
10
- "license": "MIT",
10
+ "license": "PolyForm-Noncommercial-1.0.0",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
14
14
  "type": "module",
15
15
  "engines": {
16
- "node": ">=20"
16
+ "node": ">=24.19.0"
17
17
  },
18
18
  "bin": {
19
19
  "forgeloop": "src/cli.js"
@@ -28,7 +28,6 @@
28
28
  "benchmarks/repository-index/README.md",
29
29
  "benchmarks/repository-index/run-hot-path.mjs",
30
30
  "benchmarks/repository-index/run-persistent-transport.mjs",
31
- ".forgeloop/forgeloop.gitignore",
32
31
  "AGENTS.md",
33
32
  "CLAUDE.md",
34
33
  "GUIDE_ROUTER.md",
@@ -45,8 +44,6 @@
45
44
  "CONTRACT_COVERAGE.md",
46
45
  "PROJECT_PROFILE.md",
47
46
  "THIRD_PARTY_NOTICES.md",
48
- "LICENSE",
49
- "LICENSE-DOCS.md",
50
47
  ".cursor",
51
48
  ".github/copilot-instructions.md",
52
49
  "README.md",
@@ -60,6 +57,7 @@
60
57
  "docs/CROSS_HARNESS_CONTINUITY.md",
61
58
  "docs/ADVISORY_CONTEXT.md",
62
59
  "docs/RIPWIRE_ADAPTER.md",
60
+ "docs/OPENSRC_ADAPTER.md",
63
61
  "docs/CLI_REFERENCE.md",
64
62
  "docs/ARTIFACT_REFERENCE.md",
65
63
  "docs/TROUBLESHOOTING.md",
@@ -67,10 +65,23 @@
67
65
  "docs/STRUCTURAL_QUALITY.md",
68
66
  "docs/DOCUMENTATION_GUIDE.md",
69
67
  "docs/RELEASE_CHECKLIST.md",
68
+ "docs/SELF_HOSTED_TESTS.md",
70
69
  "docs/PACKAGE_CONTENTS.md",
70
+ "docs/PROVIDER_ARCHITECTURE.md",
71
+ "docs/PROVIDERS.md",
72
+ "docs/SECURITY_REVIEW.md",
73
+ "docs/BROWSER_VERIFICATION.md",
74
+ "docs/AGENT_BROWSER_ADAPTER.md",
75
+ "docs/AGENT_BROWSER_VERIFICATION.md",
76
+ "docs/JEV_BENCHMARKS.md",
77
+ "docs/MODEL_ROUTING.md",
78
+ "docs/SEMANTIC_DECISION_PLANE.md",
79
+ "docs/TEST_INTELLIGENCE.md",
80
+ "docs/TEST_PRUNING.md",
71
81
  "scripts/CI_VALIDATORS.md",
72
82
  "docs/MCP.md",
73
83
  "docs/UNIVERSAL_INTEGRATION.md",
84
+ "docs/AUDIT_UX.md",
74
85
  "docs/DIAGNOSTIC_MODEL.md",
75
86
  "docs/EXECUTION_TRACE.md",
76
87
  "docs/CODE_ATTESTATION.md",
@@ -78,12 +89,18 @@
78
89
  "docs/SIGNING_PROVIDERS.md",
79
90
  "docs/PLATFORM_ADAPTERS.md",
80
91
  "docs/AGENT_PROTOCOL_SUMMARY.md",
92
+ "docs/AGENT_SKILL.md",
81
93
  "docs/EXECUTION_PROFILE_BENCHMARKS.md",
82
94
  "docs/REPOSITORY_INDEX.md",
83
95
  "docs/PERSISTENT_SEARCH_TRANSPORT.md",
84
96
  "docs/KNOWLEDGE_SOURCES.md",
85
97
  "scripts/generate-shell-completions.mjs",
86
98
  "scripts/generate-agent-protocol-summary.mjs",
99
+ "scripts/generate-forgeloop-skill.mjs",
100
+ "scripts/jev-smoke.mjs",
101
+ "scripts/benchmark-jev.mjs",
102
+ "scripts/benchmark-test-intelligence.mjs",
103
+ "skills/forgeloop",
87
104
  "scripts/run-execution-profile-benchmarks.mjs",
88
105
  "scripts/summarize-execution-profile-benchmarks.mjs",
89
106
  "scripts/validate-execution-profile-benchmarks.mjs",
@@ -102,7 +119,9 @@
102
119
  "!src/core/gates.js",
103
120
  "!src/core/decision-classification.js",
104
121
  "!src/core/workflow-compatibility.js",
105
- "!src/core/cli-metadata.js"
122
+ "!src/core/cli-metadata.js",
123
+ "LICENSE",
124
+ "scripts/run-mcp-clean-tests.mjs"
106
125
  ],
107
126
  "scripts": {
108
127
  "test": "node scripts/run-tests.js",
@@ -128,13 +147,15 @@
128
147
  "mcp:test": "node scripts/run-mcp-tests.mjs",
129
148
  "completions:generate": "node scripts/generate-shell-completions.mjs --write",
130
149
  "completions:check": "node scripts/generate-shell-completions.mjs --check",
131
- "test:quick": "node --test tests/cli.test.js tests/schema-health.test.js tests/schema-golden.test.js tests/protocol-info.test.js tests/integration-capabilities.test.js tests/ci-classify.test.js tests/validation-tiers.test.js",
150
+ "test:quick": "node --import=./scripts/test-semantic-provider-loader.mjs --test tests/cli.test.js tests/schema-health.test.js tests/schema-golden.test.js tests/protocol-info.test.js tests/integration-capabilities.test.js tests/ci-classify.test.js tests/validation-tiers.test.js",
132
151
  "performance:check": "node scripts/benchmark-cli-startup.mjs",
133
152
  "critical-coverage:check": "node scripts/check-critical-coverage.mjs",
134
153
  "changelog:check": "node scripts/check-changelog-freshness.mjs",
135
154
  "attestation:summary": "node scripts/write-forgeloop-attestation-summary.mjs",
136
155
  "summary:generate": "node scripts/generate-agent-protocol-summary.mjs --write",
137
156
  "summary:check": "node scripts/generate-agent-protocol-summary.mjs --check",
157
+ "skill:generate": "node scripts/generate-forgeloop-skill.mjs --write",
158
+ "skill:check": "node scripts/generate-forgeloop-skill.mjs --check",
138
159
  "mcp:setup": "node scripts/mcp-setup.mjs",
139
160
  "mcp:pack:check": "node scripts/mcp-package-smoke.mjs",
140
161
  "poc:evidence:verify": "node scripts/verify_poc_evidence.mjs",
@@ -145,14 +166,24 @@
145
166
  "benchmark:profiles:outliers": "node scripts/report-execution-profile-outliers.mjs",
146
167
  "benchmark:profiles:tail-analysis": "node scripts/report-tail-interpretation.mjs",
147
168
  "benchmark:profiles:regression": "node scripts/check-efficiency-regression.mjs",
148
- "transactions:compact": "node scripts/compact-transactions.mjs",
149
169
  "complexity:check": "node scripts/check-complexity.mjs",
150
170
  "repository-index:manifest": "node scripts/verify-tgrep-manifest.mjs",
171
+ "repository:hygiene": "node scripts/check-repository-hygiene.mjs",
151
172
  "task-discovery:benchmark": "node scripts/benchmark-task-discovery.mjs",
173
+ "storage:benchmark": "node scripts/benchmark-storage-sqlite.mjs",
174
+ "storage:benchmark:diagnosis": "node scripts/benchmark-diagnosis-parity.mjs",
152
175
  "verify:fast": "node scripts/run-validation.mjs --tier fast",
153
176
  "verify:local": "node scripts/run-validation.mjs --tier local",
154
177
  "verify:prepush": "node scripts/run-validation.mjs --tier prepush",
155
- "verify:release": "node scripts/run-validation.mjs --tier release"
178
+ "verify:release": "node scripts/run-validation.mjs --tier release",
179
+ "jev:smoke": "node scripts/jev-smoke.mjs",
180
+ "benchmark:jev": "node scripts/benchmark-jev.mjs",
181
+ "benchmark:jev:live": "node scripts/benchmark-jev.mjs --live",
182
+ "benchmark:test-intelligence": "node scripts/benchmark-test-intelligence.mjs",
183
+ "mcp:test:clean": "node scripts/run-mcp-clean-tests.mjs",
184
+ "release:quick": "node scripts/run-rc-release.mjs",
185
+ "release:rc:check": "node scripts/check-rc-release.mjs",
186
+ "storage:writer-inventory": "node scripts/storage-writer-inventory.mjs"
156
187
  },
157
188
  "devDependencies": {
158
189
  "c8": "^12.0.0",
@@ -161,6 +192,7 @@
161
192
  "yaml": "2.9.0"
162
193
  },
163
194
  "dependencies": {
195
+ "@typesafe-ai/sdk": "0.6.0",
164
196
  "smol-toml": "1.8.0"
165
197
  },
166
198
  "exports": {
@@ -12,6 +12,20 @@
12
12
  "policy": { "type": "string", "minLength": 1 },
13
13
  "requiredGates": { "type": "array", "items": { "type": "string", "minLength": 1 } },
14
14
  "requiredEvidence": { "type": "array", "items": { "type": "string", "minLength": 1 } },
15
+ "decisionEngine": {
16
+ "type": "object",
17
+ "required": ["required", "provider", "model", "policyVersion", "requestTimeoutMs", "maxRetries", "cache"],
18
+ "additionalProperties": false,
19
+ "properties": {
20
+ "required": { "const": true },
21
+ "provider": { "const": "typesafe-jev" },
22
+ "model": { "const": "jev-1.13.0" },
23
+ "policyVersion": { "const": 1 },
24
+ "requestTimeoutMs": { "type": "integer", "minimum": 500, "maximum": 60000 },
25
+ "maxRetries": { "type": "integer", "minimum": 0, "maximum": 3 },
26
+ "cache": { "type": "boolean" }
27
+ }
28
+ },
15
29
  "structuralQuality": {
16
30
  "type": "object",
17
31
  "additionalProperties": false,
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "forgeloop://schemas/context-plan.schema.json",
4
+ "title": "ForgeLoop bounded context plan",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "protocolVersion", "profile", "budget", "candidateItems", "selectedItems", "candidateChars", "selectedChars", "selected", "omitted", "mandatoryIds", "promptInjectionIds", "candidateSetFingerprint", "tokenUsage", "decisionFingerprint", "authority", "evidenceAuthority", "lifecycleAuthority", "completionAuthority"],
7
+ "properties": {
8
+ "schemaVersion": { "const": 1 }, "protocolVersion": { "const": 1 },
9
+ "profile": { "enum": ["light", "balanced", "full"] },
10
+ "budget": { "type": "object", "required": ["maxItems", "maxChars"], "properties": { "maxItems": { "type": "integer", "minimum": 1 }, "maxChars": { "type": "integer", "minimum": 1 } }, "additionalProperties": false },
11
+ "candidateItems": { "type": "integer", "minimum": 0 }, "selectedItems": { "type": "integer", "minimum": 0 }, "candidateChars": { "type": "integer", "minimum": 0 }, "selectedChars": { "type": "integer", "minimum": 0 },
12
+ "selected": { "type": "array", "items": { "type": "object" } }, "omitted": { "type": "array", "items": { "type": "object" } },
13
+ "mandatoryIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "promptInjectionIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "candidateSetFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
14
+ "tokenUsage": { "type": "object", "required": ["inputTokens", "outputTokens", "reportedBy"], "properties": { "inputTokens": { "type": ["integer", "null"] }, "outputTokens": { "type": ["integer", "null"] }, "reportedBy": { "enum": ["PROVIDER", "HOST", "UNKNOWN"] } }, "additionalProperties": false },
15
+ "decisionFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "authority": { "const": "SEMANTIC_DECISION" }, "evidenceAuthority": { "const": "NONE" }, "lifecycleAuthority": { "const": false }, "completionAuthority": { "const": false }
16
+ },
17
+ "additionalProperties": false
18
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "forgeloop://schemas/semantic-decision.schema.json",
4
+ "title": "ForgeLoop semantic decision",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "protocolVersion", "taskId", "decisionId", "decisionKind", "engine", "model", "questionSetId", "questionSetVersion", "questionSetFingerprint", "policyVersion", "stateFingerprint", "policyFingerprint", "answers", "confidence", "decision", "usage", "authority", "evidenceAuthority", "lifecycleAuthority", "completionAuthority", "ownershipAuthority", "installationAuthority", "recordedAt"],
7
+ "properties": {
8
+ "schemaVersion": { "const": 1 },
9
+ "protocolVersion": { "const": 1 },
10
+ "taskId": { "type": "string", "minLength": 1 },
11
+ "decisionId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" },
12
+ "decisionKind": { "type": "string", "minLength": 1 },
13
+ "engine": { "const": "typesafe-jev" },
14
+ "model": { "const": "jev-1.13.0" },
15
+ "questionSetId": { "type": "string", "minLength": 1 },
16
+ "questionSetVersion": { "type": "integer", "minimum": 1 },
17
+ "questionSetFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
18
+ "questionSet": { "type": "object", "required": ["id", "version", "decisionKind", "questions", "fingerprint"], "properties": { "id": { "type": "string", "minLength": 1 }, "version": { "type": "integer", "minimum": 1 }, "decisionKind": { "type": "string", "minLength": 1 }, "questions": { "type": "object" }, "fingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "candidateIds": { "type": "array", "items": { "type": "string" } }, "metadata": { "type": "object" } }, "additionalProperties": true },
19
+ "policyVersion": { "const": 1 },
20
+ "stateFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
21
+ "taskStateFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
22
+ "semanticStateFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
23
+ "policyFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
24
+ "repositoryFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "object" }, { "type": "null" }] },
25
+ "contractFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
26
+ "routeFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
27
+ "verificationCycle": { "oneOf": [{ "type": "integer", "minimum": 1 }, { "type": "null" }] },
28
+ "candidateSetFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
29
+ "answers": { "type": "object" },
30
+ "confidence": { "type": "object" },
31
+ "decision": { "type": "object" },
32
+ "usage": {
33
+ "type": "object", "required": ["inputTokens", "outputTokens", "reportedBy"], "additionalProperties": false,
34
+ "properties": { "inputTokens": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] }, "outputTokens": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] }, "reportedBy": { "enum": ["PROVIDER", "HOST", "UNKNOWN"] } }
35
+ },
36
+ "latencyMs": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] },
37
+ "authority": { "const": "SEMANTIC_DECISION" },
38
+ "evidenceAuthority": { "const": "NONE" },
39
+ "lifecycleAuthority": { "const": false },
40
+ "completionAuthority": { "const": false },
41
+ "ownershipAuthority": { "const": false },
42
+ "installationAuthority": { "const": false },
43
+ "recordedAt": { "type": "string", "minLength": 1 }
44
+ },
45
+ "additionalProperties": false
46
+ }
@@ -5,10 +5,15 @@
5
5
  "type": "object",
6
6
  "required": ["schemaVersion", "protocolVersion", "taskId", "artifacts"],
7
7
  "properties": {
8
- "schemaVersion": { "const": 1 },
8
+ "schemaVersion": { "enum": [1, 2] },
9
9
  "protocolVersion": { "const": 1 },
10
10
  "taskId": { "type": "string", "minLength": 1 },
11
- "artifacts": { "type": "array", "items": { "type": "string", "minLength": 1 } }
11
+ "artifacts": { "type": "array", "items": { "type": "string", "minLength": 1 } },
12
+ "files": { "type": "array", "items": { "type": "object", "required": ["path", "size", "sha256"], "properties": { "path": { "type": "string", "minLength": 1 }, "size": { "type": "integer", "minimum": 0 }, "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" } }, "additionalProperties": false } }
12
13
  },
14
+ "oneOf": [
15
+ { "properties": { "schemaVersion": { "const": 1 } } },
16
+ { "properties": { "schemaVersion": { "const": 2 } }, "required": ["files"] }
17
+ ],
13
18
  "additionalProperties": false
14
19
  }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "forgeloop://schemas/test-utility.schema.json",
4
+ "title": "ForgeLoop test utility analysis",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "protocolVersion", "taskId", "generatedAt", "inventoryFingerprint", "semanticStatus", "tests"],
7
+ "properties": {
8
+ "schemaVersion": { "const": 1 },
9
+ "protocolVersion": { "const": 1 },
10
+ "taskId": { "type": "string", "minLength": 1 },
11
+ "generatedAt": { "type": "string", "minLength": 1 },
12
+ "inventoryFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
13
+ "semanticStatus": { "enum": ["PROVIDER_REPORTED", "UNAVAILABLE", "NOT_REQUESTED"] },
14
+ "decisionId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" },
15
+ "semanticDecisionFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
16
+ "decisionIds": { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" } },
17
+ "semanticDecisionFingerprints": { "type": "array", "items": { "type": "string", "pattern": "^[a-f0-9]{64}$" } },
18
+ "tests": {
19
+ "type": "array",
20
+ "items": {
21
+ "type": "object",
22
+ "required": ["testId", "file", "framework", "name", "classification", "recommendation", "protected"],
23
+ "properties": {
24
+ "testId": { "type": "string", "pattern": "^test-[a-f0-9]{24}$" },
25
+ "file": { "type": "string", "minLength": 1 },
26
+ "framework": { "type": "string", "minLength": 1 },
27
+ "suite": { "type": "string" },
28
+ "name": { "type": "string", "minLength": 1 },
29
+ "line": { "type": "integer", "minimum": 1 },
30
+ "sourceSummary": { "type": "string" },
31
+ "targets": { "type": "array", "items": { "type": "string" } },
32
+ "runtimeMs": { "type": ["number", "null"], "minimum": 0 },
33
+ "uniqueBranches": { "type": ["integer", "null"], "minimum": 0 },
34
+ "classification": { "enum": ["KEEP_REQUIRED", "KEEP_UNIQUE", "KEEP_RISK_GUARD", "KEEP_AUTHORITY_BOUNDARY", "KEEP_RECOVERY_INVARIANT", "KEEP_RELEASE_SMOKE", "KEEP_MIGRATION_COMPATIBILITY", "KEEP_PLATFORM_BEHAVIOR", "KEEP_DOCUMENTATION_VALUE", "KEEP_INTEGRATION_GUARD", "OBSOLETE_CANDIDATE", "FLAKY_LOW_SIGNAL", "EXPENSIVE_LOW_SIGNAL", "UNKNOWN", "REDUNDANT_CANDIDATE"] },
35
+ "recommendation": { "enum": ["KEEP", "REWRITE", "PROBE_REMOVAL", "BLOCKED", "REVIEW"] },
36
+ "protected": { "type": "boolean" },
37
+ "signals": { "type": "object", "additionalProperties": true }
38
+ },
39
+ "additionalProperties": false
40
+ }
41
+ }
42
+ },
43
+ "additionalProperties": false
44
+ }
@@ -48,7 +48,7 @@ missing tool implicitly:
48
48
 
49
49
  | Tier | Command | Intended use |
50
50
  | --- | --- | --- |
51
- | Fast | `npm run verify:fast` | feedback while editing; quick Node, lint, dependency-policy, and generated-doc checks |
51
+ | Fast | `npm run verify:fast` | feedback while editing; quick Node, lint, dependency-policy, generated-doc, and repository-hygiene checks |
52
52
  | Local | `npm run verify:local` | full deterministic source, documentation, manifest, and frozen Python checks |
53
53
  | Pre-push | `npm run verify:prepush` | coverage, critical coverage, package/MCP checks, PoC checks, and the local suite expected before a PR |
54
54
  | Release | `npm run verify:release` | pre-push checks plus package smoke, benchmark/profile checks, performance, release-identity prerequisites, and `npm pack --dry-run --json` |
@@ -69,8 +69,8 @@ the full suite as a second `npm test`. `npm run lint`,
69
69
  `npm run complexity:check`, and `npm run critical-coverage:check` retain
70
70
  independent purposes: syntax and usage correctness, hotspot growth, and
71
71
  coverage of critical modules. Packed TypeScript consumers validate the public
72
- declarations; YAML-based tests validate workflow semantics. The core runtime
73
- remains dependency-free.
72
+ declarations; YAML-based tests validate workflow semantics. The approved exact
73
+ runtime dependencies are `@typesafe-ai/sdk` and `smol-toml`.
74
74
 
75
75
  ## GitHub Actions boundary
76
76
 
@@ -122,9 +122,9 @@ is not duplicated in every ordinary PR job.
122
122
  `npm run critical-coverage:check` retain independent purposes: syntax and
123
123
  usage correctness, hotspot growth, and coverage of critical modules. Packed
124
124
  TypeScript consumers validate the public declarations; YAML-based tests
125
- validate workflow semantics. The core runtime has the approved exact
126
- `smol-toml` dependency for bounded Cargo manifest parsing; dependency policy
127
- keeps all other runtime dependencies out.
125
+ validate workflow semantics. The approved exact runtime dependencies are
126
+ `@typesafe-ai/sdk` and `smol-toml`; dependency policy keeps all other runtime
127
+ dependencies out.
128
128
 
129
129
  `scripts/audit-receipts.mjs` runs after checkout. It audits supplied scoped
130
130
  receipts with explicit task IDs, fails on an invalid audit, and reports
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runJevBenchmark, runJevBenchmarkLive } from "../src/core/decision/benchmarks.js";
3
+
4
+ const result = process.argv.includes("--live") ? await runJevBenchmarkLive() : runJevBenchmark();
5
+ console.log(JSON.stringify(result, null, 2));
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runTestIntelligenceBenchmark } from "../src/core/test-intelligence/benchmarks.js";
3
+
4
+ console.log(JSON.stringify(runTestIntelligenceBenchmark(), null, 2));
@@ -59,6 +59,7 @@ async function render() {
59
59
  .map(([name, feature]) => [name, feature.version ?? "n/a", feature.supported === false ? "no" : "yes"]);
60
60
  const handoffs = info.features.canonicalHandoffs;
61
61
  const advisory = info.features.advisoryContextProviders;
62
+ const providerExtensions = info.features.providerExtensions;
62
63
  const capabilityContracts = `## Capability contracts
63
64
 
64
65
  - \`canonicalHandoffs\` v${handoffs.version}: immutable, supported, and
@@ -70,13 +71,15 @@ async function render() {
70
71
  Integration-API-only, lazy, and opt-in. Provider results are not persisted by
71
72
  ForgeLoop and are never lifecycle state, evidence, authority, or executable
72
73
  instructions.
74
+ - \`providerExtensions\` v${providerExtensions.version} is provider-neutral and
75
+ experimental. The generic provider registry remains internal and unexported.
73
76
 
74
77
  Protocol v1, schema v1, and Integration API v1 remain independent of these
75
78
  capability-family versions.`;
76
79
  const artifacts = Object.values(ARTIFACT_REGISTRY)
77
80
  .filter((artifact) => artifact.isPublic)
78
81
  .sort((left, right) => left.key.localeCompare(right.key))
79
- .map((artifact) => [artifact.key, artifact.scope, artifact.path, artifact.schema, artifact.trustRole]);
82
+ .map((artifact) => [artifact.key, artifact.scope, artifact.logicalPath, `${artifact.canonicalStorage.path}${artifact.canonicalStorage.table ? ` :: ${artifact.canonicalStorage.table}` : ""}`, artifact.exportPath ?? "Copied separately", artifact.schema, artifact.trustRole]);
80
83
  const errors = Object.values(PUBLIC_ERROR_REGISTRY)
81
84
  .filter((error) => /^(E_(CLI|WORKSPACE|HANDOFF|RESPONSIBILITY|VERIFICATION_SCOPE|REVISION|ATTESTATION)_)/u.test(error.code))
82
85
  .sort((left, right) => left.code.localeCompare(right.code))
@@ -173,7 +176,7 @@ or \`NOT_COMPARABLE\` when evidence is absent or incompatible. See
173
176
  - Responsibility contracts constrain paths, checks, and frozen inputs; they do not prove identity or authorship.
174
177
  - Verification scope describes planned verification breadth. Attestation coverage proves content for a concrete revision. These are separate claims.
175
178
  - Attestation manifests exclude ForgeLoop protocol metadata and bind to the completion receipt and append-only ledger without circular references.
176
- - Verification commands are read-only. Signing is external; private keys and credentials are never persisted by ForgeLoop.
179
+ - Verification command execution is external and provenance-bearing; ForgeLoop records the exact argv and result, while the authorized command may perform its declared effects. Signing is external; private keys and credentials are never persisted by ForgeLoop.
177
180
 
178
181
  ## Lifecycle
179
182
 
@@ -189,7 +192,7 @@ ${guideCatalog()}
189
192
 
190
193
  ## Public artifact registry
191
194
 
192
- ${table(["Key", "Scope", "Path", "Schema", "Trust role"], artifacts)}
195
+ ${table(["Key", "Scope", "Logical identity", "Canonical storage", "Export path", "Schema", "Trust role"], artifacts)}
193
196
 
194
197
  ## Command catalog
195
198
 
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFile, mkdir, writeFile } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ import { protocolInfo } from "../src/core/protocol-info.js";
8
+
9
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
10
+ const summaryPath = path.join(root, "docs", "AGENT_PROTOCOL_SUMMARY.md");
11
+ const outputRoot = path.join(root, "skills", "forgeloop");
12
+ const marker = "<!-- Generated by scripts/generate-forgeloop-skill.mjs. Do not edit manually. -->";
13
+
14
+ function skillContent(info, summary) {
15
+ const phases = info.lifecycle.phases.join(", ");
16
+ return `---
17
+ name: forgeloop
18
+ description: >-
19
+ Operate a repository governed by the ForgeLoop protocol: discover or resume
20
+ tasks, follow canonical next actions, preserve claims and continuity, record
21
+ verification evidence, recover supported protocol state, and require
22
+ validator-backed completion.
23
+ ---
24
+
25
+ ${marker}
26
+
27
+ # ForgeLoop
28
+
29
+ ## Purpose
30
+
31
+ This skill is operational guidance generated from ForgeLoop's canonical protocol metadata. It is not protocol authority. Always follow the current repository runtime, \`protocol-info\`, \`next\`, schemas, validators, and canonical documentation when they differ from this skill.
32
+
33
+ ## When to Use
34
+
35
+ Use when ForgeLoop is present in the repository or explicitly requested. Do not activate it for unrelated repositories merely because an agent supports skills.
36
+
37
+ ## Source of Truth
38
+
39
+ Runtime registries and validators outrank canonical protocol docs; canonical docs outrank \`docs/AGENT_PROTOCOL_SUMMARY.md\`; this generated skill is the final non-normative projection. Protocol version is ${info.protocolVersion}. Mutable facts such as phases (${phases}) must be read from the runtime.
40
+
41
+ ## Command Resolution
42
+
43
+ In ForgeLoop's own source repository, use \`node src/cli.js\`. In a consumer repository, use that repository's configured local invocation. Never silently install or upgrade ForgeLoop, and never use a stale global CLI when repository-local code exists. If compatibility is uncertain, inspect \`protocol-info --json\`.
44
+
45
+ ## Operating Workflow
46
+
47
+ 1. Discover existing work with \`node src/cli.js task-list --json\`.
48
+ 2. Select or resume the relevant task; a harness, session, model, or context change does not create a new task.
49
+ 3. Ask ForgeLoop for \`next --task <id> --json\` at every boundary and execute only the returned supported action.
50
+ 4. Require \`preflight\` to return \`READY\` before implementation.
51
+ 5. Preserve fresh, validator-owned evidence through verification, review, completion, and the terminal \`next\` check.
52
+
53
+ ## Task Discovery and Continuation
54
+
55
+ Respect active write claims. Do not steal, override, manually release, or edit ownership artifacts. Reconcile continuity with canonical state rather than trusting stale narrative.
56
+
57
+ ## Verification Rules
58
+
59
+ \`run-check\` executes the exact command and records ForgeLoop-owned provenance. \`record-check\` is serialization-only; its command text is metadata and is never executed. Claims, provider/advisory output, screenshots, and actor summaries are not evidence by themselves. Missing tools remain unavailable; do not auto-install a verifier.
60
+
61
+ ## Recovery Rules
62
+
63
+ Use supported recovery only. Preserve failed evidence and follow \`next\` through diagnosis/correction. For state or ledger divergence, stop lifecycle mutation and inspect validation/classification. Never edit task state, receipts, recovery, continuity, claims, hashes, or \`events.ndjson\` manually. Reconcile \`COMMIT_UNKNOWN\` before any retry.
64
+
65
+ ## Completion Rule
66
+
67
+ Never claim ForgeLoop-verified completion unless \`complete\` returns \`VALID\`. Green tests, CI, a merged PR, or provider output alone are insufficient. After \`VALID\`, run \`next --task <id> --json\` again and require the canonical terminal action.
68
+
69
+ ## Cross-Harness Continuity
70
+
71
+ A harness or session change does not create a new task. Use supported continuity or handoff commands and reconcile persisted state before continuing.
72
+
73
+ ## Durable Action Safety
74
+
75
+ For external actions use propose, authorize, execute, then verify or reconcile. Never blindly retry an uncertain external commit.
76
+
77
+ ## Never Do
78
+
79
+ - Never manually assign COMPLETE.
80
+ - Never invent lifecycle chronology or override \`next\`.
81
+ - Never override active claims or rewrite the append-only ledger.
82
+ - Never fabricate evidence or treat \`record-check\` as execution.
83
+ - Never auto-install ForgeLoop or a verifier during normal operation.
84
+ - Never duplicate a task because the harness changed.
85
+ - Never treat provider/advisory output as protocol authority.
86
+
87
+ ## References
88
+
89
+ - [Canonical Agent Protocol Summary](../../docs/AGENT_PROTOCOL_SUMMARY.md)
90
+ - [Lifecycle](./references/lifecycle.md)
91
+ - [Verification](./references/verification.md)
92
+ - [Recovery](./references/recovery.md)
93
+ `;
94
+ }
95
+
96
+ function referenceContent(title, body, summary) {
97
+ return `${marker}\n\n# ${title}\n\n${body}\n\n<!-- Canonical summary fingerprint source: docs/AGENT_PROTOCOL_SUMMARY.md -->\n${summary.includes("# ForgeLoop Agent Protocol Summary") ? "" : ""}`;
98
+ }
99
+
100
+ function files(info, summary) {
101
+ return {
102
+ "SKILL.md": skillContent(info, summary),
103
+ "README.md": `${marker}\n\n# ForgeLoop Agent Skill\n\nThis directory contains a generated, portable, harness-neutral Agent Skill. It is operational guidance, not protocol authority, and has no dependency on external Agent Skills tooling.\n\nCanonical hierarchy: runtime registries and validators -> canonical protocol docs -> \`docs/AGENT_PROTOCOL_SUMMARY.md\` -> this generated projection.\n\nRegenerate with \`npm run skill:generate\`; check exact freshness with \`npm run skill:check\`. The generator is deterministic, offline, and writes only the five known files in this directory.\n`,
104
+ "references/lifecycle.md": referenceContent("Lifecycle", `The canonical loop is task discovery, contract, route, preflight, execution, verification, review, validator-backed completion, and a terminal next check. Always query \`next\` rather than inferring a transition. The initial post-task-create shape may have no work state: \`next\` returns DISCOVER, then CREATE_CONTRACT, and only a real contract fingerprint permits the first work-state checkpoint.\n\nPhases are runtime-owned and currently include: ${info.lifecycle.phases.join(", ")}.`, summary),
105
+ "references/verification.md": referenceContent("Verification", "Use run-check for exact command execution and provenance. Use record-check only for supplied observations; it never launches command text. Evidence must be fresh, task-bound, requirement-bound, and validator-readable. Preserve failures, report unavailable tools, and require observed coverage before review and complete -> VALID.", summary),
106
+ "references/recovery.md": referenceContent("Recovery", "Fail closed on invalid ownership, state, ledger, receipt, or continuity. Use supported recovery commands only. Never edit .forgeloop/task-state, work-state.json, events.ndjson, recovery.json, claims, or hashes by hand. Claim release is not a lifecycle bypass. Reconcile COMMIT_UNKNOWN before retrying any external action.", summary),
107
+ };
108
+ }
109
+
110
+ async function main() {
111
+ const args = process.argv.slice(2);
112
+ if (args.length !== 1 || !["--write", "--check"].includes(args[0])) {
113
+ throw new Error("Usage: node scripts/generate-forgeloop-skill.mjs --write|--check");
114
+ }
115
+ const summary = await readFile(summaryPath, "utf8");
116
+ const generated = files(protocolInfo(), summary);
117
+ let failed = false;
118
+ for (const [relative, content] of Object.entries(generated)) {
119
+ const target = path.join(outputRoot, relative);
120
+ let current = null;
121
+ try { current = await readFile(target, "utf8"); } catch (error) { if (error.code !== "ENOENT") throw error; }
122
+ if (args[0] === "--check") {
123
+ if (current !== content) { console.error(`Generated Agent Skill is stale: skills/forgeloop/${relative}`); failed = true; }
124
+ } else {
125
+ await mkdir(path.dirname(target), { recursive: true });
126
+ await writeFile(target, content, "utf8");
127
+ }
128
+ }
129
+ if (failed) process.exitCode = 1;
130
+ else console.log(args[0] === "--check" ? "Generated Agent Skill is current." : "Generated Agent Skill.");
131
+ }
132
+
133
+ await main();
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { DECISION_DEFAULT_POLICY } from "../src/core/decision/constants.js";
3
+ import { createTypesafeEngine } from "../src/adapters/typesafe/engine.js";
4
+
5
+ const engine = createTypesafeEngine({ policy: DECISION_DEFAULT_POLICY });
6
+ const result = await engine.health();
7
+ const status = result.status === "missing" ? "NOT_RUN" : result.status;
8
+ console.log(JSON.stringify({
9
+ status,
10
+ provider: result.engine,
11
+ model: result.model,
12
+ ...(result.latencyMs !== undefined ? { latencyMs: result.latencyMs } : {}),
13
+ ...(result.usage ? { usage: result.usage } : {}),
14
+ ...(result.errorCode ? { errorCode: result.errorCode } : {}),
15
+ ...(result.providerErrorType ? { providerErrorType: result.providerErrorType } : {}),
16
+ ...(result.httpStatus ? { httpStatus: result.httpStatus } : {}),
17
+ ...(result.requestId ? { requestId: result.requestId } : {}),
18
+ }, null, 2));
19
+ if (status !== "healthy" && status !== "NOT_RUN") process.exitCode = 1;
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import { cpSync, mkdirSync, mkdtempSync, rmSync, symlinkSync } from "node:fs";
3
+ import { execFileSync } from "node:child_process";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { installLockedMcp } from "./mcp-locked-install.mjs";
8
+ import { runMcpTests } from "./run-mcp-tests.mjs";
9
+ import { runNpm } from "./npm-command.mjs";
10
+
11
+ const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
12
+ const temporary = mkdtempSync(path.join(os.tmpdir(), "forgeloop-mcp-clean-"));
13
+ try {
14
+ const packed = JSON.parse(runNpm(["pack", "--json", "--pack-destination", temporary], { cwd: repositoryRoot, encoding: "utf8" }));
15
+ const coreTarball = path.join(temporary, packed[0].filename);
16
+ const root = path.join(temporary, "project");
17
+ mkdirSync(root);
18
+ execFileSync("tar", ["-xzf", coreTarball, "--strip-components=1", "-C", root]);
19
+ const mcpRoot = path.join(root, "integrations/mcp");
20
+ mkdirSync(mcpRoot, { recursive: true });
21
+ for (const relative of ["src", "bin", "tests", "README.md", "LICENSE"]) cpSync(path.join(repositoryRoot, "integrations/mcp", relative), path.join(mcpRoot, relative), { recursive: true });
22
+ for (const relative of ["tests/helpers", "tests/fixtures"]) cpSync(path.join(repositoryRoot, relative), path.join(root, relative), { recursive: true });
23
+ installLockedMcp({ target: mcpRoot, tarballs: [coreTarball] });
24
+ // Source fixtures and the installed package use the same locked external
25
+ // dependencies without borrowing the user's existing node_modules.
26
+ symlinkSync(path.join(mcpRoot, "node_modules"), path.join(root, "node_modules"), process.platform === "win32" ? "junction" : "dir");
27
+ process.exitCode = await runMcpTests({ root: mcpRoot });
28
+ } finally {
29
+ rmSync(temporary, { recursive: true, force: true });
30
+ }
@@ -0,0 +1,9 @@
1
+ <!-- Generated by scripts/generate-forgeloop-skill.mjs. Do not edit manually. -->
2
+
3
+ # ForgeLoop Agent Skill
4
+
5
+ This directory contains a generated, portable, harness-neutral Agent Skill. It is operational guidance, not protocol authority, and has no dependency on external Agent Skills tooling.
6
+
7
+ Canonical hierarchy: runtime registries and validators -> canonical protocol docs -> `docs/AGENT_PROTOCOL_SUMMARY.md` -> this generated projection.
8
+
9
+ Regenerate with `npm run skill:generate`; check exact freshness with `npm run skill:check`. The generator is deterministic, offline, and writes only the five known files in this directory.