@cassiomc1/forgeloop 1.12.0 → 1.14.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 (249) hide show
  1. package/.github/copilot-instructions.md +1 -1
  2. package/AGENTS.md +1 -1
  3. package/AGENT_COMPATIBILITY.md +8 -0
  4. package/CLAUDE.md +1 -1
  5. package/CONTRIBUTING.md +90 -0
  6. package/DOCS_INDEX.md +46 -12
  7. package/ENG/c-development-eng.md +112 -0
  8. package/ENG/cpp-development-eng.md +109 -0
  9. package/ENG/dotnet-aspnetcore-development-eng.md +401 -0
  10. package/ENG/go-development-eng.md +103 -0
  11. package/ENG/java-development-eng.md +125 -0
  12. package/ENG/nodejs-backend-development-eng.md +605 -0
  13. package/ENG/php-development-eng.md +104 -0
  14. package/ENG/rust-development-eng.md +422 -0
  15. package/ENG/sec-code-eng.md +7 -7
  16. package/ENG/sql-development-eng.md +108 -0
  17. package/ENG/swift-development-eng.md +111 -0
  18. package/ENG/typescript-development-eng.md +108 -0
  19. package/EXECUTION_STATE.md +12 -0
  20. package/GUIDE_ROUTER.md +418 -9
  21. package/LOOP_ENGINEERING.md +28 -2
  22. package/ORCHESTRATOR_INTEGRATION.md +9 -5
  23. package/PROTOCOL_INTEGRATION.md +55 -2
  24. package/QUALITY_SCORECARD.md +1 -0
  25. package/README.md +78 -52
  26. package/TERMINOLOGY.md +2 -0
  27. package/THIRD_PARTY_NOTICES.md +19 -7
  28. package/THREAT_MODEL.md +140 -1
  29. package/completions/_forgeloop +22 -4
  30. package/completions/forgeloop.bash +40 -4
  31. package/completions/forgeloop.fish +130 -1
  32. package/docs/ADVISORY_CONTEXT.md +25 -0
  33. package/docs/AGENT_BROWSER_ADAPTER.md +81 -0
  34. package/docs/AGENT_BROWSER_VERIFICATION.md +6 -0
  35. package/docs/AGENT_PROTOCOL_SUMMARY.md +81 -3
  36. package/docs/AGENT_SKILL.md +66 -0
  37. package/docs/ARTIFACT_REFERENCE.md +123 -0
  38. package/docs/AUDIT_UX.md +46 -0
  39. package/docs/BROWSER_VERIFICATION.md +136 -0
  40. package/docs/CLI_REFERENCE.md +392 -10
  41. package/docs/CODE_ATTESTATION.md +2 -2
  42. package/docs/DOCUMENTATION_GUIDE.md +34 -12
  43. package/docs/GETTING_STARTED.md +59 -0
  44. package/docs/JEV_BENCHMARKS.md +31 -0
  45. package/docs/MODEL_ROUTING.md +37 -0
  46. package/docs/OPENSRC_ADAPTER.md +241 -0
  47. package/docs/PACKAGE_CONTENTS.md +60 -19
  48. package/docs/PROVIDERS.md +126 -0
  49. package/docs/PROVIDER_ARCHITECTURE.md +199 -0
  50. package/docs/RECIPES.md +32 -0
  51. package/docs/RELEASE_CHECKLIST.md +66 -5
  52. package/docs/SECURITY_REVIEW.md +71 -0
  53. package/docs/SEMANTIC_DECISION_PLANE.md +71 -0
  54. package/docs/TEST_INTELLIGENCE.md +29 -0
  55. package/docs/TEST_PRUNING.md +14 -0
  56. package/docs/TROUBLESHOOTING.md +298 -3
  57. package/docs/UNIVERSAL_INTEGRATION.md +31 -0
  58. package/docs/assets/diagrams/forgeloop-code-attestation-flow.html +2 -2
  59. package/docs/assets/diagrams/forgeloop-code-attestation-flow.receipt.json +5 -5
  60. package/docs/assets/diagrams/forgeloop-code-attestation-flow.svg +1 -1
  61. package/docs/assets/diagrams/forgeloop-engineering-flow.html +39 -26
  62. package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
  63. package/docs/assets/diagrams/forgeloop-engineering-flow.svg +26 -26
  64. package/docs/assets/diagrams/forgeloop-verification-trust-flow.html +2 -1
  65. package/docs/assets/diagrams/forgeloop-verification-trust-flow.receipt.json +5 -5
  66. package/docs/assets/diagrams/forgeloop-verification-trust-flow.svg +1 -1
  67. package/docs/diagrams/README.md +13 -9
  68. package/docs/diagrams/forgeloop-code-attestation-flow.workflow.json +1 -1
  69. package/docs/diagrams/forgeloop-engineering-flow.workflow.json +24 -19
  70. package/docs/diagrams/forgeloop-verification-trust-flow.workflow.json +1 -0
  71. package/docs/diagrams/reviews/forgeloop-code-attestation-flow.review.json +4 -4
  72. package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +4 -4
  73. package/docs/diagrams/reviews/forgeloop-verification-trust-flow.review.json +4 -4
  74. package/docs/documentation-manifest.json +1397 -0
  75. package/docs/protocol-requirements.json +101 -0
  76. package/package.json +46 -4
  77. package/schemas/config.schema.json +14 -0
  78. package/schemas/context-plan.schema.json +18 -0
  79. package/schemas/routing-input.schema.json +1 -1
  80. package/schemas/semantic-decision.schema.json +46 -0
  81. package/schemas/test-utility.schema.json +44 -0
  82. package/scripts/CI_VALIDATORS.md +84 -11
  83. package/scripts/benchmark-jev.mjs +5 -0
  84. package/scripts/benchmark-test-intelligence.mjs +4 -0
  85. package/scripts/generate-agent-protocol-summary.mjs +40 -1
  86. package/scripts/generate-forgeloop-skill.mjs +133 -0
  87. package/scripts/jev-smoke.mjs +19 -0
  88. package/skills/forgeloop/README.md +9 -0
  89. package/skills/forgeloop/SKILL.md +77 -0
  90. package/skills/forgeloop/references/lifecycle.md +9 -0
  91. package/skills/forgeloop/references/recovery.md +7 -0
  92. package/skills/forgeloop/references/verification.md +7 -0
  93. package/src/adapters/agent-browser/assertions.js +47 -0
  94. package/src/adapters/agent-browser/commands.js +54 -0
  95. package/src/adapters/agent-browser/index.js +3 -0
  96. package/src/adapters/agent-browser/locator.js +40 -0
  97. package/src/adapters/agent-browser/process.js +215 -0
  98. package/src/adapters/agent-browser/provider.js +313 -0
  99. package/src/adapters/emulated-services/constants.js +24 -0
  100. package/src/adapters/emulated-services/index.js +7 -0
  101. package/src/adapters/emulated-services/process.js +162 -0
  102. package/src/adapters/emulated-services/provider.js +282 -0
  103. package/src/adapters/opensrc/normalize.js +90 -0
  104. package/src/adapters/opensrc/process.js +248 -0
  105. package/src/adapters/opensrc/provider.js +338 -0
  106. package/src/adapters/opensrc/search.js +264 -0
  107. package/src/adapters/typesafe/client.js +28 -0
  108. package/src/adapters/typesafe/engine.js +63 -0
  109. package/src/adapters/typesafe/normalize.js +41 -0
  110. package/src/cli.js +108 -0
  111. package/src/commands/checkpoint-revalidate.js +176 -0
  112. package/src/commands/context-plan.js +38 -0
  113. package/src/commands/contract-create.js +264 -0
  114. package/src/commands/contract-revise.js +236 -0
  115. package/src/commands/decision-show.js +14 -0
  116. package/src/commands/decision-status.js +22 -0
  117. package/src/commands/discover.js +41 -0
  118. package/src/commands/doctor.js +15 -0
  119. package/src/commands/gate-record.js +205 -0
  120. package/src/commands/gate-revalidate.js +137 -0
  121. package/src/commands/model-route.js +32 -0
  122. package/src/commands/next.js +19 -7
  123. package/src/commands/route.js +146 -18
  124. package/src/commands/semantic-plan.js +17 -0
  125. package/src/commands/task-abandon.js +224 -0
  126. package/src/commands/task-create.js +84 -25
  127. package/src/commands/task-list.js +22 -2
  128. package/src/commands/task-migrate-contract-bootstrap-repair.js +288 -0
  129. package/src/commands/task-repair-contract-bootstrap.js +263 -0
  130. package/src/commands/test-inventory.js +5 -0
  131. package/src/commands/test-prune-plan.js +5 -0
  132. package/src/commands/test-prune-probe.js +5 -0
  133. package/src/commands/test-utility.js +5 -0
  134. package/src/commands/validate-protocol.js +10 -1
  135. package/src/config/guides.json +44 -0
  136. package/src/core/artifact-registry.js +24 -0
  137. package/src/core/audit-ux.js +514 -0
  138. package/src/core/browser-verification/constants.js +149 -0
  139. package/src/core/browser-verification/normalize.js +254 -0
  140. package/src/core/browser-verification/provider.js +519 -0
  141. package/src/core/browser-verification/service.js +115 -0
  142. package/src/core/build-script.js +151 -0
  143. package/src/core/c-cpp-project.js +143 -0
  144. package/src/core/checkpoint-revalidation.js +319 -0
  145. package/src/core/cli-command-definitions.js +249 -1
  146. package/src/core/command-executors.js +115 -3
  147. package/src/core/command-input.js +212 -102
  148. package/src/core/completion-artifacts.js +14 -5
  149. package/src/core/completion.js +4 -6
  150. package/src/core/config.js +3 -0
  151. package/src/core/context-compiler/budget.js +9 -0
  152. package/src/core/context-compiler/candidates.js +39 -0
  153. package/src/core/context-compiler/compiler.js +63 -0
  154. package/src/core/context-compiler/fingerprint.js +11 -0
  155. package/src/core/context-compiler/policy.js +13 -0
  156. package/src/core/context-compiler/result.js +23 -0
  157. package/src/core/contract-bootstrap-recovery.js +655 -0
  158. package/src/core/contract-presets.js +82 -0
  159. package/src/core/contract-revision.js +210 -0
  160. package/src/core/decision/artifact.js +69 -0
  161. package/src/core/decision/benchmarks.js +103 -0
  162. package/src/core/decision/cache.js +27 -0
  163. package/src/core/decision/constants.js +58 -0
  164. package/src/core/decision/cutover.js +34 -0
  165. package/src/core/decision/engine.js +22 -0
  166. package/src/core/decision/errors.js +68 -0
  167. package/src/core/decision/events.js +101 -0
  168. package/src/core/decision/freshness.js +19 -0
  169. package/src/core/decision/normalizers/index.js +115 -0
  170. package/src/core/decision/policy.js +18 -0
  171. package/src/core/decision/projection.js +16 -0
  172. package/src/core/decision/question-registry.js +201 -0
  173. package/src/core/decision/request.js +26 -0
  174. package/src/core/decision/resolver.js +130 -0
  175. package/src/core/decision/result.js +58 -0
  176. package/src/core/decision/service.js +156 -0
  177. package/src/core/decision/state-builder.js +65 -0
  178. package/src/core/decision/task-bindings.js +30 -0
  179. package/src/core/decision/test-provider.js +32 -0
  180. package/src/core/decision/thresholds.js +15 -0
  181. package/src/core/error-codes.js +281 -3
  182. package/src/core/events.js +226 -57
  183. package/src/core/evidence-readiness.js +9 -0
  184. package/src/core/execution-prerequisites.js +14 -0
  185. package/src/core/execution-profile.js +63 -38
  186. package/src/core/filesystem.js +1 -10
  187. package/src/core/gate-provenance.js +124 -0
  188. package/src/core/go-project.js +206 -0
  189. package/src/core/integration-invocation-policy.js +27 -4
  190. package/src/core/integration-resources.js +86 -61
  191. package/src/core/java-project.js +403 -0
  192. package/src/core/model-router/constants.js +10 -0
  193. package/src/core/model-router/policy.js +103 -0
  194. package/src/core/model-router/router.js +37 -0
  195. package/src/core/multi-language-project.js +117 -0
  196. package/src/core/next-action-model.js +58 -0
  197. package/src/core/next-action-phases.js +130 -42
  198. package/src/core/next-action-refresh.js +43 -9
  199. package/src/core/next-action-review-phase.js +7 -2
  200. package/src/core/next-action.js +35 -7
  201. package/src/core/next-explanation.js +63 -0
  202. package/src/core/phase.js +128 -10
  203. package/src/core/php-project.js +85 -0
  204. package/src/core/preflight-consistency.js +23 -9
  205. package/src/core/preflight-loaders.js +37 -5
  206. package/src/core/project-detection.js +1760 -52
  207. package/src/core/protocol-info.js +65 -0
  208. package/src/core/protocol.js +20 -0
  209. package/src/core/reconcile-closure.js +132 -53
  210. package/src/core/recovery-history.js +1 -0
  211. package/src/core/resumability.js +154 -44
  212. package/src/core/route-artifact.js +15 -1
  213. package/src/core/router.js +223 -4
  214. package/src/core/runtime-context.js +118 -61
  215. package/src/core/rust-project.js +400 -0
  216. package/src/core/schema-validation.js +3 -0
  217. package/src/core/security-review/constants.js +64 -0
  218. package/src/core/security-review/normalize.js +245 -0
  219. package/src/core/security-review/provider.js +204 -0
  220. package/src/core/security-review/service.js +134 -0
  221. package/src/core/semantic-planning/constants.js +19 -0
  222. package/src/core/semantic-planning/projection.js +94 -0
  223. package/src/core/semantic-planning/service.js +15 -0
  224. package/src/core/sources.js +37 -0
  225. package/src/core/sql-project.js +141 -0
  226. package/src/core/swift-project.js +200 -0
  227. package/src/core/task-claim-state.js +201 -1
  228. package/src/core/task-conflict-inspection.js +31 -5
  229. package/src/core/task-paths.js +13 -0
  230. package/src/core/task-recovery.js +1 -0
  231. package/src/core/templates.js +3 -0
  232. package/src/core/test-intelligence/benchmarks.js +68 -0
  233. package/src/core/test-intelligence/inventory.js +73 -0
  234. package/src/core/test-intelligence/prune.js +90 -0
  235. package/src/core/test-intelligence/semantic-state.js +15 -0
  236. package/src/core/test-intelligence/service.js +40 -0
  237. package/src/core/test-intelligence/utility.js +50 -0
  238. package/src/core/trace.js +11 -7
  239. package/src/core/transaction.js +1 -0
  240. package/src/core/typescript-project.js +349 -0
  241. package/src/core/xml-structure.js +123 -0
  242. package/src/integration.d.ts +492 -0
  243. package/src/integration.js +54 -0
  244. package/src/providers/README.md +47 -0
  245. package/src/providers/capabilities.js +46 -0
  246. package/src/providers/errors.js +15 -0
  247. package/src/providers/index.js +29 -0
  248. package/src/providers/json-snapshot.js +105 -0
  249. package/src/providers/registry.js +152 -0
@@ -0,0 +1,101 @@
1
+ {
2
+ "version": 1,
3
+ "requirements": {
4
+ "FL-CONT-001": {
5
+ "source": "LOOP_ENGINEERING.md",
6
+ "statement": "A receiving harness MUST reconcile continuity against the current work state and checkout before acting on it.",
7
+ "tests": ["tests/continuity.test.js", "tests/documentation-conformance.test.js"],
8
+ "validator": "src/core/continuity.js"
9
+ },
10
+ "FL-CLAIM-001": {
11
+ "source": "PROTOCOL_INTEGRATION.md",
12
+ "statement": "Every harness MUST consume the canonical validated claim-state resolver.",
13
+ "tests": ["tests/task-claim-state.test.js", "tests/task-recovery-tamper.test.js"],
14
+ "validator": "src/core/task-claim-state.js"
15
+ },
16
+ "FL-CLAIM-002": {
17
+ "source": "LOOP_ENGINEERING.md",
18
+ "statement": "Readers without task-recovery schema v1 support MUST refuse claim ownership mutation.",
19
+ "tests": ["tests/protocol-info.test.js", "tests/documentation-conformance.test.js"],
20
+ "validator": "scripts/validate_documentation_conformance.mjs"
21
+ },
22
+ "FL-CLAIM-003": {
23
+ "source": "PROTOCOL_INTEGRATION.md",
24
+ "statement": "A reader without validated claim projection MUST fail closed.",
25
+ "tests": ["tests/protocol-info.test.js", "tests/package.test.js"],
26
+ "validator": "src/core/protocol-info.js"
27
+ },
28
+ "FL-WS-001": {
29
+ "source": "LOOP_ENGINEERING.md",
30
+ "statement": "A bound task MUST validate the current workspace before a task mutation or ForgeLoop-owned verification launch.",
31
+ "tests": ["tests/workspace-binding.test.js", "tests/workspace-binding-run-check.test.js"],
32
+ "validator": "src/core/workspace-binding.js"
33
+ },
34
+ "FL-HANDOFF-001": {
35
+ "source": "LOOP_ENGINEERING.md",
36
+ "statement": "A canonical handoff MUST remain an immutable protocol-derived snapshot.",
37
+ "tests": ["tests/handoff-envelope.test.js"],
38
+ "validator": "src/core/handoff.js"
39
+ },
40
+ "FL-SCOPE-001": {
41
+ "source": "LOOP_ENGINEERING.md",
42
+ "statement": "A verification scope MUST narrow execution only from current canonical evidence.",
43
+ "tests": ["tests/verification-scope.test.js", "tests/verification-scope-freshness.test.js"],
44
+ "validator": "src/core/verification-scope.js"
45
+ },
46
+ "FL-ATTEST-001": {
47
+ "source": "LOOP_ENGINEERING.md",
48
+ "statement": "A code attestation MUST bind exact source content to a valid completion receipt and event-ledger checkpoint.",
49
+ "tests": ["tests/code-manifest.test.js", "tests/attestation.test.js", "tests/attestation-verifier.test.js"],
50
+ "validator": "src/core/attestation-verifier.js"
51
+ },
52
+ "FL-ATTEST-002": {
53
+ "source": "PROTOCOL_INTEGRATION.md",
54
+ "statement": "An integration MUST consume the canonical attestation result and preserve its trust distinctions.",
55
+ "tests": ["tests/generic-ci-attestation.test.js", "tests/integration-runtime.test.js"],
56
+ "validator": "src/core/command-runtime.js"
57
+ },
58
+ "FL-ATTEST-003": {
59
+ "source": "PROTOCOL_INTEGRATION.md",
60
+ "statement": "A signing integration MUST keep private keys, OIDC tokens, and credentials outside ForgeLoop artifacts.",
61
+ "tests": ["tests/signing-provider.test.js"],
62
+ "validator": "src/core/signing/"
63
+ },
64
+ "FL-SQ-001": {
65
+ "source": "LOOP_ENGINEERING.md",
66
+ "statement": "Structural-quality evidence MUST remain provider-neutral, task-bound, delta-first, and separate from behavioral, security, performance, accessibility, and publication truth.",
67
+ "tests": ["tests/structural-quality-policy.test.js", "tests/structural-quality-lifecycle.test.js"],
68
+ "validator": "src/core/structural-quality/service.js"
69
+ },
70
+ "FL-SQ-002": {
71
+ "source": "PROTOCOL_INTEGRATION.md",
72
+ "statement": "A structural-quality integration MUST preserve unavailable, malformed, stale, incomparable, and blocked provider results without promoting them to PASS.",
73
+ "tests": ["tests/sentrux-structural-quality-provider.test.js", "tests/structural-quality-artifacts.test.js"],
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"
99
+ }
100
+ }
101
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cassiomc1/forgeloop",
3
- "version": "1.12.0",
3
+ "version": "1.14.0",
4
4
  "description": "Portable, verifiable engineering protocol for AI coding environments and developer workflows",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,12 +51,16 @@
51
51
  ".github/copilot-instructions.md",
52
52
  "README.md",
53
53
  "DOCS_INDEX.md",
54
+ "CONTRIBUTING.md",
55
+ "docs/documentation-manifest.json",
56
+ "docs/protocol-requirements.json",
54
57
  "docs/diagrams",
55
58
  "docs/assets/diagrams",
56
59
  "docs/GETTING_STARTED.md",
57
60
  "docs/CROSS_HARNESS_CONTINUITY.md",
58
61
  "docs/ADVISORY_CONTEXT.md",
59
62
  "docs/RIPWIRE_ADAPTER.md",
63
+ "docs/OPENSRC_ADAPTER.md",
60
64
  "docs/CLI_REFERENCE.md",
61
65
  "docs/ARTIFACT_REFERENCE.md",
62
66
  "docs/TROUBLESHOOTING.md",
@@ -65,9 +69,21 @@
65
69
  "docs/DOCUMENTATION_GUIDE.md",
66
70
  "docs/RELEASE_CHECKLIST.md",
67
71
  "docs/PACKAGE_CONTENTS.md",
72
+ "docs/PROVIDER_ARCHITECTURE.md",
73
+ "docs/PROVIDERS.md",
74
+ "docs/SECURITY_REVIEW.md",
75
+ "docs/BROWSER_VERIFICATION.md",
76
+ "docs/AGENT_BROWSER_ADAPTER.md",
77
+ "docs/AGENT_BROWSER_VERIFICATION.md",
78
+ "docs/JEV_BENCHMARKS.md",
79
+ "docs/MODEL_ROUTING.md",
80
+ "docs/SEMANTIC_DECISION_PLANE.md",
81
+ "docs/TEST_INTELLIGENCE.md",
82
+ "docs/TEST_PRUNING.md",
68
83
  "scripts/CI_VALIDATORS.md",
69
84
  "docs/MCP.md",
70
85
  "docs/UNIVERSAL_INTEGRATION.md",
86
+ "docs/AUDIT_UX.md",
71
87
  "docs/DIAGNOSTIC_MODEL.md",
72
88
  "docs/EXECUTION_TRACE.md",
73
89
  "docs/CODE_ATTESTATION.md",
@@ -75,12 +91,18 @@
75
91
  "docs/SIGNING_PROVIDERS.md",
76
92
  "docs/PLATFORM_ADAPTERS.md",
77
93
  "docs/AGENT_PROTOCOL_SUMMARY.md",
94
+ "docs/AGENT_SKILL.md",
78
95
  "docs/EXECUTION_PROFILE_BENCHMARKS.md",
79
96
  "docs/REPOSITORY_INDEX.md",
80
97
  "docs/PERSISTENT_SEARCH_TRANSPORT.md",
81
98
  "docs/KNOWLEDGE_SOURCES.md",
82
99
  "scripts/generate-shell-completions.mjs",
83
100
  "scripts/generate-agent-protocol-summary.mjs",
101
+ "scripts/generate-forgeloop-skill.mjs",
102
+ "scripts/jev-smoke.mjs",
103
+ "scripts/benchmark-jev.mjs",
104
+ "scripts/benchmark-test-intelligence.mjs",
105
+ "skills/forgeloop",
84
106
  "scripts/run-execution-profile-benchmarks.mjs",
85
107
  "scripts/summarize-execution-profile-benchmarks.mjs",
86
108
  "scripts/validate-execution-profile-benchmarks.mjs",
@@ -103,6 +125,10 @@
103
125
  ],
104
126
  "scripts": {
105
127
  "test": "node scripts/run-tests.js",
128
+ "test:ci": "node scripts/run-tests.js --test-concurrency=2",
129
+ "test:watch": "node scripts/run-tests.js --watch",
130
+ "coverage:shard": "c8 --all --include=src/**/*.js --temp-directory=coverage-data npm run test:ci",
131
+ "coverage:report": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --temp-directory=coverage-data --check-coverage --lines=80 --functions=75 --branches=70 --statements=80 report",
106
132
  "pack:check": "node --test tests/package.test.js",
107
133
  "pack:smoke": "node scripts/package_smoke.mjs",
108
134
  "release:identity": "node scripts/verify_release_identity.mjs",
@@ -116,18 +142,20 @@
116
142
  "docs:report": "node scripts/report_documentation_health.mjs",
117
143
  "docs:check": "node scripts/run-docs-check.js",
118
144
  "lint": "eslint .",
119
- "coverage": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --check-coverage --lines=80 --functions=75 --branches=70 --statements=80 node scripts/run-tests.js",
145
+ "coverage": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --check-coverage --lines=80 --functions=75 --branches=70 --statements=80 npm run test:ci",
120
146
  "dependency:policy": "node scripts/check-dependency-policy.mjs",
121
147
  "mcp:test": "node scripts/run-mcp-tests.mjs",
122
148
  "completions:generate": "node scripts/generate-shell-completions.mjs --write",
123
149
  "completions:check": "node scripts/generate-shell-completions.mjs --check",
124
- "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",
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",
125
151
  "performance:check": "node scripts/benchmark-cli-startup.mjs",
126
152
  "critical-coverage:check": "node scripts/check-critical-coverage.mjs",
127
153
  "changelog:check": "node scripts/check-changelog-freshness.mjs",
128
154
  "attestation:summary": "node scripts/write-forgeloop-attestation-summary.mjs",
129
155
  "summary:generate": "node scripts/generate-agent-protocol-summary.mjs --write",
130
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",
131
159
  "mcp:setup": "node scripts/mcp-setup.mjs",
132
160
  "mcp:pack:check": "node scripts/mcp-package-smoke.mjs",
133
161
  "poc:evidence:verify": "node scripts/verify_poc_evidence.mjs",
@@ -140,7 +168,17 @@
140
168
  "benchmark:profiles:regression": "node scripts/check-efficiency-regression.mjs",
141
169
  "transactions:compact": "node scripts/compact-transactions.mjs",
142
170
  "complexity:check": "node scripts/check-complexity.mjs",
143
- "repository-index:manifest": "node scripts/verify-tgrep-manifest.mjs"
171
+ "repository-index:manifest": "node scripts/verify-tgrep-manifest.mjs",
172
+ "repository:hygiene": "node scripts/check-repository-hygiene.mjs",
173
+ "task-discovery:benchmark": "node scripts/benchmark-task-discovery.mjs",
174
+ "verify:fast": "node scripts/run-validation.mjs --tier fast",
175
+ "verify:local": "node scripts/run-validation.mjs --tier local",
176
+ "verify:prepush": "node scripts/run-validation.mjs --tier prepush",
177
+ "verify:release": "node scripts/run-validation.mjs --tier release",
178
+ "jev:smoke": "node scripts/jev-smoke.mjs",
179
+ "benchmark:jev": "node scripts/benchmark-jev.mjs",
180
+ "benchmark:jev:live": "node scripts/benchmark-jev.mjs --live",
181
+ "benchmark:test-intelligence": "node scripts/benchmark-test-intelligence.mjs"
144
182
  },
145
183
  "devDependencies": {
146
184
  "c8": "^12.0.0",
@@ -148,6 +186,10 @@
148
186
  "typescript": "7.0.2",
149
187
  "yaml": "2.9.0"
150
188
  },
189
+ "dependencies": {
190
+ "@typesafe-ai/sdk": "0.6.0",
191
+ "smol-toml": "1.8.0"
192
+ },
151
193
  "exports": {
152
194
  ".": "./src/cli.js",
153
195
  "./integration": {
@@ -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
+ }
@@ -18,7 +18,7 @@
18
18
  "properties": {
19
19
  "schemaVersion": { "const": 1 },
20
20
  "scope": { "enum": ["MATCH", "UNSCOPED", "NO_MATCH", "NONE"] },
21
- "frameworks": { "type": "array", "items": { "enum": ["flutter"] } },
21
+ "frameworks": { "type": "array", "items": { "enum": ["flutter", "dotnet", "aspnetcore", "abp", "nodejs", "rust", "c", "cpp", "java", "sql", "go", "typescript", "php", "swift"] } },
22
22
  "projectRoots": { "type": "array", "items": { "type": "string", "minLength": 1 } },
23
23
  "primarySignals": { "type": "array", "items": { "type": "string", "minLength": 1 } },
24
24
  "supportingSignals": { "type": "array", "items": { "type": "string", "minLength": 1 } }
@@ -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
+ }
@@ -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
+ }
@@ -41,26 +41,99 @@ Maintainers should distinguish between actual documentation link failures and ex
41
41
  - **Link-content failure (`Lychee`)**: The link checking step runs with `--verbose` and outputs the exact failing URL along with the HTTP status code (e.g. 404, 403). If a documentation URL is broken, update the link in the source Markdown. If a legitimate external host blocks shared CI runners or aggressively rate-limits CI automation, add a minimal, targeted exclusion in `.lychee.toml` with an explanatory comment.
42
42
  - **Action-download / Runner infrastructure failure (GitHub 429/502/503)**: When GitHub Actions fails during action checkout or tool download before running the test steps, this is a transient infrastructure issue rather than a project defect. Rerun the workflow without modifying project files.
43
43
 
44
- ## Node verification and receipt availability
44
+ ## Validation tiers
45
45
 
46
- The documentation workflow runs the documentation/tooling gates once on
47
- Linux with Node 24. Full suites cover Linux 20/22/24 and macOS/Windows 20/24,
48
- with no repeated platform/version pair in that workflow. Node 24 Linux also
49
- collects coverage. Package-content tests share one pack listing within their
50
- process. The dedicated Windows main-branch workflow remains separate.
46
+ The local runner makes the validation boundary explicit and never installs a
47
+ missing tool implicitly:
51
48
 
52
- The historical required status `validate (22)` is retained as an aggregate
53
- gate over validation, the full portability matrix, and diagram checks. It
54
- fails if any prerequisite fails, is cancelled, or is skipped. This preserves
55
- the existing branch ruleset without running another duplicate test suite.
49
+ | Tier | Command | Intended use |
50
+ | --- | --- | --- |
51
+ | Fast | `npm run verify:fast` | feedback while editing; quick Node, lint, dependency-policy, generated-doc, and repository-hygiene checks |
52
+ | Local | `npm run verify:local` | full deterministic source, documentation, manifest, and frozen Python checks |
53
+ | Pre-push | `npm run verify:prepush` | coverage, critical coverage, package/MCP checks, PoC checks, and the local suite expected before a PR |
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` |
55
+
56
+ Run `npm run mcp:setup` explicitly when the MCP package is not installed and
57
+ the MCP checks are in scope. If Python or another external validator is
58
+ unavailable, report `NOT_VERIFIED`; do not turn an unavailable check into a
59
+ pass by installing an unapproved tool.
60
+
61
+ The release tier reports `NOT_VERIFIED` until both
62
+ `FORGELOOP_RELEASE_VERSION` and `FORGELOOP_RELEASE_COMMIT` are supplied. When
63
+ present, those values are passed to the canonical `release:identity` command;
64
+ the runner never invents a release SHA or treats a pre-publication identity as
65
+ valid.
66
+
67
+ `npm run verify:prepush` deliberately runs coverage once and does not repeat
68
+ the full suite as a second `npm test`. `npm run lint`,
69
+ `npm run complexity:check`, and `npm run critical-coverage:check` retain
70
+ independent purposes: syntax and usage correctness, hotspot growth, and
71
+ coverage of critical modules. Packed TypeScript consumers validate the public
72
+ declarations; YAML-based tests validate workflow semantics. The approved exact
73
+ runtime dependencies are `@typesafe-ai/sdk` and `smol-toml`.
74
+
75
+ ## GitHub Actions boundary
76
+
77
+ Ordinary pull requests use `.github/workflows/pr-core.yml`. It preserves the
78
+ ruleset's exact required contexts:
79
+
80
+ - `audit`
81
+ - `CodeQL`
82
+ - `Verify generated Archify diagram`
83
+ - `validate (22)`
84
+ - `tarball smoke (ubuntu-latest)`
85
+ - `dependency-review`
86
+
87
+ `validate (22)` is an always-present, fail-closed aggregator over the core
88
+ matrix and the path-applicable documentation, audit, package, and native
89
+ Repository Index jobs. An optional Repository Index job may be skipped only
90
+ when the classifier says that the change cannot affect it; the aggregator
91
+ rejects every unexpected skip, failure, or cancellation. The aggregator is
92
+ the status required by the branch ruleset, not a second copy of the Node
93
+ suite.
94
+
95
+ The path classifier is deterministic and testable locally:
96
+
97
+ ```bash
98
+ node scripts/ci-scenario-check.mjs
99
+ node scripts/ci-classify.mjs --paths README.md --json
100
+ node scripts/ci-classify.mjs --all --json
101
+ ```
102
+
103
+ Documentation-only pull requests use quick core validation plus the
104
+ documentation/diagram path; the Node 20 matrix steps do not install or run for
105
+ docs-only changes. Runtime and package changes use Node 20 compatibility checks
106
+ and four Node 24 unit shards wrapped by the coverage gate, followed by a
107
+ coverage-only aggregation. Repository Index changes retain the native reusable
108
+ workflow and its platform matrix. Package
109
+ smoke is Ubuntu-only on ordinary PRs and expands to macOS/Windows through the
110
+ explicit release matrix. The main branch retains dedicated documentation,
111
+ Node compatibility, package smoke, audit, and Windows full-suite workflows;
112
+ those workflows are the place for broader post-merge or release validation.
113
+
114
+ CodeQL and dependency review remain independent GitHub security gates. The
115
+ repository's GitHub secret scanning and push protection remain enabled; the
116
+ custom `scan_secrets.py` check is a local/pre-push compatibility validator and
117
+ is not duplicated in every ordinary PR job.
118
+
119
+ ## Receipts and infrastructure failures
56
120
 
57
121
  `npm run lint`, `npm run complexity:check`, and
58
122
  `npm run critical-coverage:check` retain independent purposes: syntax and
59
123
  usage correctness, hotspot growth, and coverage of critical modules. Packed
60
124
  TypeScript consumers validate the public declarations; YAML-based tests
61
- validate workflow semantics. The core runtime remains dependency-free.
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.
62
128
 
63
129
  `scripts/audit-receipts.mjs` runs after checkout. It audits supplied scoped
64
130
  receipts with explicit task IDs, fails on an invalid audit, and reports
65
131
  `NOT_VERIFIED` when none are supplied. This repository job does not create
66
132
  lifecycle evidence from CI test results.
133
+
134
+ Maintainers should distinguish actual validation failures from external
135
+ CI/action infrastructure errors. A Lychee link failure identifies the exact
136
+ URL and status; update Markdown or add only a targeted, explained exclusion
137
+ for a legitimate shared-runner restriction. An action-download or runner
138
+ failure before project steps begin (for example GitHub 429/502/503) is
139
+ infrastructure and should be retried without changing project files.
@@ -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));
@@ -7,6 +7,8 @@ import { fileURLToPath } from "node:url";
7
7
  import { ARTIFACT_REGISTRY } from "../src/core/artifact-registry.js";
8
8
  import { CLI_COMMAND_DEFINITIONS } from "../src/core/cli-command-definitions.js";
9
9
  import { PUBLIC_ERROR_REGISTRY } from "../src/core/error-codes.js";
10
+ import { PROJECT_DETECTION_LIMITS, PROJECT_EVIDENCE_SCHEMA_VERSION } from "../src/core/project-detection.js";
11
+ import { GUIDE_REGISTRY } from "../src/core/guide-registry.js";
10
12
  import { protocolInfo } from "../src/core/protocol-info.js";
11
13
 
12
14
  const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
@@ -43,6 +45,12 @@ function commandCatalog() {
43
45
  .join("\n\n");
44
46
  }
45
47
 
48
+ function guideCatalog() {
49
+ const rows = Object.entries(GUIDE_REGISTRY)
50
+ .map(([id, definition]) => [id, definition.path, definition.install ? "yes" : "no"]);
51
+ return `## Guide registry\n\n${table(["Guide", "Path", "Installable"], rows)}`;
52
+ }
53
+
46
54
  async function render() {
47
55
  const packageJson = JSON.parse(await readFile(path.join(repositoryRoot, "package.json"), "utf8"));
48
56
  const info = protocolInfo({ packageVersion: packageJson.version });
@@ -51,6 +59,7 @@ async function render() {
51
59
  .map(([name, feature]) => [name, feature.version ?? "n/a", feature.supported === false ? "no" : "yes"]);
52
60
  const handoffs = info.features.canonicalHandoffs;
53
61
  const advisory = info.features.advisoryContextProviders;
62
+ const providerExtensions = info.features.providerExtensions;
54
63
  const capabilityContracts = `## Capability contracts
55
64
 
56
65
  - \`canonicalHandoffs\` v${handoffs.version}: immutable, supported, and
@@ -62,6 +71,8 @@ async function render() {
62
71
  Integration-API-only, lazy, and opt-in. Provider results are not persisted by
63
72
  ForgeLoop and are never lifecycle state, evidence, authority, or executable
64
73
  instructions.
74
+ - \`providerExtensions\` v${providerExtensions.version} is provider-neutral and
75
+ experimental. The generic provider registry remains internal and unexported.
65
76
 
66
77
  Protocol v1, schema v1, and Integration API v1 remain independent of these
67
78
  capability-family versions.`;
@@ -95,6 +106,32 @@ Package version: ${packageJson.version}
95
106
  6. Run forgeloop complete; accept completion only when the validator returns VALID.
96
107
  7. Run forgeloop next again and follow the returned lifecycle action to a terminal state or an explicit blocker.
97
108
 
109
+ ## Project evidence and guide routing
110
+
111
+ - The canonical guide registry is \`src/config/guides.json\`; the .NET
112
+ specialist has guide ID \`dotnet\` and resolves to
113
+ \`ENG/dotnet-aspnetcore-development-eng.md\`.
114
+ - Project evidence schema v${PROJECT_EVIDENCE_SCHEMA_VERSION} recognizes
115
+ structurally parsed Flutter, SDK-style .NET, Node.js, Rust, C, C++, Java,
116
+ SQL, Go, TypeScript, PHP, and Swift project evidence. SQL remains a bounded
117
+ owned-file overlay, while same-root language identities compose. ASP.NET Core
118
+ and ABP are conditional overlays recorded as reasons on \`dotnet\`; they
119
+ are not standalone guide IDs, and route validation requires each overlay to
120
+ include \`dotnet\`.
121
+ - Project detection is bounded by ${PROJECT_DETECTION_LIMITS.maxManifests}
122
+ manifests, ${PROJECT_DETECTION_LIMITS.maxSolutionFiles} solution files,
123
+ ${PROJECT_DETECTION_LIMITS.maxManifestBytes} bytes per manifest,
124
+ ${PROJECT_DETECTION_LIMITS.maxSourceFiles} supporting source files,
125
+ ${PROJECT_DETECTION_LIMITS.maxSourceBytes} bytes per source file,
126
+ ${PROJECT_DETECTION_LIMITS.maxVisitedDirectories} visited directories, and
127
+ ${PROJECT_DETECTION_LIMITS.maxVisitedEntries} visited entries. It skips
128
+ symlinks and configured generated/vendor directories; exhausted budgets fail
129
+ closed rather than producing unbounded discovery.
130
+ - Task ownership discovery is a separate exhaustive operation. Task-list
131
+ filters and pagination project the validated discovery result and do not
132
+ remove ledger or recovery evidence. See \`GUIDE_ROUTER.md\` and
133
+ \`docs/CLI_REFERENCE.md\` for the operator-facing contracts.
134
+
98
135
  ## Adaptive execution profiles
99
136
 
100
137
  \`complianceMode\` controls how strongly project policy is enforced. The
@@ -139,7 +176,7 @@ or \`NOT_COMPARABLE\` when evidence is absent or incompatible. See
139
176
  - Responsibility contracts constrain paths, checks, and frozen inputs; they do not prove identity or authorship.
140
177
  - Verification scope describes planned verification breadth. Attestation coverage proves content for a concrete revision. These are separate claims.
141
178
  - Attestation manifests exclude ForgeLoop protocol metadata and bind to the completion receipt and append-only ledger without circular references.
142
- - 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.
143
180
 
144
181
  ## Lifecycle
145
182
 
@@ -151,6 +188,8 @@ ${table(["Feature", "Version", "Supported"], features)}
151
188
 
152
189
  ${capabilityContracts}
153
190
 
191
+ ${guideCatalog()}
192
+
154
193
  ## Public artifact registry
155
194
 
156
195
  ${table(["Key", "Scope", "Path", "Schema", "Trust role"], artifacts)}