@jimhoyd/urlcode 0.3.0 → 0.4.0-alpha.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 (380) hide show
  1. package/.claude/skills/urlcode-authoring/SKILL.md +122 -0
  2. package/.claude/skills/urlcode-operations/SKILL.md +108 -0
  3. package/.claude-plugin/marketplace.json +18 -0
  4. package/CONTRIBUTING.md +30 -2
  5. package/README.md +195 -255
  6. package/ROADMAP.md +143 -15
  7. package/SECURITY.md +31 -9
  8. package/dist/BUILD-MANIFEST.json +72 -47
  9. package/dist/adapters.js +4 -23
  10. package/dist/agent-lists.js +1 -1
  11. package/dist/agents-guide.js +113 -0
  12. package/dist/authoring-files.js +60 -0
  13. package/dist/authoring.js +11 -1
  14. package/dist/aws.js +4 -3
  15. package/dist/build-cloudflare.js +11 -24
  16. package/dist/build-static.js +134 -0
  17. package/dist/bulk.js +37 -0
  18. package/dist/capabilities.js +262 -0
  19. package/dist/capability-query.js +71 -0
  20. package/dist/catalog.js +105 -0
  21. package/dist/cli.js +165 -34
  22. package/dist/client-address.js +1 -1
  23. package/dist/compliance-rules/baseline.js +9 -17
  24. package/dist/compliance-rules/privacy.js +7 -18
  25. package/dist/compliance-rules/shared.js +0 -2
  26. package/dist/compliance-rules/strict.js +5 -5
  27. package/dist/compliance.js +6 -8
  28. package/dist/conditions.js +88 -0
  29. package/dist/config.js +69 -6
  30. package/dist/context.js +155 -0
  31. package/dist/ecosystem-cli.js +88 -0
  32. package/dist/egress.js +98 -0
  33. package/dist/examples.js +92 -0
  34. package/dist/explain-cli.js +64 -0
  35. package/dist/explain.js +131 -0
  36. package/dist/extensions.js +231 -0
  37. package/dist/function-sources.js +49 -5
  38. package/dist/function-worker.js +3 -1
  39. package/dist/functions.js +84 -13
  40. package/dist/guest-api.js +29 -3
  41. package/dist/index.js +40 -6
  42. package/dist/init-with.js +165 -0
  43. package/dist/interchange-cli.js +42 -0
  44. package/dist/interchange.js +189 -0
  45. package/dist/manifest.js +109 -0
  46. package/dist/match.js +2 -2
  47. package/dist/mcp-authoring.js +147 -0
  48. package/dist/mcp.js +97 -0
  49. package/dist/observability.js +7 -21
  50. package/dist/operator-host.js +29 -0
  51. package/dist/plugins.js +12 -0
  52. package/dist/policies/agents.js +2 -2
  53. package/dist/policies/cache.js +8 -3
  54. package/dist/policies/compression.js +2 -1
  55. package/dist/policies/security.js +0 -0
  56. package/dist/policies.js +1 -1
  57. package/dist/policy.js +56 -15
  58. package/dist/prerender.js +100 -41
  59. package/dist/project-tests.js +3 -3
  60. package/dist/provider-verification.js +92 -0
  61. package/dist/proxy.js +44 -0
  62. package/dist/readiness.js +34 -11
  63. package/dist/recipes.js +41 -0
  64. package/dist/route-diff.js +106 -0
  65. package/dist/router.js +45 -7
  66. package/dist/runtime.js +164 -64
  67. package/dist/sandbox.js +48 -0
  68. package/dist/scaffold.js +0 -0
  69. package/dist/schema-query.js +62 -0
  70. package/dist/scripts/operational-drills.js +12 -54
  71. package/dist/server.js +3 -29
  72. package/dist/signals.js +24 -0
  73. package/dist/site.js +0 -0
  74. package/dist/tooling.js +96 -0
  75. package/dist/trusted-functions.js +210 -0
  76. package/dist/types/adapters.d.ts +7 -4
  77. package/dist/types/agent-lists.d.ts +0 -1
  78. package/dist/types/agents-guide.d.ts +17 -0
  79. package/dist/types/authoring-files.d.ts +10 -0
  80. package/dist/types/aws.d.ts +3 -1
  81. package/dist/types/build-cloudflare.d.ts +1 -0
  82. package/dist/types/build-static.d.ts +43 -0
  83. package/dist/types/bulk.d.ts +27 -0
  84. package/dist/types/capabilities.d.ts +64 -0
  85. package/dist/types/capability-query.d.ts +24 -0
  86. package/dist/types/catalog.d.ts +65 -0
  87. package/dist/types/client-address.d.ts +0 -1
  88. package/dist/types/compliance-rules/baseline.d.ts +1 -9
  89. package/dist/types/compliance-rules/privacy.d.ts +1 -4
  90. package/dist/types/compliance-rules/shared.d.ts +0 -2
  91. package/dist/types/compliance-rules/strict.d.ts +0 -5
  92. package/dist/types/compliance.d.ts +0 -3
  93. package/dist/types/conditions.d.ts +19 -0
  94. package/dist/types/config.d.ts +21 -2
  95. package/dist/types/context.d.ts +66 -0
  96. package/dist/types/ecosystem-cli.d.ts +17 -0
  97. package/dist/types/egress.d.ts +46 -0
  98. package/dist/types/examples.d.ts +50 -0
  99. package/dist/types/explain-cli.d.ts +11 -0
  100. package/dist/types/explain.d.ts +95 -0
  101. package/dist/types/extensions.d.ts +177 -0
  102. package/dist/types/function-sources.d.ts +9 -0
  103. package/dist/types/functions.d.ts +48 -5
  104. package/dist/types/guest-api.d.ts +1 -0
  105. package/dist/types/index.d.ts +36 -6
  106. package/dist/types/init-with.d.ts +30 -0
  107. package/dist/types/interchange-cli.d.ts +16 -0
  108. package/dist/types/interchange.d.ts +42 -0
  109. package/dist/types/manifest.d.ts +79 -0
  110. package/dist/types/match.d.ts +1 -0
  111. package/dist/types/mcp-authoring.d.ts +92 -0
  112. package/dist/types/mcp.d.ts +12 -0
  113. package/dist/types/observability.d.ts +3 -14
  114. package/dist/types/operator-host.d.ts +8 -0
  115. package/dist/types/plugins.d.ts +2 -0
  116. package/dist/types/policies/agents.d.ts +0 -2
  117. package/dist/types/policies/compression.d.ts +2 -0
  118. package/dist/types/policies/security.d.ts +0 -1
  119. package/dist/types/policy.d.ts +15 -4
  120. package/dist/types/project-tests.d.ts +3 -2
  121. package/dist/types/provider-verification.d.ts +53 -0
  122. package/dist/types/proxy.d.ts +21 -0
  123. package/dist/types/readiness.d.ts +10 -3
  124. package/dist/types/recipes.d.ts +30 -0
  125. package/dist/types/route-diff.d.ts +27 -0
  126. package/dist/types/router.d.ts +2 -1
  127. package/dist/types/runtime.d.ts +11 -27
  128. package/dist/types/sandbox.d.ts +12 -0
  129. package/dist/types/scaffold.d.ts +0 -2
  130. package/dist/types/schema-query.d.ts +12 -0
  131. package/dist/types/server.d.ts +1 -4
  132. package/dist/types/signals.d.ts +25 -0
  133. package/dist/types/site.d.ts +0 -1
  134. package/dist/types/tooling.d.ts +115 -0
  135. package/dist/types/trusted-functions.d.ts +29 -0
  136. package/dist/types/types.d.ts +71 -7
  137. package/dist/types/typescript-authoring.d.ts +12 -0
  138. package/dist/types/vercel.d.ts +3 -1
  139. package/dist/types/verify-deployment.d.ts +47 -0
  140. package/dist/types.js +37 -5
  141. package/dist/typescript-authoring.js +142 -0
  142. package/dist/vercel.js +4 -3
  143. package/dist/verify-deployment.js +270 -0
  144. package/docs/AI-AUTHORING.md +232 -15
  145. package/docs/AWS.md +4 -4
  146. package/docs/BEST-PRACTICES.md +3 -2
  147. package/docs/BULK.md +79 -0
  148. package/docs/CAPABILITIES.md +192 -0
  149. package/docs/CAPACITY.md +129 -32
  150. package/docs/CI.md +142 -0
  151. package/docs/CLOUDFLARE.md +1 -2
  152. package/docs/COMPLIANCE.md +6 -9
  153. package/docs/CONDITIONS.md +74 -0
  154. package/docs/DEPLOYMENT-CHECKS.md +108 -0
  155. package/docs/EGRESS.md +125 -0
  156. package/docs/EXTENSIONS.md +398 -0
  157. package/docs/FRAMEWORK.md +198 -0
  158. package/docs/FUNCTION-SECURITY.md +129 -32
  159. package/docs/INSTALL.md +45 -12
  160. package/docs/INTERCHANGE.md +134 -0
  161. package/docs/LOAD-TESTING.md +4 -4
  162. package/docs/MIDDLEWARE-EXAMPLES.md +75 -0
  163. package/docs/MIDDLEWARE.md +29 -16
  164. package/docs/MONITORING.md +2 -19
  165. package/docs/NEXT-PHASE-PLAN.md +98 -0
  166. package/docs/NEXT-STEPS.md +634 -0
  167. package/docs/OBSERVABILITY.md +11 -18
  168. package/docs/OPEN-DECISIONS.md +212 -0
  169. package/docs/OPERATIONAL-PROOF.md +30 -31
  170. package/docs/OPERATIONS.md +29 -35
  171. package/docs/PLUGINS.md +37 -0
  172. package/docs/POLICIES.md +23 -309
  173. package/docs/PRERENDER.md +41 -1
  174. package/docs/PROJECT-DIRECTION.md +75 -8
  175. package/docs/PROVIDER-VERIFICATION.md +84 -0
  176. package/docs/READINESS.md +21 -1
  177. package/docs/README.md +87 -34
  178. package/docs/RECIPES.md +99 -0
  179. package/docs/RELEASE-READINESS.md +57 -35
  180. package/docs/RELEASE-SECURITY.md +116 -7
  181. package/docs/RESILIENCE.md +16 -15
  182. package/docs/ROUTING.md +8 -10
  183. package/docs/SANDBOX-REVIEW.md +19 -6
  184. package/docs/SCAFFOLDING.md +0 -2
  185. package/docs/SECURITY-AUDIT.md +41 -1
  186. package/docs/SPECIFICATION.md +150 -29
  187. package/docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md +287 -0
  188. package/docs/SPIKE-BUSINESS-SUITE.md +1021 -0
  189. package/docs/SPIKE-CORE-LAYERING.md +337 -0
  190. package/docs/SPIKE-DEFAULT-TRUST-MODEL.md +209 -0
  191. package/docs/SPIKE-EXTENSION-MODEL.md +419 -0
  192. package/docs/SPIKE-EXTENSIONS.md +6 -0
  193. package/docs/SPIKE-LAMBDA-COMPILE.md +201 -0
  194. package/docs/SPIKE-MONOREPO.md +322 -0
  195. package/docs/STANDARDS.md +150 -142
  196. package/docs/STARTERS.md +21 -1
  197. package/docs/STATIC.md +94 -0
  198. package/docs/TOOLING.md +295 -0
  199. package/docs/TUNNELS.md +0 -3
  200. package/docs/TYPESCRIPT-AUTHORING.md +82 -0
  201. package/docs/TYPESCRIPT.md +25 -4
  202. package/docs/USABILITY-REVIEW.md +129 -0
  203. package/docs/VERCEL.md +4 -5
  204. package/docs/VERSION-ALIGNMENT.md +205 -0
  205. package/docs/YAML-GUIDE.md +15 -479
  206. package/docs/YAML-REFERENCE.md +143 -22
  207. package/docs/policies/agents.md +1 -1
  208. package/docs/policies/cache.md +13 -0
  209. package/docs/policies/contract.md +52 -0
  210. package/docs/policies/hardened.md +56 -0
  211. package/docs/policies/interoperability.md +169 -0
  212. package/docs/policies/operations.md +45 -0
  213. package/docs/yaml/assets.md +36 -0
  214. package/docs/yaml/conditions.md +20 -0
  215. package/docs/yaml/functions.md +160 -0
  216. package/docs/yaml/middleware.md +29 -0
  217. package/docs/yaml/organization.md +74 -0
  218. package/docs/yaml/policies.md +37 -0
  219. package/docs/yaml/redirects.md +64 -0
  220. package/docs/yaml/responses.md +57 -0
  221. package/docs/yaml/site.md +24 -0
  222. package/examples/assets/example.yaml +17 -0
  223. package/examples/aws/example.yaml +20 -0
  224. package/examples/cloudflare/example.yaml +19 -0
  225. package/examples/compliance/example.yaml +11 -0
  226. package/examples/conditions/README.md +12 -0
  227. package/examples/conditions/example.yaml +19 -0
  228. package/examples/conditions/tests/requests.json +13 -0
  229. package/examples/conditions/urlcode.yaml +24 -0
  230. package/examples/cookbook/README.md +8 -4
  231. package/examples/cookbook/example.yaml +17 -0
  232. package/examples/cookbook/functions/catalog.mjs +3 -0
  233. package/examples/cookbook/functions/fail.mjs +4 -0
  234. package/examples/cookbook/functions/items.mjs +3 -0
  235. package/examples/cookbook/functions/profile.mjs +3 -0
  236. package/examples/cookbook/functions/resource.mjs +3 -0
  237. package/examples/cookbook/functions/status.mjs +3 -0
  238. package/examples/cookbook/middleware/auth.mjs +48 -0
  239. package/examples/cookbook/middleware/body.mjs +15 -0
  240. package/examples/cookbook/middleware/bucket.mjs +29 -0
  241. package/examples/cookbook/middleware/cors.mjs +21 -0
  242. package/examples/cookbook/middleware/debug.mjs +13 -0
  243. package/examples/cookbook/middleware/envelope.mjs +11 -0
  244. package/examples/cookbook/middleware/errors.mjs +11 -0
  245. package/examples/cookbook/middleware/etag.mjs +18 -0
  246. package/examples/cookbook/middleware/locale.mjs +20 -0
  247. package/examples/cookbook/middleware/maintenance.mjs +10 -0
  248. package/examples/cookbook/middleware/methods.mjs +15 -0
  249. package/examples/cookbook/middleware/negotiate.mjs +20 -0
  250. package/examples/cookbook/middleware/referer.mjs +12 -0
  251. package/examples/cookbook/middleware/request-id.mjs +16 -0
  252. package/examples/cookbook/route-index.json +676 -0
  253. package/examples/cookbook/routes/middleware.yaml +126 -0
  254. package/examples/cookbook/tests/requests.json +526 -0
  255. package/examples/cookbook/urlcode.yaml +1 -0
  256. package/examples/egress/README.md +22 -0
  257. package/examples/egress/example.yaml +19 -0
  258. package/examples/egress/urlcode.yaml +19 -0
  259. package/examples/extensions/README.md +7 -0
  260. package/examples/extensions/example.yaml +21 -0
  261. package/examples/extensions/urlcode.yaml +25 -0
  262. package/examples/monitoring/example.yaml +8 -0
  263. package/examples/prerender/README.md +2 -2
  264. package/examples/prerender/example.yaml +16 -0
  265. package/examples/provider-conformance/README.md +12 -0
  266. package/examples/provider-conformance/example.yaml +14 -0
  267. package/examples/provider-conformance/urlcode.yaml +34 -0
  268. package/examples/tunnel/example.yaml +8 -0
  269. package/examples/vercel/example.yaml +19 -0
  270. package/llms-full.txt +3084 -0
  271. package/llms.txt +61 -21
  272. package/package.json +36 -7
  273. package/packaging/claude-plugin/.claude-plugin/plugin.json +19 -0
  274. package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +122 -0
  275. package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +108 -0
  276. package/recipes/authenticated-json-api/README.md +51 -0
  277. package/recipes/authenticated-json-api/functions/profile.mjs +5 -0
  278. package/recipes/authenticated-json-api/recipe.yaml +34 -0
  279. package/recipes/authenticated-json-api/tests/requests.json +39 -0
  280. package/recipes/authenticated-json-api/urlcode.yaml +12 -0
  281. package/recipes/contact-form/README.md +25 -0
  282. package/recipes/contact-form/functions/contact.mjs +17 -0
  283. package/recipes/contact-form/recipe.yaml +33 -0
  284. package/recipes/contact-form/tests/requests.json +47 -0
  285. package/recipes/contact-form/urlcode.yaml +18 -0
  286. package/recipes/cors-api/README.md +16 -0
  287. package/recipes/cors-api/functions/items.mjs +3 -0
  288. package/recipes/cors-api/middleware/cors.mjs +21 -0
  289. package/recipes/cors-api/recipe.yaml +26 -0
  290. package/recipes/cors-api/tests/requests.json +65 -0
  291. package/recipes/cors-api/urlcode.yaml +12 -0
  292. package/recipes/health-page/README.md +13 -0
  293. package/recipes/health-page/recipe.yaml +23 -0
  294. package/recipes/health-page/tests/requests.json +36 -0
  295. package/recipes/health-page/urlcode.yaml +19 -0
  296. package/recipes/json-api/README.md +6 -0
  297. package/recipes/json-api/functions/echo.mjs +3 -0
  298. package/recipes/json-api/recipe.yaml +25 -0
  299. package/recipes/json-api/tests/requests.json +34 -0
  300. package/recipes/json-api/urlcode.yaml +12 -0
  301. package/recipes/middleware/README.md +34 -0
  302. package/recipes/middleware/functions/catalog.mjs +3 -0
  303. package/recipes/middleware/functions/fail.mjs +4 -0
  304. package/recipes/middleware/functions/items.mjs +3 -0
  305. package/recipes/middleware/functions/profile.mjs +3 -0
  306. package/recipes/middleware/functions/resource.mjs +3 -0
  307. package/recipes/middleware/functions/status.mjs +3 -0
  308. package/recipes/middleware/middleware/auth.mjs +48 -0
  309. package/recipes/middleware/middleware/body.mjs +15 -0
  310. package/recipes/middleware/middleware/bucket.mjs +29 -0
  311. package/recipes/middleware/middleware/cors.mjs +21 -0
  312. package/recipes/middleware/middleware/debug.mjs +13 -0
  313. package/recipes/middleware/middleware/envelope.mjs +11 -0
  314. package/recipes/middleware/middleware/errors.mjs +11 -0
  315. package/recipes/middleware/middleware/etag.mjs +18 -0
  316. package/recipes/middleware/middleware/locale.mjs +20 -0
  317. package/recipes/middleware/middleware/maintenance.mjs +10 -0
  318. package/recipes/middleware/middleware/methods.mjs +15 -0
  319. package/recipes/middleware/middleware/negotiate.mjs +20 -0
  320. package/recipes/middleware/middleware/referer.mjs +12 -0
  321. package/recipes/middleware/middleware/request-id.mjs +16 -0
  322. package/recipes/middleware/public/guide.txt +1 -0
  323. package/recipes/middleware/recipe.yaml +50 -0
  324. package/recipes/middleware/tests/requests.json +528 -0
  325. package/recipes/middleware/urlcode.yaml +127 -0
  326. package/recipes/protected-download/README.md +22 -0
  327. package/recipes/protected-download/files/report.txt +1 -0
  328. package/recipes/protected-download/recipe.yaml +31 -0
  329. package/recipes/protected-download/tests/requests.json +32 -0
  330. package/recipes/protected-download/urlcode.yaml +15 -0
  331. package/recipes/redirect/README.md +7 -0
  332. package/recipes/redirect/recipe.yaml +25 -0
  333. package/recipes/redirect/tests/requests.json +19 -0
  334. package/recipes/redirect/urlcode.yaml +9 -0
  335. package/recipes/static-plus-api/README.md +15 -0
  336. package/recipes/static-plus-api/functions/info.mjs +3 -0
  337. package/recipes/static-plus-api/public/assets/index.html +3 -0
  338. package/recipes/static-plus-api/public/assets/site.css +1 -0
  339. package/recipes/static-plus-api/public/index.html +8 -0
  340. package/recipes/static-plus-api/recipe.yaml +29 -0
  341. package/recipes/static-plus-api/tests/requests.json +56 -0
  342. package/recipes/static-plus-api/urlcode.yaml +23 -0
  343. package/recipes/typescript/README.md +8 -0
  344. package/recipes/typescript/functions/hello.ts +5 -0
  345. package/recipes/typescript/recipe.yaml +23 -0
  346. package/recipes/typescript/tests/requests.json +18 -0
  347. package/recipes/typescript/urlcode.yaml +5 -0
  348. package/recipes/webhook-receiver/README.md +20 -0
  349. package/recipes/webhook-receiver/functions/receive.mjs +16 -0
  350. package/recipes/webhook-receiver/recipe.yaml +27 -0
  351. package/recipes/webhook-receiver/tests/requests.json +59 -0
  352. package/recipes/webhook-receiver/urlcode.yaml +23 -0
  353. package/schemas/recipe.schema.json +139 -0
  354. package/schemas/urlcode.schema.json +659 -110
  355. package/skills/urlcode/SKILL.md +119 -0
  356. package/starters/default/.github/workflows/urlcode.yml +23 -0
  357. package/starters/default/.mcp.json +12 -0
  358. package/starters/default/AGENTS.md +79 -0
  359. package/starters/default/urlcode.yaml +0 -1
  360. package/dist/link-api.js +0 -136
  361. package/dist/link-cli.js +0 -141
  362. package/dist/link-events.js +0 -76
  363. package/dist/link-records.js +0 -31
  364. package/dist/link-store-worker.js +0 -150
  365. package/dist/link-store.js +0 -250
  366. package/dist/management-policy.js +0 -41
  367. package/dist/sqlite-version.js +0 -6
  368. package/dist/types/link-api.d.ts +0 -30
  369. package/dist/types/link-cli.d.ts +0 -36
  370. package/dist/types/link-events.d.ts +0 -27
  371. package/dist/types/link-records.d.ts +0 -11
  372. package/dist/types/link-store-worker.d.ts +0 -1
  373. package/dist/types/link-store.d.ts +0 -130
  374. package/dist/types/management-policy.d.ts +0 -9
  375. package/dist/types/sqlite-version.d.ts +0 -1
  376. package/docs/DYNAMIC-LINKS.md +0 -561
  377. package/docs/MANAGEMENT-SECURITY.md +0 -82
  378. package/examples/live-links/README.md +0 -11
  379. package/examples/live-links/tests/requests.json +0 -6
  380. package/examples/live-links/urlcode.yaml +0 -16
@@ -0,0 +1,287 @@
1
+ # Spike: AI-first URLCode framework benchmark
2
+
3
+ Status: proposed research and execution plan. This document adds no benchmark
4
+ implementation or measured results. It preserves the agreed independent-agent
5
+ experiment and improvement loop; executing the phases below is follow-up work.
6
+
7
+ ## Objective and core principle
8
+
9
+ Measure whether autonomous agents can build a correct, realistic application
10
+ with URLCode, how much application intent its abstractions express, how easily
11
+ agents discover those abstractions, and how the resulting application performs.
12
+ Report AI effectiveness, framework expressiveness, AI discoverability and runtime
13
+ performance separately. Do not collapse them into a single score or assume that
14
+ URLCode will outperform another framework.
15
+
16
+ The canonical implementation rule for the explicitly guided run is:
17
+
18
+ > Use URLCode's highest-level declarative features whenever possible. Generate custom JavaScript only when the framework cannot express the requirement.
19
+
20
+ Before implementing functionality manually, check for a declarative primitive,
21
+ YAML configuration, built-in capability, extension, reusable template or documented
22
+ pattern. Custom JavaScript is an escape hatch. The experiment must also establish
23
+ whether an unfamiliar agent discovers this approach without explicit coaching.
24
+
25
+ ## Phase 0 — Research existing work first
26
+
27
+ Before building the application or a new harness, investigate:
28
+
29
+ - RealWorld / Conduit and its reusable application and acceptance specification.
30
+ - TechEmpower Framework Benchmarks and their runtime methodology.
31
+ - SWE-bench and other coding-agent benchmarks.
32
+ - Agent productivity studies, framework comparison applications and standard
33
+ CRUD/full-stack benchmark applications.
34
+ - URLCode's existing [agent harness](../benchmarks/agent/README.md), authoring
35
+ evals, [next-steps plan](NEXT-STEPS.md), and runtime benchmarks in
36
+ `benchmarks/routing.ts`, `benchmarks/bulk.ts` and
37
+ `benchmarks/sandbox-vs-trusted.ts`.
38
+
39
+ Write a dated research report with primary-source links, versions/revisions,
40
+ what each candidate measures, what can be reused, what is missing, and the
41
+ reuse/adapt/build decision. Verify current maintenance status during research;
42
+ do not assume this proposal is novel or that an additional suite is necessary.
43
+
44
+ The existing agent harness already records shared acceptance results, generated
45
+ lines, prompts and provider-reported usage. Its README explicitly limits claims:
46
+ its tasks do not test persistence or runtime performance, its URLCode arm receives
47
+ curated guidance, and stub records are pipeline tests rather than model evidence.
48
+ Reuse suitable accounting and acceptance infrastructure after auditing it against
49
+ the current runtime. Do not treat its guided arm as the unprompted baseline or
50
+ silently reinterpret historical measurements under a new counting rule.
51
+
52
+ Exit criterion: record the selected specification and harness approach before
53
+ implementation begins, including the evidence for any departure from existing work.
54
+
55
+ ## Phase 1 — Freeze a realistic, framework-neutral specification
56
+
57
+ Prefer RealWorld when practical. Otherwise justify a smaller RealWorld-inspired
58
+ application, such as TaskFlow: users own projects, projects contain tasks, and
59
+ users cannot access another user's private records. A basic Todo application alone
60
+ is insufficient. Freeze observable API behavior and shared acceptance tests before
61
+ agent runs; use exactly the same requirements for URLCode and Fastify.
62
+
63
+ Exercise routing, CRUD, authentication, authorization, persistent relational data,
64
+ relationships, validation, structured errors, filtering, sorting, pagination,
65
+ environment configuration, secrets, middleware, logging and automated tests.
66
+ Include registration/login, current-user lookup, ownership checks, restart
67
+ persistence, invalid inputs and unauthenticated/unauthorized requests in acceptance
68
+ coverage. Define logout semantics if applicable to the selected authentication
69
+ model. Specify a health endpoint and reproducible schema/migrations and seed data.
70
+
71
+ Also define isolated plaintext, JSON serialization, single-record database read
72
+ and database write endpoints, borrowing established runtime benchmark semantics
73
+ where practical. Freeze response bodies, status codes, headers, data size, database
74
+ work and cache behavior; database reads must actually hit the database, and writes
75
+ must persist. Keep these separate from realistic application workloads.
76
+
77
+ Use the same database engine/version and equivalent data in all comparable runs.
78
+ Choose it before implementation, not separately for each framework. Use synthetic
79
+ data and environment-supplied secrets. Keep benchmark applications isolated from
80
+ production runtime source. Record permitted extension packages and versions;
81
+ extension functionality must not be presented as built into core.
82
+
83
+ Correctness is the first gate: report passed/total acceptance cases, incomplete
84
+ requirements and failures. Do not compare an incomplete application's apparent
85
+ code savings or throughput as if it delivered the same functionality.
86
+
87
+ ## Phase 2 — Reproducible harness and measurement
88
+
89
+ Capture exact prompts, model identifiers, agent/version, framework and extension
90
+ commits, lockfiles, documentation snapshots, harness version, runtime, OS, hardware,
91
+ database, tools and configuration. Record the initial workspace and available
92
+ instructions/tools. Fix time, turn and token budgets, stopping rules and permitted
93
+ human assistance before running; log interventions and failed or capped runs.
94
+
95
+ | Area | Measurements |
96
+ |---|---|
97
+ | Agent work | Input/output/cached/total tokens, elapsed time, turns, tool calls, shell commands, documentation searches, test/fix cycles, completion rate |
98
+ | Implementation | Total/source/configuration/JS/TS files, application LOC, configuration LOC, test LOC, direct/transitive dependencies, custom handlers and custom JavaScript |
99
+ | URLCode expression | Declarative routes, routes needing custom code, declarative versus imperative LOC, required extensions, JavaScript escape hatches, functionality manually duplicated despite an existing capability |
100
+ | Runtime | Startup time, idle memory, CPU, memory under load, requests/sec, p50/p95/p99 latency, response errors and timeouts |
101
+
102
+ Never estimate unavailable measurements: mark them unavailable and explain why.
103
+ Preserve provider usage fields and document whether cached tokens are included in
104
+ input totals so totals do not double-count them. Separate measured values from
105
+ derived calculations. Define LOC counting and exclusions in advance; separately
106
+ report configuration, tests, generated output, dependencies and copied templates.
107
+ Existing code-ratio metrics are not automatically declarative-coverage metrics.
108
+
109
+ For runtime comparisons hold hardware/resource limits, runtime, database, data,
110
+ concurrency, warm-up, duration and load generator constant. Specify startup start/
111
+ ready events and memory/CPU sampling. Record trust/sandbox mode, worker counts,
112
+ policies and extension overhead; compare equivalent behavior and disclose any
113
+ unavoidable differences. Do not disable correctness or security requirements to
114
+ improve scores. Reset data between trials and verify benchmark response semantics.
115
+
116
+ Predeclare repeated fresh-agent runs and repeated runtime trials, retain every
117
+ trial and report variability, sample counts and failures rather than selecting
118
+ best runs. Keep the load generator from becoming the bottleneck. Version changed
119
+ prompts, fixtures and counting rules so incompatible results are not pooled.
120
+
121
+ ## Phase 3 — Independent URLCode agents
122
+
123
+ Each run starts with a fresh context and isolated worktree/environment. Agents
124
+ must not see another agent's implementation, logs or findings. The coordinator
125
+ collects evidence after each run; shared prompts contain the neutral specification
126
+ and operational rules, not the hypothesis or a desired token/LOC outcome.
127
+
128
+ ### Protect the discovery baseline
129
+
130
+ This spike itself contains the instruction being tested. Do not expose it, its
131
+ index entry, benchmark prompts, prepared answers or prior findings to Agent A.
132
+ Use a pinned source/documentation snapshot preceding this spike, or a documented
133
+ filtered workspace with no access to excluded artifacts or repository history.
134
+ Apply the same underlying snapshot and access controls to the comparison runs,
135
+ with only the intended prompt treatment different. Record the exact manifest and
136
+ restrictions; if an agent reads excluded material, mark the run contaminated and
137
+ repeat it with a fresh agent rather than counting it as unprompted evidence.
138
+
139
+ Existing product documentation, skills and ordinary repository instructions are
140
+ part of what Agent A may discover; do not remove existing declarative guidance to
141
+ manufacture a worse baseline. Preserve the baseline before changing those sources.
142
+
143
+ ### Agent A — Unprompted discovery
144
+
145
+ Supply the application specification, URLCode source and existing documentation.
146
+ The framework-specific instruction is only:
147
+
148
+ > Build this application using URLCode following the framework's documented conventions and recommended practices.
149
+
150
+ Do not supply the declarative-first rule or curated hints about where to find it.
151
+ Record whether the agent independently finds and uses it, including evidence of
152
+ unnecessary JavaScript, duplicated capabilities, missed primitives, misunderstood
153
+ abstractions, repeated searches, incorrect assumptions, unclear errors and stalls.
154
+ Treat these as potential framework/documentation problems, not automatically as
155
+ agent failures.
156
+
157
+ ### Agent B — Explicitly URLCode-native
158
+
159
+ Run the identical application from scratch with a fresh independent agent. Add:
160
+
161
+ > Use URLCode's highest-level declarative features whenever possible. Generate custom JavaScript only when the framework cannot express the requirement.
162
+
163
+ > Before implementing functionality manually, determine whether URLCode already provides a declarative primitive, YAML configuration, built-in capability, extension, reusable template, or documented pattern.
164
+
165
+ Compare A and B on correctness, tokens, custom JavaScript, YAML, files, LOC,
166
+ implementation time, debugging cycles and documentation searches. A repeatable
167
+ advantage for B is evidence to investigate discoverability, not proof that every
168
+ individual mistake is a documentation defect.
169
+
170
+ ### Agent C — Gap finder
171
+
172
+ Use another fresh agent, independent of A/B implementations and findings during
173
+ its attempt. Give it the same requirements and this instruction:
174
+
175
+ > Attempt to implement every requirement using URLCode's intended abstractions. Whenever URLCode cannot express something cleanly, document the limitation rather than hiding it behind substantial custom code.
176
+
177
+ Classify findings as missing capability, documentation gap, AI discoverability
178
+ problem, confusing API/schema, poor error message, unnecessary boilerplate,
179
+ extension-system limitation, performance problem, possible framework bug or agent
180
+ misunderstanding. Record the attempted declaration, missing requirement, relevant
181
+ documentation and any necessary workaround. A requirement that cannot be expressed
182
+ stays visibly incomplete; substantial custom code must not hide the gap.
183
+
184
+ ## Phase 4 — Verify findings and prepare/file GitHub issues
185
+
186
+ After independent attempts are preserved, reproduce each candidate problem against
187
+ the pinned revision, inspect the supported contract and search existing issues and
188
+ PRs. Distinguish missing functionality from functionality the agent failed to find.
189
+ Do not file an issue merely because one agent made a mistake. Note corroborating
190
+ encounters by multiple fresh agents, while avoiding unsupported causal claims.
191
+
192
+ For each verified, actionable issue include:
193
+
194
+ - Problem and benchmark scenario, affected repository/revision and environment.
195
+ - Expected versus actual behavior and minimal synthetic reproduction.
196
+ - Relevant YAML/code, commands, errors and links to run evidence.
197
+ - Classification, proposed improvement and impact on human developers and agents.
198
+ - Acceptance criteria and related/duplicate issue links.
199
+
200
+ Use the owning repository's issue template and the ownership map in
201
+ [AGENTS.md](../AGENTS.md): core/runtime issues belong here, public documentation
202
+ in `urlcode-docs`, and extension defects in the corresponding extension repository.
203
+ Update existing issues with new evidence rather than duplicating them. Track
204
+ prepared, filed, duplicate and unverified dispositions in the findings report;
205
+ file verified issues and retain unresolved hypotheses as explicitly unverified
206
+ observations. Follow [SECURITY.md](../SECURITY.md) for private vulnerability reports.
207
+
208
+ ## Phase 5 — Audit AI discoverability
209
+
210
+ Audit README, documentation, examples, schemas, CLI help, package metadata,
211
+ `llms.txt`, agent instructions/skills, scaffolding and errors. Determine whether an
212
+ unfamiliar agent can find the framework's purpose, declarative-first philosophy,
213
+ YAML capabilities, built-in primitives, extensions, authentication, database access,
214
+ validation, errors, custom functionality, testing and debugging guidance.
215
+
216
+ Specifically search for guidance equivalent to the canonical rule above; record
217
+ exact locations, prominence and the navigation/search path used to discover it.
218
+ Do not assume it is absent just because the exact sentence is missing. Check the
219
+ current contract when documents and historical benchmark assumptions differ.
220
+
221
+ Preserve Agent A's baseline before editing guidance. Then propose the smallest
222
+ authoritative set of changes that makes the principle clear to people and agents,
223
+ including when custom JavaScript is appropriate. Public authoring guidance belongs
224
+ in `urlcode-docs`; contributor records and spikes remain here. Do not copy the rule
225
+ everywhere or expose the experimental prompt as product guidance by accident.
226
+
227
+ ## Phase 6 — Fastify comparison
228
+
229
+ Once the URLCode methodology works, give a fresh independent agent the same frozen
230
+ specification, budgets, tool access and acceptance criteria, using:
231
+
232
+ > Build this application using Fastify following the framework's documented conventions and recommended practices.
233
+
234
+ Do not mention URLCode or expose its implementations/findings. Use Fastify
235
+ idiomatically; do not force it to imitate URLCode's architecture. Compare correctness,
236
+ agent work, files/LOC/dependencies, configuration, debugging/searches and runtime
237
+ measurements separately. Document framework-specific dependencies and setup work.
238
+ Later candidates include Hono, Express, NestJS and Elysia; they are not prerequisites
239
+ for the first comparison.
240
+
241
+ ## Phase 7 — Findings and deliverables
242
+
243
+ Publish the contributor findings in `docs/benchmarks/AI_FRAMEWORK_BENCHMARK.md` when
244
+ runs exist. Keep implementation and raw evidence paths versioned and linked from
245
+ that report; do not create a results document implying measurements already exist.
246
+ Deliver:
247
+
248
+ 1. Dated benchmark research and reuse decision.
249
+ 2. Frozen application specification and shared acceptance suite.
250
+ 3. Reproducible harness, commands and independent agent prompts.
251
+ 4. URLCode A/B/C and Fastify implementations or explicit incomplete outcomes.
252
+ 5. Raw agent logs/usage, implementation counts and runtime trial data.
253
+ 6. Methodology, provenance, comparison tables, uncertainty and evidence limitations.
254
+ 7. Agent behavior/search/failure analysis and classified framework/discovery gaps.
255
+ 8. Verified issue ledger, proposed/filed issue links and prioritized improvements.
256
+ 9. Before/after findings following the fresh-agent regression phase.
257
+
258
+ Remove secrets from published logs while retaining measurement provenance. Keep
259
+ stub/harness validation records distinct from real-agent evidence. Report every
260
+ failed attempt, not just successful applications, and avoid subjective scores or
261
+ claims beyond the measured cases.
262
+
263
+ ## Phases 8–9 — Improve and rerun with fresh agents
264
+
265
+ Prioritize demonstrated friction: missing declarative primitives, defaults, YAML,
266
+ schemas, errors, examples, extension discovery, README/AI documentation, CLI and
267
+ scaffolding. Make legitimate application-development improvements, not special
268
+ cases that game the benchmark. Track each change to its verified issue/evidence.
269
+
270
+ After improvements, rerun with entirely fresh agents and isolated environments.
271
+ The new discovery agent must again receive no explicit declarative-first rule or
272
+ prior findings; it may discover the improved ordinary documentation naturally.
273
+ Keep this spike and benchmark answers excluded. Repeat B, C and the comparison
274
+ where needed to distinguish framework changes from model/harness drift. Hold model,
275
+ budgets, requirements and runtime conditions fixed where possible; disclose changes
276
+ and do not attribute their effects solely to URLCode.
277
+
278
+ Compare before/after correctness, tokens, elapsed time, generated JavaScript, YAML,
279
+ LOC, files, dependencies, tool calls, searches, failed attempts, test/fix cycles and
280
+ runtime performance. Keep dimensions separate and preserve the original baseline.
281
+
282
+ The repeatable loop is: independent agent encounters friction → evidence captures
283
+ it → verified issue → URLCode improvement → fresh-agent rerun → measured outcome.
284
+ Use it for significant releases to detect regressions in AI usability, declarative
285
+ coverage, documentation, capability and runtime performance. Completion means
286
+ reproducible evidence and an actionable issue/improvement trail, not a claim that
287
+ URLCode won the comparison.